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