Node.js中exports與module.exports區(qū)別
在 Node.js 中,exports 和 module.exports 都是用于模塊導(dǎo)出的對象,但它們在引用關(guān)系和使用場景上有重要區(qū)別:
核心區(qū)別總結(jié)
特性 exports module.exports
本質(zhì) module.exports 的引用 模塊最終導(dǎo)出的真實對象
初始化關(guān)系 exports = module.exports (初始指向同一對象) 模塊實際導(dǎo)出的對象
直接賦值后果 斷開引用(導(dǎo)出失效) 正確覆蓋導(dǎo)出內(nèi)容
適用場景 添加多個屬性/方法 導(dǎo)出任意類型(函數(shù)/類/對象等)
詳細解釋
初始關(guān)系
Node.js 在編譯模塊時會隱式執(zhí)行:
var module = { exports: {} }; // 真實導(dǎo)出對象
var exports = module.exports; // 初始指向同一內(nèi)存地址
此時 exports 是 module.exports 的快捷引用,兩者指向同一個空對象 {}。
正確用法
? 添加屬性(兩者等效)
// 方式一:使用 exports
exports.name = 'Alice'; exports.sayHi = () => 'Hello!';
// 方式二:使用 module.exports
module.exports.name = 'Bob'; module.exports.sayHi = () => 'Hi!';
?? 此時 exports 和 module.exports 仍指向同一對象,導(dǎo)出內(nèi)容相同。
? 導(dǎo)出特殊類型(必須用 module.exports)
// 導(dǎo)出構(gòu)造函數(shù)
module.exports = class Person { ... };
// 導(dǎo)出函數(shù)
module.exports = function() { ... };
// 導(dǎo)出原始值
module.exports = 'Hello World';
錯誤用法
? 直接給 exports 賦值(引用斷裂)
exports = { name: 'Charlie' }; // 錯誤!斷開與 module.exports 的鏈接
此時 exports 指向新對象,但模塊實際導(dǎo)出的是原始的 module.exports(仍是空對象 {})。
?? 關(guān)鍵注意事項
最終導(dǎo)出的是 module.exports
無論操作 exports 還是 module.exports,模塊最終返回的是 module.exports 的值。
賦值優(yōu)先級
若同時操作兩者,最后執(zhí)行的賦值決定導(dǎo)出結(jié)果:
exports.a = 1; // 無效:被下一行覆蓋
module.exports = { b: 2 }; // 最終導(dǎo)出 { b: 2 }
?? 最佳實踐建議
場景 推薦方式
導(dǎo)出多個屬性/方法 exports.xxx = …
導(dǎo)出單一功能(函數(shù)/類/對象) module.exports = …
避免混淆 統(tǒng)一使用 module.exports
?? 代碼示例
正確導(dǎo)出函數(shù)
// ? 正確
module.exports = () => console.log('Imported!');
// ? 錯誤(exports 無法導(dǎo)出函數(shù))
exports = () => console.log('This will fail!');
混合使用案例
exports.name = 'Alice'; // 有效:添加屬性
module.exports.age = 30; // 有效:添加屬性
// 最終導(dǎo)出 { name: 'Alice', age: 30 }
exports.name = 'Bob';
module.exports = { age: 25 }; // 覆蓋之前的所有導(dǎo)出
// 最終導(dǎo)出 { age: 25 } (name 被丟棄)
?? 總結(jié)
使用 exports 添加屬性,用 module.exports 覆蓋導(dǎo)出對象。
永遠不要直接賦值 exports(exports = …)。
當(dāng)需要導(dǎo)出非對象類型(函數(shù)、字符串等)時,必須使用 module.exports。
不確定時,統(tǒng)一使用 module.exports 可避免意外錯誤。
理解兩者引用關(guān)系的本質(zhì),能有效避免模塊導(dǎo)出時的常見陷阱!
- exports返回的是模塊函數(shù)
- module.exports返回的是 模塊對象本身
到此這篇關(guān)于Node.js中exports與module.exports區(qū)別的文章就介紹到這了,更多相關(guān)Node.js exports module.exports內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
NodeJS?Express使用ORM模型訪問關(guān)系型數(shù)據(jù)庫流程詳解
這篇文章主要介紹了NodeJS?Express使用ORM模型訪問關(guān)系型數(shù)據(jù)庫流程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
nodejs實現(xiàn)HTTPS發(fā)起POST請求
這篇文章主要介紹了nodejs實現(xiàn)HTTPS發(fā)起POST請求的實例代碼,非常的簡單實用,有需要的小伙伴可以參考下。2015-04-04
npm?install安裝失敗報錯:The?operation?was?rejected?by?your?
這篇文章主要給大家介紹了關(guān)于npm?install安裝失敗報錯:The?operation?was?rejected?by?your?operating?system的相關(guān)資料,文中給出了多種解決方法供大家參考學(xué)習(xí),需要的朋友可以參考下2023-04-04
Node.js靜態(tài)服務(wù)器的實現(xiàn)方法
這篇文章主要介紹了Node.js靜態(tài)服務(wù)器的實現(xiàn)方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-02-02
Nodejs 中的 Buffer 類的創(chuàng)建與基本使用
這篇文章主要為大家介紹了Nodejs中Buffer的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
nodejs一個簡單的文件服務(wù)器的創(chuàng)建方法
這篇文章主要介紹了nodejs一個簡單的文件服務(wù)器的創(chuàng)建方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

