ode中有兩個概念exports和module.exports很讓人迷惑,霧里看花一般的捉摸不透,本文結(jié)合測試來告訴你二者的潛規(guī)則.....
我們知道CommonJS規(guī)定,每個模塊內(nèi)部都有個module變量代表它,而module變量有個exports屬性。為了方便,Node為每個模塊提供了一個exports變量指向module.exports。
記住exoprts和module.exports二者潛規(guī)則如下:
加載的模塊返回的總是module.exports;
二者默認(rèn)的指向同一個object對象引用,建立關(guān)聯(lián)關(guān)系;
一旦二者不通過屬性向此object添加擴(kuò)展,關(guān)聯(lián)關(guān)系就會斷開,各自有獨(dú)立的內(nèi)存空間;
為了后續(xù)測試的順利,我準(zhǔn)備了兩個文件:
├── app.js //啟動入口├── base-module.js //模塊
app.js用作程序啟動的入口,內(nèi)容如下
// ./app.jsvar base=require('./base-module');console.log(base.name);
base-module.js用于模塊定義,后面的代碼都在此文件中編寫。
先來看看正常的情況:在base-module.js中編碼如下
exports.name='zqf-blog';
module.exports.name='zqf-blog';
執(zhí)行 node app.js 即可以看到輸出 zqf-blog。也能看到exports和module.exports
// ./base-module.jsmodule.exports={};exports.name='zqf-blog';
兩條語句順序無關(guān),執(zhí)行都輸出 undefined,不能理解為module.exports指向一個對象,而exports.name就可以向這個對象添加name屬性!其實(shí)二者已經(jīng)斷開了關(guān)系,各自有獨(dú)立的內(nèi)控空間。
// ./base-module.jsexports={};exports.name='zqf-blog';
執(zhí)行輸出 undefined,當(dāng)給exports賦時,二者已經(jīng)斷開了關(guān)系,各自有獨(dú)立的內(nèi)控空間,他們的值和上例同樣
// ./base-module.jsexports={};exports.name="exportName"module.exports.name="zqf-blog";
執(zhí)行輸出 zqf-blog,exports.name和module.exports.name不同,返回的是后者
// ./base-module.jsmodule.exports = '';module.exports.name = 'zqf-blog';exports.name = 'exportName';
實(shí)際上輸出undefined,因為module.exports不再是對象,不具有name屬性
不管千變?nèi)f化,只要記住上面的三條潛規(guī)則,就不再會搞錯了,你就真的懂得如何使用exports和module.exports了,如果你還不懂,那就只記得第一條吧,這樣任何時候你都使用module.exports就不會錯。
不管博客還是微信公眾號,寫的都是種情懷...
如果你從中能夠獲得啟發(fā),請把它分享出去,非常感謝...
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。