Node中module.exports和exports之間的區別
阿新 • • 發佈:2018-12-11
在Node環境中,一個模組中輸出變數的方式有兩種,分別是:
1.module.exports
// module.js
function hello(name) {
console.log('Hello, ' + name + '!');
}
module.exports = hello;
2.exports
// module.js
function hello(name) {
console.log('Hello, ' + name + '!');
}
exports.hello = hello;
以上兩種寫法上都是正確的,那麼這兩寫法有什麼區別呢?接著我們看一看Node的載入機制;
首先,Node會把整個待載入的module.js
檔案放入一個包裝函式load
中執行。在執行這個load()
函式前,Node準備好了module變數:
var module = {
id: 'module',
exports: {}
};
load()
函式最終返回module.exports
:
var load = function (exports, module) { // module.js的檔案內容 ... // load函式返回: return module.exports; }; var exported = load(module.exports, module);
預設情況下,Node準備的exports
變數和module.exports
變數實際上是同一個變數,並且初始化為空物件,我們可以把要輸出的東西直接假期在這個空物件裡面;但是,如果我們要輸出的是一個函式或陣列,那麼,只能給module.exports
賦值,給exports
賦值是無效的,因為賦值後,module.exports
仍然是空物件。
因此,我們得出以下結論:
如果要輸出一個鍵值物件{}
,可以利用exports
這個已存在的空物件{}
,並繼續在上面新增新的鍵值;
如果要輸出一個函式或陣列,必須直接對module.exports
物件賦值。
直接對module.exports
賦值,可以應對任何情況;
我們強烈建議使用module.exports = xxx
的方式來輸出模組變數,這樣只需要記憶一種方法。
更詳細的講解可以移步廖雪峰老師的部落格