exports 和 module.exports 的聯繫和區別

最近遇到了一次 exports 導出的 class 在其它文件中不能使用的問題,仔細檢查,發現是導出的方式有問題。ui

在這裏總結一下。spa

當時導出的方法是:對象

exports = class Test {it

...io

}function

而後在其它文件中,不管怎樣都只能獲得一個空對象。class

後來改爲require

exports = module.exports = class Test {module

...方法

}

就能正常獲取到 class Test 了。

研究了一下,發現緣由是 exports 的指向被重寫了。

最初的時候,exports 是指向 module.exports 的,所以使用

exports.Test = Test;

這樣也是能夠從其它文件中獲取到 Test 的:

 const Test = require("./example.js").Test;

這樣便可。

可是若是寫成

exports = {

Test

}

這樣的話,在其它頁面,使用

const exa = require("./example.js");

獲取到的 exa 其實是 module.exports ,最初的 exports = module.exports = {} ,可是後來把 exports 指向其它對象以後, module.exports 並不會一樣指向其它對象,也就是說 exports 是單向指向 module.exports 的,兩者並不相等。所以,這裏的 exa = {}, 而不是 exports 指向的對象。

另外,即便 exports 正確使用了

exports.Test = Test;

可是若是在後面又定義了

module.exports = {

...

};

也會使 module.exports 指向的對象再也不是最初的對象,致使 exports 的屬性失效。

 

所以,一個比較好的實踐是,在文件的最開頭就定義好:

exports = module.exports;

強行把兩個對象相等,這樣,就能夠直接寫

exports = function() {

...

}

或者

exports = {

...

}

了。 

相關文章
相關標籤/搜索