最近遇到了一次 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 = {
...
}
了。