1. 程式人生 > >Node中module.exports和exports之間的區別

Node中module.exports和exports之間的區別

在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的方式來輸出模組變數,這樣只需要記憶一種方法。

更詳細的講解可以移步廖雪峰老師的部落格