由于node對es6的import支持還不完美诺苹,還得研究下es5的模塊導(dǎo)出機(jī)制柜砾。
其實(shí)require/exports是野生的規(guī)范驾中,是社區(qū)擬定的規(guī)則疼电,被CommonJS,AMD.CMD支持玲躯。CommonJS是主流据德。
但是我們會使用到module.exports與exports兩種導(dǎo)出模塊的方法,它們之間的區(qū)別呢跷车?
基礎(chǔ)知識
每一個(gè)node.js執(zhí)行文件棘利,都自動(dòng)創(chuàng)建一個(gè)module對象,同時(shí)朽缴,module對象會創(chuàng)建一個(gè)叫exports的屬性善玫,初始化的值是 {}
module.exports = {};
require是值的拷貝,不是值引用密强,所以不用擔(dān)心異步導(dǎo)致的數(shù)據(jù)污染茅郎。
區(qū)別
主要有3點(diǎn):
- module.exports 初始值為一個(gè)空對象 {}
- require() 返回的是 module.exports 而不是 exports
- exports 是指向的 module.exports 的值的引用。
前兩條很好理解或渤,第三條只洒,意思是:
- 如果exports = newObject,那么exports斷開了與module.exports的引用,兩者就不再指向一個(gè)內(nèi)存劳坑。
地址了毕谴。所有才有了如下的寫法:
exports = module.exports = somethings
等價(jià)于
module.exports = somethings
exports = module.exports
通過 exports = module.exports 讓 exports 重新指向 module.exports .
- 如果 module.exports = newObject,exports跟module.exports不再指向同一個(gè)值(或者叫內(nèi)存地址),那么exports就失效了。
總結(jié):
如果不使用module.exports,僅使用exports距芬,那么exports只能到處屬性涝开,不能重新賦值對象。建議使用exports.x
等寫法框仔。
如果使用了module.exports = newObject舀武,那么這時(shí)候exports就失效了,必須使用exports = module.exports = newObject
建立聯(lián)系