require
方法的源碼,終於搞清楚exports和module.exports的區別了。咱們知道,node.js的模塊暴露有兩種方法。node
exports
//a.js exports.log =function (str) { console.log(str); }
//b.js var s = require("./a"); s.log("哈哈哈哈");
module.exports
//a.js module.exports = function (str) { console.log(str); } //b.js var s = require("./a"); s("嘻嘻嘻嘻");
//a.js exports = function (str) { console.log(str); } //b.js var s = require("./a"); s("哈哈哈哈");
exports
和module.exports
的初始值指向的是空對象,即{}
。從源碼能夠看到,其實模塊的require
方法實質上是調用了_load
方法,而_load
方法,最終返回的是module.exports
exports
和module.exports
都指向同一個對象。{}
添加屬性,又由於module.exports
也是指向這個對象的,因此最終require
方法返回的module.exports
是指向了這個具備log
方法的對象的,能夠引用到模塊。module.exports
指向一片新的內存空間,exports
指向的仍然是{}
,可是因爲require
方法返回的是module.exports
,因此最終也能引入模塊。exports
指向一片新的內存空間,module.exports
指向的仍然仍是{}
,那麼最終require
方法是將module.exports
返回,因此會致使報錯,說s不是一個function。請牢記:
require
方法返回的是module.exports
!ui