由于node对es6的import支持还不完美,还得研究下es5的模块导出机制。
其实require/exports是野生的规范,是社区拟定的规则,被CommonJS,AMD.CMD支持。CommonJS是主流。
但是我们会使用到module.exports与exports两种导出模块的方法,它们之间的区别呢?
基础知识
每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {}
module.exports = {};
require是值的拷贝,不是值引用,所以不用担心异步导致的数据污染。
区别
主要有3点:
- module.exports 初始值为一个空对象 {}
- require() 返回的是 module.exports 而不是 exports
- exports 是指向的 module.exports 的值的引用。
前两条很好理解,第三条,意思是:
- 如果exports = newObject,那么exports断开了与module.exports的引用,两者就不再指向一个内存。
地址了。所有才有了如下的写法:
exports = module.exports = somethings
等价于
module.exports = somethings
exports = module.exports
通过 exports = module.exports 让 exports 重新指向 module.exports .
- 如果 module.exports = newObject,exports跟module.exports不再指向同一个值(或者叫内存地址),那么exports就失效了。
总结:
如果不使用module.exports,仅使用exports,那么exports只能到处属性,不能重新赋值对象。建议使用exports.x
等写法。
如果使用了module.exports = newObject,那么这时候exports就失效了,必须使用exports = module.exports = newObject
建立联系