nodejs 中 module.exports 和 exports 的區別


1. module應該是require方法中,上下文中的對象

2. exports對象應該是上下文中引用module.exports的新對象

3. exports.a = xxx 會將修改更新到module.exports對象中

4. exports = xxx 直接改變了 exports的指向,

 

module.js的474行代碼:

module._compile(stripBOM(content), filename);

 

module.js的437行代碼:

var wrapper = Module.wrap(content);

再往下跟:

進入node.js文件的879行:

return NativeModule.wrapper[0] + script + NativeModule.wrapper[1];

wrapper[0]是字符串:"(function (exports, require, module, __filename, __dirname) { "

wrapper[1]是字符串:" });"

 

看到經過wrap這一步,整個自己寫的index.js被包裝成了一個function,而exports, require, module等等,其實都是外部傳進來的對象而已

在index.js中自然可以使用

而且在module.js的439行:

var compiledWrapper = runInThisContext(wrapper, filename, true);

可見通過runInThisContext方法,將上述wrapper代碼按照filename的路徑生成了一個新的匿名function文件(index.js)

 

繼續調試到達module.js的456行:

var args = [self.exports, require, self, filename, dirname];
return compiledWrapper.apply(self.exports, args);

我們的匿名 function : index.js終於被調用!

args對應匿名function參數:exports, require, module, __filename, __dirname

 

 

 可以參考的文章:

http://stackoverflow.com/questions/7137397/module-exports-vs-exports-in-nodejs/7142924#7142924

http://cnodejs.org/topic/4f7523168a04d82a3d4446df

http://cnodejs.org/topic/52308842101e574521c16e06

 

 


免責聲明!

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



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