在學(xué)習(xí)Node.js
時(shí)敛苇,經(jīng)常能看到兩種導(dǎo)出模塊的方式:module.exports
和exports
雀久。
穿插一個(gè)必備小知識(shí):在文件
a.js
中用exports
或module.exports
導(dǎo)出的對(duì)象(方法冰啃、變量)端礼,可以在另一個(gè)文件b.js
中通過(guò)require('./a')
引用。
module
和exports
是Node.js
給每個(gè)js文件內(nèi)置的兩個(gè)對(duì)象株茶。可以通過(guò)console.log(module)
和console.log(exports)
打印出來(lái)图焰。如果你在main.js
中寫入下面兩行启盛,然后運(yùn)行$ node main.js
:
console.log(exports);//輸出:{}
console.log(module);//輸出:Module {..., exports: {}, ...} (注:...代表省略了其他一些屬性)
從打印我們可以看出,module.exports
和exports
一開(kāi)始都是一個(gè)空對(duì)象{}
,實(shí)際上僵闯,這兩個(gè)對(duì)象指向同一塊內(nèi)存卧抗。這也就是說(shuō)module.exports
和exports
是等價(jià)的(有個(gè)前提:不去改變它們指向的內(nèi)存地址)。
例如:exports.age = 18
和module.export.age = 18
鳖粟,這兩種寫法是一致的(都相當(dāng)于給最初的空對(duì)象{}
添加了一個(gè)屬性社裆,通過(guò)require
得到的就是{age: 18}
)。
但是
require
引入的對(duì)象本質(zhì)上是module.exports
向图。這就產(chǎn)生了一個(gè)問(wèn)題泳秀,當(dāng) module.exports
和exports
指向的不是同一塊內(nèi)存時(shí),exports
的內(nèi)容就會(huì)失效榄攀。
例如:
module.exports = {name: '螢火蟲(chóng)叔叔'}嗜傅;
exports = {name: '螢火蟲(chóng)老阿姨'}
此時(shí)module.exports
指向了一塊新的內(nèi)存(該內(nèi)存的內(nèi)容為{name: '螢火蟲(chóng)叔叔'}
),exports
指向了另一塊新的內(nèi)存(該內(nèi)存的內(nèi)容為{name: '螢火蟲(chóng)老阿姨'}
)檩赢。require
得到的是{name: '螢火蟲(chóng)叔叔'}
吕嘀。
附上代碼(在main.js中引入people.js):
//people.js
module.exports = {name: '螢火蟲(chóng)叔叔'};
exports = {name: '螢火蟲(chóng)老阿姨'};
//main.js
let people = require('./people');
console.log(people);//輸出:{name: '螢火蟲(chóng)叔叔'}
歡迎加我微信贞瞒,拉進(jìn)群交流哦偶房!