JavaScript爬坑之:module.exports与exports的区别

由于node对es6的import支持还不完美,还得研究下es5的模块导出机制。
其实require/exports是野生的规范,是社区拟定的规则,被CommonJS,AMD.CMD支持。CommonJS是主流。

但是我们会使用到module.exports与exports两种导出模块的方法,它们之间的区别呢?

基础知识

每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {}

module.exports = {};

require是值的拷贝,不是值引用,所以不用担心异步导致的数据污染。

区别

主要有3点:

  1. module.exports 初始值为一个空对象 {}
  2. require() 返回的是 module.exports 而不是 exports
  3. 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建立联系

你可能感兴趣的:(JavaScript爬坑之:module.exports与exports的区别)