exports vs module.exports
nodejs导出模块方式差异
刚开始学nodejs时看到有的人用exports有的人用module.exports。
我以为是习惯问题,就像定义函数有的人喜欢用funtion f() {} 有的人用 var f = function (){}一样(后来发现这两种定义函数方式也是有区别的。。。区别)
后来在cnode上看到有篇文章,发现一般还是不会有完全一样的写法的。
根据nodejs文档,modules是一种简写,在模块加载前被赋予了module.exports的值
The exports variable is available within a module’s file-level scope, and is
assigned the value of module.exports before the module is evaluated.
官网给了一段解释require原理的代码
1 |
|
可以看到require得到的永远是module.exports的值,模块内的exports是指向module.exports的引用(一开始是个空对象),对exports修改最终还是会影响到module.exports的值,所以可以使用exports简写。
但是如果对exports重新赋值,exports就会指向一块新分配的内存空间,而不再指向module.exports,这通常不是我们想要的,这样可能导出的对象还是空的,因为module.exports还是一个空对象。
可以测试下require到的到底是exports还是module.exports
1 | module.exports = { |
1 | let a = require("./export") |
node import.js 查看输出
1 | module.exports: { name: 'julien' } |
此时exports还是一个空对象,而我们是可以require这个模块的。
恩,反正坚持用module.exports就好了。。。