成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Node.js 中 module.exports 和 exports 的區(qū)別

laoLiueizo / 2303人閱讀

摘要:中最常用的恐怕就是,以及了,那么和這兩者有什么區(qū)別,在什么情況下使用,又在什么時(shí)候使用。在拼接之后的代碼中,給這個(gè)函數(shù)傳入的是,也就是說和引用的是同一個(gè)對(duì)象。如果我們給增加屬性,那么因?yàn)橐矔?huì)增加相同的屬性,此時(shí)。

Node.js中最常用的恐怕就是 require, exports 以及 module.exports 了,那么 exports 和 module.exports 這兩者有什么區(qū)別,在什么情況下使用 exports,又在什么時(shí)候使用 module.exports。

先舉個(gè)官網(wǎng)的例子:

// circle.js
var PI = Math.PI;

exports.area = function (r) {
  return PI * r * r;
};

exports.circumference = function (r) {
  return 2 * PI * r;
};

在 circle.js 中寫的源字符串是上面貼出的代碼,然而實(shí)際 Node.js 在加載的時(shí)候會(huì)在原字符串上外面拼出一個(gè)閉包,拼出之后的代碼如下(有想了解為什么會(huì)拼出這個(gè)代碼的朋友,請(qǐng)看我之前一篇文章):

(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 調(diào)用這段代碼的為:

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 的一個(gè)屬性,exports 值為 {}。在拼接之后的代碼中,給這個(gè)函數(shù)傳入的 exports 是 module.exports, 也就是說 exports 和 modules.exports 引用的是同一個(gè)對(duì)象。如果我們給 exports 增加屬性,那么因?yàn)?modules.exports 也會(huì)增加相同的屬性,此時(shí) modules.exports === exports。然而如果對(duì) exports 賦值的話,那么就會(huì)造成 modules.exports 和 exports 不指向同一個(gè)對(duì)象,此時(shí)再對(duì) exports 做任何動(dòng)作都跟 modules.exports 沒有任何關(guān)系了,用一段代碼模擬就是:

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} 的形式, 總之別對(duì) exports 賦值。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78307.html

相關(guān)文章

  • Node.jsmodule.exportsexports區(qū)別

    摘要:看了好多篇博客,對(duì)于和區(qū)別的解釋眾說紛紜有點(diǎn)迷糊,還是自己寫來感受一下吧。會(huì)造成被另外一個(gè)內(nèi)存地址替換,也就中斷得了和的聯(lián)系。調(diào)用了我調(diào)用了我調(diào)用了我兩者的值又相同。小弟才疏學(xué)淺,講解較為啰嗦,亦是初次寫之,若有疏漏,妄不吝賜教,特此感謝。 看了好多篇博客,對(duì)于module.exports和exports區(qū)別的解釋眾說紛紜有點(diǎn)迷糊,還是自己寫demo來感受一下吧。 module.exp...

    codecook 評(píng)論0 收藏0
  • 談?wù)?em>Js前端模塊化規(guī)范

    摘要:依賴全部加載完成后,調(diào)用回調(diào)函數(shù)規(guī)范異步加載模塊規(guī)范和很相似,簡(jiǎn)單,并與和的規(guī)范保持了很大的兼容性在規(guī)范中,一個(gè)模塊就是一個(gè)文件。 拋出問題: 在開發(fā)中在導(dǎo)入模塊時(shí)經(jīng)常使用require和import; 導(dǎo)出模塊時(shí)使用module.exports/exports或者export/export default; 有時(shí)候?yàn)榱艘靡粋€(gè)模塊會(huì)使用require奇怪的是也可以使用import?...

    Steve_Wang_ 評(píng)論0 收藏0
  • 談?wù)?em>Js前端模塊化規(guī)范

    摘要:依賴全部加載完成后,調(diào)用回調(diào)函數(shù)規(guī)范異步加載模塊規(guī)范和很相似,簡(jiǎn)單,并與和的規(guī)范保持了很大的兼容性在規(guī)范中,一個(gè)模塊就是一個(gè)文件。 拋出問題: 在開發(fā)中在導(dǎo)入模塊時(shí)經(jīng)常使用require和import; 導(dǎo)出模塊時(shí)使用module.exports/exports或者export/export default; 有時(shí)候?yàn)榱艘靡粋€(gè)模塊會(huì)使用require奇怪的是也可以使用import?...

    NeverSayNever 評(píng)論0 收藏0
  • 兼容多種模塊規(guī)范(AMD,CMD,Node)代碼

    摘要:主要區(qū)別是需要在聲明模塊時(shí)指定所有的依賴,通過形參傳遞依賴到模塊內(nèi)容中。 前言 昨天,公司同事問了我如下一個(gè)問題: showImg(https://segmentfault.com/img/bVWXYP?w=548&h=346); 說他在看一個(gè)插件時(shí),看到了源碼結(jié)構(gòu)如截圖所示,他知道(function(){})()是一種立即執(zhí)行函數(shù),但是在截圖中,最后的那個(gè)圓括號(hào)里又寫了一個(gè)函數(shù)fun...

    Shonim 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<