Node.js中exports與module.exports區(qū)別
在 Node.js 中,exports 和 module.exports 都是用于模塊導(dǎo)出的對(duì)象,但它們?cè)谝藐P(guān)系和使用場(chǎng)景上有重要區(qū)別:
核心區(qū)別總結(jié)
特性 exports module.exports
本質(zhì) module.exports 的引用 模塊最終導(dǎo)出的真實(shí)對(duì)象
初始化關(guān)系 exports = module.exports (初始指向同一對(duì)象) 模塊實(shí)際導(dǎo)出的對(duì)象
直接賦值后果 斷開引用(導(dǎo)出失效) 正確覆蓋導(dǎo)出內(nèi)容
適用場(chǎng)景 添加多個(gè)屬性/方法 導(dǎo)出任意類型(函數(shù)/類/對(duì)象等)
詳細(xì)解釋
初始關(guān)系
Node.js 在編譯模塊時(shí)會(huì)隱式執(zhí)行:
var module = { exports: {} }; // 真實(shí)導(dǎo)出對(duì)象 var exports = module.exports; // 初始指向同一內(nèi)存地址
此時(shí) exports 是 module.exports 的快捷引用,兩者指向同一個(gè)空對(duì)象 {}。
正確用法
? 添加屬性(兩者等效)
// 方式一:使用 exports
exports.name = 'Alice'; exports.sayHi = () => 'Hello!';
// 方式二:使用 module.exports
module.exports.name = 'Bob'; module.exports.sayHi = () => 'Hi!';
?? 此時(shí) exports 和 module.exports 仍指向同一對(duì)象,導(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';
錯(cuò)誤用法
? 直接給 exports 賦值(引用斷裂)
exports = { name: 'Charlie' }; // 錯(cuò)誤!斷開與 module.exports 的鏈接
此時(shí) exports 指向新對(duì)象,但模塊實(shí)際導(dǎo)出的是原始的 module.exports(仍是空對(duì)象 {})。
?? 關(guān)鍵注意事項(xiàng)
最終導(dǎo)出的是 module.exports
無(wú)論操作 exports 還是 module.exports,模塊最終返回的是 module.exports 的值。
賦值優(yōu)先級(jí)
若同時(shí)操作兩者,最后執(zhí)行的賦值決定導(dǎo)出結(jié)果:
exports.a = 1; // 無(wú)效:被下一行覆蓋 module.exports = { b: 2 }; // 最終導(dǎo)出 { b: 2 }
?? 最佳實(shí)踐建議
場(chǎng)景 推薦方式
導(dǎo)出多個(gè)屬性/方法 exports.xxx = …
導(dǎo)出單一功能(函數(shù)/類/對(duì)象) module.exports = …
避免混淆 統(tǒng)一使用 module.exports
?? 代碼示例
正確導(dǎo)出函數(shù)
// ? 正確 module.exports = () => console.log('Imported!'); // ? 錯(cuò)誤(exports 無(wú)法導(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)出對(duì)象。
永遠(yuǎn)不要直接賦值 exports(exports = …)。
當(dāng)需要導(dǎo)出非對(duì)象類型(函數(shù)、字符串等)時(shí),必須使用 module.exports。
不確定時(shí),統(tǒng)一使用 module.exports 可避免意外錯(cuò)誤。
理解兩者引用關(guān)系的本質(zhì),能有效避免模塊導(dǎo)出時(shí)的常見陷阱!
- exports返回的是模塊函數(shù)
- module.exports返回的是 模塊對(duì)象本身
到此這篇關(guān)于Node.js中exports與module.exports區(qū)別的文章就介紹到這了,更多相關(guān)Node.js exports module.exports內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
NodeJS感知和控制自身進(jìn)程的運(yùn)行環(huán)境和狀態(tài)
NodeJS可以感知和控制自身進(jìn)程的運(yùn)行環(huán)境和狀態(tài),也可以創(chuàng)建子進(jìn)程并與其協(xié)同工作,這使得NodeJS可以把多個(gè)程序組合在一起共同完成某項(xiàng)工作,并在其中充當(dāng)膠水和調(diào)度器的作用,和進(jìn)程管理相關(guān)的API單獨(dú)介紹起來(lái)比較枯燥,這里從一些典型的應(yīng)用場(chǎng)景出發(fā)2024-01-01koa2 用戶注冊(cè)、登錄校驗(yàn)與加鹽加密的實(shí)現(xiàn)方法
這篇文章主要介紹了koa2 用戶注冊(cè)、登錄校驗(yàn)與加鹽加密的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07nodejs連接mysql數(shù)據(jù)庫(kù)及基本知識(shí)點(diǎn)詳解
這篇文章主要介紹了nodejs連接mysql數(shù)據(jù)庫(kù),結(jié)合實(shí)例形式總結(jié)分析了nodejs連接與操作mysql數(shù)據(jù)庫(kù)的相關(guān)模板、配置及mysql數(shù)據(jù)庫(kù)查詢、添加數(shù)據(jù)等操作技巧,需要的朋友可以參考下2018-03-03vscode安裝教程以及配置node.js環(huán)境全過(guò)程
這篇文章主要給大家介紹了關(guān)于vscode安裝教程以及配置node.js環(huán)境的相關(guān)資料,VSCode是一款由微軟開發(fā)的輕量級(jí)編輯器,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10詳解使用Nodejs內(nèi)置加密模塊實(shí)現(xiàn)對(duì)等加密與解密
這篇文章主要介紹了使用Nodejs內(nèi)置加密模塊實(shí)現(xiàn)對(duì)等加密與解密,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05解決npm?install版本不匹配問(wèn)題:?npm?ERR!?code?ETARGET?npm?ERR!?
這篇文章主要介紹了如何解決npm?install版本不匹配問(wèn)題:?npm?ERR!?code?ETARGET?npm?ERR!?notarget?No?matching?version?found?for,文中給出了詳細(xì)的解決方法,需要的朋友可以參考下2024-02-02node.js中的buffer.Buffer.isEncoding方法使用說(shuō)明
這篇文章主要介紹了node.js中的buffer.Buffer.isEncoding方法使用說(shuō)明,本文介紹了buffer.Buffer.isEncoding的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12