一开始,exports和module.exports都指向空对象(同一内存块),exports是引用 module.exports的值。module.exports 被改变的时候,exports不会被改变,而模块导出的时候,真正导出的执行是module.exports,而不是exports
/*app.js*/ var s = require("./log"); s.log("hello");
//log.js exports.log =function (str) { console.log(str); }
//log.js module.exports =function (str) { console.log(str); }
上述两种用法都没问题,但如果这样使用
exports = function (str) { console.log(str); }
前面的例子只是给 exports指向的对象添加属性,只是对 exports 指向的内存做了修改,内存指向并未发生改变。而上例则是对exports指向的内存进行了覆盖,使exports指向了一块新的内存,这样,exports和module.exports指向的内存并不是同一块,exports和module.exports并无任何关系。exports指向的内存有了变化,而module.exports指向的内存并无变化,仍为空对象{}。
//app.js var x = require('./init'); console.log(x.a)
//init.js module.exports = {a: 2}//通过赋值的方式指向了另一块内存 exports.a = 1 //只是在原来指向的内存中添加属性,内存指向并没有变化
运行app.js会有输出
2
这也就是module.exports对象不为空的时候exports对象就自动忽略,因为module.exports通过赋值方式已经和exports对象指向的变量不同了,exports对象怎么改和module.exports对象没关系了。(真正导出的执行是module.exports)