module.exports與exports

來源:https://cnodejs.org/topic/52308842101e574521c16e06

module.exports與exports

每一個node.js執(zhí)行文件,都自動創(chuàng)建一個module對象,同時,module對象會創(chuàng)建一個叫exports的屬性有序,初始化的值是 {}

 module.exports = {};

Node.js為了方便地導(dǎo)出功能函數(shù)唐含,node.js會自動地實現(xiàn)以下這個語句。
foo.js:

exports.a = function(){
 console.log('a')
 }

test.js:

var x = require('./foo');
 console.log(x.a)

看到這里秕硝,相信大家都看到答案了芥映,exports是引用 module.exports的值。module.exports 被改變的時候远豺,exports不會被改變奈偏,而模塊導(dǎo)出的時候,真正導(dǎo)出的執(zhí)行是module.exports躯护,而不是exports惊来。

Node.js為了方便地導(dǎo)出功能函數(shù),node.js會自動地實現(xiàn)以下這個語句

foo.js

exports.a = function(){
console.log('a')
}

exports.a = 1
test.js

var x = require('./foo');

console.log(x.a)
看到這里棺滞,相信大家都看到答案了裁蚁,exports是引用 module.exports的值矢渊。module.exports 被改變的時候,exports不會被改變枉证,而模塊導(dǎo)出的時候矮男,真正導(dǎo)出的執(zhí)行是module.exports,而不是exports

再看看下面例子:
foo.js:

exports.a = function(){
  console.log('a')
 }
 module.exports = {a: 2}
 exports.a = 1 

test.js:

var x = require('./foo');

 console.log(x.a)//---> 2

exports在module.exports 被改變后室谚,失效毡鉴。
是不是開始有點廓然開朗,下面將會列出開源模塊中秒赤,經(jīng)持硭玻看到的幾個使用方式。

module.exports = View

function View(name, options) { 
   options = options || {};
   this.name = name;
   this.root = options.root;
   var engines = options.engines;
   this.defaultEngine = options.defaultEngine;
   var ext = this.ext = extname(name);
   if (!ext && !this.defaultEngine) throw new Error('No default engine was specified and no         extension was provided.');
   if (!ext) name += (ext = this.ext = ('.' != this.defaultEngine[0] ? '.' : '') +     this.defaultEngine);
   this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express);
   this.path = this.lookup(name);
 }

 module.exports = View;

javascript里面有一句話倒脓,函數(shù)即對象撑螺,View 是對象,module.export =View, 即相當(dāng)于導(dǎo)出整個view對象崎弃。外面模塊調(diào)用它的時候甘晤,能夠調(diào)用View的所有方法。不過需要注意饲做,只有是View的靜態(tài)方法的時候线婚,才能夠被調(diào)用,prototype創(chuàng)建的方法盆均,則屬于View的私有方法塞弊。
foo.js:

function View(){

 }
 View.prototype.test = function(){
  console.log('test')
 }
 View.test1 = function(){
  console.log('test1')
 }
module.exports = View

test.js:

 var x = require('./foo');

 console.log(x) //{ [Function: View] test1: [Function] }
 console.log(x.test) //undefined
 console.log(x.test1) //[Function]
 x.test1() //test1

var app = exports = module.exports = {};

其實,當(dāng)我們了解到原理后泪姨,不難明白這樣的寫法有點冗余游沿,其實是為了保證,模塊的初始化環(huán)境是干凈的肮砾。同時也方便我們诀黍,即使改變了 module.exports 指向的對象后,依然能沿用 exports的特性

exports = module.exports = createApplication;

 /**
  * Expose mime.
  */

 exports.mime = connect.mime;

例子仗处,當(dāng)中module.exports = createApplication改變了module.exports了眯勾,讓exports失效,通過exports = module.exports的方法婆誓,讓其恢復(fù)原來的特點吃环。

exports.init= function(){}

這種最簡單,直接就是導(dǎo)出模塊 init的方法洋幻。

var mongoose = module.exports = exports = new Mongoose;

集多功能一身郁轻,不過根據(jù)上文所描述的,大家應(yīng)該不能得出答案鞋屈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末范咨,一起剝皮案震驚了整個濱河市故觅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渠啊,老刑警劉巖输吏,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異替蛉,居然都是意外死亡贯溅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門躲查,熙熙樓的掌柜王于貴愁眉苦臉地迎上來它浅,“玉大人,你說我怎么就攤上這事镣煮〗慊簦” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵典唇,是天一觀的道長镊折。 經(jīng)常有香客問我,道長介衔,這世上最難降的妖魔是什么恨胚? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮炎咖,結(jié)果婚禮上赃泡,老公的妹妹穿的比我還像新娘。我一直安慰自己乘盼,他們只是感情好升熊,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绸栅,像睡著了一般僚碎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阴幌,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音卷中,去河邊找鬼矛双。 笑死,一個胖子當(dāng)著我的面吹牛蟆豫,可吹牛的內(nèi)容都是我干的议忽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼十减,長吁一口氣:“原來是場噩夢啊……” “哼栈幸!你這毒婦竟也來了愤估?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤速址,失蹤者是張志新(化名)和其女友劉穎玩焰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芍锚,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡昔园,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了并炮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片默刚。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖逃魄,靈堂內(nèi)的尸體忽然破棺而出荤西,到底是詐尸還是另有隱情,我是刑警寧澤伍俘,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布邪锌,位于F島的核電站,受9級特大地震影響养篓,放射性物質(zhì)發(fā)生泄漏秃流。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一柳弄、第九天 我趴在偏房一處隱蔽的房頂上張望舶胀。 院中可真熱鬧,春花似錦碧注、人聲如沸嚣伐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轩端。三九已至,卻和暖如春逝变,著一層夾襖步出監(jiān)牢的瞬間基茵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工壳影, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拱层,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓宴咧,卻偏偏與公主長得像根灯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容