NodeJs:module.exports 和 exports 解惑


背景

NodeJs引入了模塊化機制,只有顯式聲明為導出的對象才會被外部訪問到,導出語法有兩種:module.exports 和 exports,這兩種到底有何區別呢?這是我今天試驗的目的。

試驗

材料

module1.js

 1 this.hi = function () {
 2     console.log('hi in module1');
 3 };
 4 
 5 exports.say = function () {
 6     console.log('haha in module1');
 7 };
 8 
 9 module.exports.hello = function () {
10     console.log('hello in module1');
11 };

module2.js

 1 module.exports.say = function() {    
 2     console.log('haha in module2');
 3 };              
 4     
 5 module.exports.hi = function() {    
 6     console.log('hi in module2');
 7 };
 8 
 9 module.exports.hello = function () {
10     console.log('hello in module2');
11 };

module3.js

 1 console.log('exports == module.exports?,' + (exports == module.exports));
 2 console.log('this == module.exports?,' + (this == module.exports));
 3 
 4 this.hi = function () {
 5     console.log('hi in module3');
 6 };
 7 
 8 exports.say = function () {
 9     console.log('haha in module3');
10 };
11 
12 module.exports = {};
13 
14 console.log('exports == module.exports?,' + (exports == module.exports));
15 console.log('this == module.exports?,' + (this == module.exports));
16 
17 module.exports.hello = function () {
18     console.log('hello in module3');
19 };

exports_test.js

 1 var module1 = require('./module1.js');
 2 module1.hi();
 3 module1.say();
 4 module1.hello();
 5 
 6 console.log('\n');
 7 
 8 var module2 = require('./module2.js');
 9 module2.hi();
10 module2.say();
11 module2.hello();
12 
13 console.log('\n');
14 
15 var module3 = require('./module3.js');
16 console.log('module3.hi === undefined?,' + (module3.hi === undefined));
17 console.log('module3.say === undefined?,' + (module3.say === undefined));
18 module3.hello();

輸出

 1 hi in module1
 2 haha in module1
 3 hello in module1
 4 
 5 
 6 hi in module2
 7 haha in module2
 8 hello in module2
 9 
10 
11 exports == module.exports?,true
12 this == module.exports?,true
13 exports == module.exports?,false
14 this == module.exports?,false
15 module3.hi === undefined?,true
16 module3.say === undefined?,true
17 hello in module3

結論

    1. exports默認和module.exports指向同一個空對象。
    2. 最終導出的對象是module.exports指向的對象。
    3. 由1和2可以推論出,如果運行時讓exports、this和module.exports指向不同的對象,只有module.exports指向的對象才回被導出。
    4. 由1和2可以推論出,用exports只能導出對象,用module.exports可以導出任何類型。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM