兩種模塊到處方式
-
exports.xxx = ...
-
module.exports = ...
1. exports.xxx = ...
-
exports
是module.exports
的一個引用(快捷方式)。 -
當你寫
exports.foo = function() {}
,實際上就是給module.exports
對象添加了一個foo
屬性。 -
這種方式適合導出多個屬性或方法,類似給模塊導出一個對象,里面包含多個鍵值對。
// example.js
exports.sayHello = () => {console.log('Hello');
};
exports.value = 123;
使用時:
const example = require('./example');
example.sayHello(); // Hello
console.log(example.value); // 123
2. module.exports = ...
-
module.exports
是最終模塊的導出對象,Node.js 會返回它給require
調用方。 -
你可以直接把它賦值為任意值(對象、函數、類等),覆蓋默認的空對象。
-
當你需要導出一個整體,比如一個函數或者一個類,通常用這種方式。
// example2.js
module.exports = function() {console.log('I am a function');
};
使用時:
const example2 = require('./example2');
example2(); // I am a function
關鍵區別點
方面 | exports.xxx = ... | module.exports = ... |
---|---|---|
導出內容 | 給導出對象添加屬性,保持默認對象結構 | 直接替換導出對象 |
使用場景 | 導出多個方法/屬性組成的對象 | 導出單個函數、類或自定義對象 |
賦值操作影響 | 修改 exports 的屬性,不影響引用 | 直接賦值替換 module.exports |
注意事項 | 不能直接給 exports 賦值,否則斷開引用 | 賦值給 module.exports 是推薦方式 |
常見錯誤示范
// 錯誤寫法 - 斷開 exports 與 module.exports 引用
exports = function() {console.log('hello');
};
// 這樣 require 時拿到的其實是 module.exports 的默認空對象 {}
總結
-
exports
是module.exports
的快捷方式,不要直接給exports
重新賦值。 -
推薦直接用
module.exports = xxx
,尤其是導出單一對象、函數或類時。 -
用
exports.xxx = ...
來給導出對象添加多個屬性和方法。
需要我幫你寫幾個例子來演示,或者幫你講解它們內部的引用機制嗎?
二、推薦統一只使用一個用法,例如module.exports
module.exports
是 Node.js 模塊導出的根本對象,直接操作它可以讓代碼更清晰和一致。
確實,推薦大家**統一使用 module.exports
**來導出模塊內容,這樣:
-
只需記住一種導出方式,避免混淆
-
可以隨時導出整個對象、函數或類
-
避免誤用
exports
斷開引用導致導出失效的問題
比如你可以直接這樣寫:
module.exports = {foo: () => { console.log('foo'); },bar: 123,
};
或者導出單個函數:
module.exports = function() {console.log('hello');
};
這樣更直觀,也避免了用 exports
時容易犯的坑。
總結:
統一使用 module.exports
,簡單明了,避免不必要的坑,推薦!
三、module.exports本質是一個對象
1. module.exports
本質是一個對象
在 Node.js 中,module.exports
默認是一個空對象 {}
,你可以像操作普通對象那樣給它添加屬性(鍵值對):
module.exports.foo = () => console.log('foo');
module.exports.bar = 123;
這就是“直接把鍵寫上去”的意思:給 module.exports
對象上直接賦屬性。
使用時:
const myModule = require('./myModule');
myModule.foo(); // 輸出 'foo'
console.log(myModule.bar); // 輸出 123
2. 也可以直接整體賦值(替換)
你也可以直接給 module.exports
賦一個新對象(或者函數、類),而不是在它上面添加屬性:
module.exports = {foo: () => console.log('foo'),bar: 123,
};
這樣寫和上面效果是一樣的,但一次性把導出內容整體替換了。
3. 不能直接給 exports
賦值(避免斷開引用)
很多人誤會以為直接給 exports = {...}
也能導出,但這是錯的,會導致導出失敗。
總結
-
“直接把鍵寫上去”,是指給
module.exports
對象直接添加屬性,比如module.exports.foo = ...
-
也可以一次性替換成一個新對象,比如
module.exports = { foo: ..., bar: ... }
-
推薦統一用
module.exports
來避免混淆。