摘要:中最常用的恐怕就是,以及了,那么和這兩者有什么區別,在什么情況下使用,又在什么時候使用。在拼接之后的代碼中,給這個函數傳入的是,也就是說和引用的是同一個對象。如果我們給增加屬性,那么因為也會增加相同的屬性,此時。
Node.js中最常用的恐怕就是 require, exports 以及 module.exports 了,那么 exports 和 module.exports 這兩者有什么區別,在什么情況下使用 exports,又在什么時候使用 module.exports。
先舉個官網的例子:
// circle.js var PI = Math.PI; exports.area = function (r) { return PI * r * r; }; exports.circumference = function (r) { return 2 * PI * r; };
在 circle.js 中寫的源字符串是上面貼出的代碼,然而實際 Node.js 在加載的時候會在原字符串上外面拼出一個閉包,拼出之后的代碼如下(有想了解為什么會拼出這個代碼的朋友,請看我之前一篇文章):
(function(exports, require, module, __dirname, __filename) { // circle.js var PI = Math.PI; exports.area = function (r) { return PI * r * r; }; exports.circumference = function (r) { return 2 * PI * r; }; })
Node.js 調用這段代碼的為:
function Module(id, parent) { this.id = id; this.exports = {}; this.parent = parent; if (parent && parent.children) { parent.children.push(this); } this.filename = null; this.loaded = false; this.children = []; } Module.prototype._compile = function(content, filename) { var self = this; function require(path) { return self.require(path); } var dirname = path.dirname(filename); var args = [self.exports, require, self, filename, dirname]; return compiledWrapper.apply(self.exports, args); };
從上面這段代碼可以看到 exports 是 module 的一個屬性,exports 值為 {}。在拼接之后的代碼中,給這個函數傳入的 exports 是 module.exports, 也就是說 exports 和 modules.exports 引用的是同一個對象。如果我們給 exports 增加屬性,那么因為 modules.exports 也會增加相同的屬性,此時 modules.exports === exports。然而如果對 exports 賦值的話,那么就會造成 modules.exports 和 exports 不指向同一個對象,此時再對 exports 做任何動作都跟 modules.exports 沒有任何關系了,用一段代碼模擬就是:
var module = { exports: {}}; var exports = module.exports; exports.a = 1; console.log(module.exports); // {a: 1} exports = {b:2}; console.log(module.exports); // {a: 1}
所以從上面的代碼可以看出,如果我們想在模塊文件中提供其他模塊可以訪問的接口,最好寫成
exports["key"] = value 或者 module.exports = {key: value} 的形式, 總之別對 exports 賦值。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78307.html
摘要:看了好多篇博客,對于和區別的解釋眾說紛紜有點迷糊,還是自己寫來感受一下吧。會造成被另外一個內存地址替換,也就中斷得了和的聯系。調用了我調用了我調用了我兩者的值又相同。小弟才疏學淺,講解較為啰嗦,亦是初次寫之,若有疏漏,妄不吝賜教,特此感謝。 看了好多篇博客,對于module.exports和exports區別的解釋眾說紛紜有點迷糊,還是自己寫demo來感受一下吧。 module.exp...
摘要:依賴全部加載完成后,調用回調函數規范異步加載模塊規范和很相似,簡單,并與和的規范保持了很大的兼容性在規范中,一個模塊就是一個文件。 拋出問題: 在開發中在導入模塊時經常使用require和import; 導出模塊時使用module.exports/exports或者export/export default; 有時候為了引用一個模塊會使用require奇怪的是也可以使用import?...
摘要:依賴全部加載完成后,調用回調函數規范異步加載模塊規范和很相似,簡單,并與和的規范保持了很大的兼容性在規范中,一個模塊就是一個文件。 拋出問題: 在開發中在導入模塊時經常使用require和import; 導出模塊時使用module.exports/exports或者export/export default; 有時候為了引用一個模塊會使用require奇怪的是也可以使用import?...
摘要:主要區別是需要在聲明模塊時指定所有的依賴,通過形參傳遞依賴到模塊內容中。 前言 昨天,公司同事問了我如下一個問題: showImg(https://segmentfault.com/img/bVWXYP?w=548&h=346); 說他在看一個插件時,看到了源碼結構如截圖所示,他知道(function(){})()是一種立即執行函數,但是在截圖中,最后的那個圓括號里又寫了一個函數fun...
閱讀 2404·2021-11-24 09:39
閱讀 3223·2021-10-09 09:53
閱讀 1130·2021-09-22 16:06
閱讀 4442·2021-09-02 10:18
閱讀 800·2021-08-23 09:42
閱讀 1761·2021-08-17 10:11
閱讀 2685·2019-08-30 13:02
閱讀 2121·2019-08-30 12:49