Nodejs學(xué)習(xí)筆記(三)--- 模塊

簡介及資料

通過Node.js的官方API可以看到Node.js本身提供了很多核心模塊 http://nodejs.org/api/ 苔悦,這些核心模塊被編譯成二進(jìn)制文件,可以require('模塊名')去獲让槐觥;核心模塊具有最高的加載優(yōu)先級(有模塊與核心模塊同名時(shí)會體現(xiàn))
(本次主要說自定義模塊)

Node.js還有一類模塊為文件模塊沸柔,可以是JavaScript代碼文件(.js作為文件后綴)循衰、也可以是JSON格式文本文件(.json作為文件后綴)、還可以是編輯過的C/C++文件(.node作為文件后綴)褐澎;

文件模塊訪問方式通過require('/文件名.后綴') require('./文件名.后綴') requrie('../文件名.后綴') 去訪問会钝,文件后綴可以省略;以"/"開頭是以絕對路徑去加載工三,以"./"開頭和以"../"開頭表示以相對路徑加載迁酸,而以"./"開頭表示同級目錄下文件,
前面提到文件后綴可以省略俭正,Nodejs嘗試加載的優(yōu)先級 js文件 > json文件 > node文件

官方解釋

Nodejs基于CommonJS,所以直接看的Node的官方文檔解釋

Module.exports

The module.exports object is created by the Module system. Sometimes this is not acceptable; many want their module to be an instance of some class. To do this, assign the desired export object to module.exports. Note that assigning the desired object to exports will simply rebind the local exports variable, which is probably not what you want to do.
譯文:module.exports對象是由模塊系統(tǒng)創(chuàng)建的奸鬓。 有時(shí)這是難以接受的;許多人希望他們的模塊成為某個(gè)類的實(shí)例掸读。 為了實(shí)現(xiàn)這個(gè)串远,需要將期望導(dǎo)出的對象賦值給module.exports。 注意儿惫,將期望的對象賦值給exports會簡單地重新綁定到本地exports變量上澡罚,這可能不是你想要的。

exports

The exports variable is available within a module's file-level scope, and is assigned the value of module.exports before the module is evaluated. It allows a shortcut, so that module.exports.f = ... can be written more succinctly as exports.f = .... However, be aware that like any variable, if a new value is assigned to exports, it is no longer bound to module.exports:
譯文:exports變量是在模塊的文件級別作用域內(nèi)有效的肾请,它在模塊被執(zhí)行前被賦于 module.exports 的值留搔。它有一個(gè)快捷方式,以便 module.exports.f = ... 可以被更簡潔地寫成exports.f = ...隔显。 注意却妨,就像任何變量,如果一個(gè)新的值被賦值給exports荣月,它就不再綁定到module.exports(其實(shí)是exports.屬性會自動掛載到?jīng)]有命名沖突的module.exports.屬性)

module.exports是真正的接口梳毙,exports只不過是它的輔助工具生年。推薦使用exports導(dǎo)出,除非你打算從原來的“實(shí)例化對象”改變成一個(gè)類型患亿。如果你想你的模塊是一個(gè)特定的類型就用Module.exports咙冗。如果你想的模塊是一個(gè)典型的“實(shí)例化對象”就用exports显歧。

require

從require導(dǎo)入方式去理解到旦,關(guān)鍵有兩個(gè)變量(全局變量module.exports采呐,局部變量exports)、一個(gè)返回值(module.exports)

Demo

主要探索 Module.exports 和 exports 區(qū)別

1.js
console.log(exports); // {}  
console.log(module.exports);  // {}  
console.log(exports === module.exports);    // true  
console.log(exports == module.exports);        // true  
/**
 Module {
  id: '.',
  exports: {},
  parent: null,
  filename: '/1.js',
  loaded: false,
  children: [],
  paths:
   [ 
     '/node_modules' ] 
 }
 */
console.log(module);
image.png

1.每個(gè)js文件一創(chuàng)建昼捍,都有一個(gè)var exports = module.exports = {};郊闯,使exports和module.exports都指向一個(gè)空對象笋粟。
2.module是全局內(nèi)置對象绿淋,exports是被var創(chuàng)建的局部對象绞幌。
3.module.exports和exports所指向的內(nèi)存地址相同

2.js仪吧、3.js
// 2.js
exports.id = 'exports的id';  
exports.id2 = 'exports的id2';  
exports.func = function(){  
    console.log('exports的函數(shù)');
};
exports.func2 = function() {  
    console.log('exports的函數(shù)2');
};
module.exports = {  
    id: 'module.exports的id',
    func:function(){
        console.log('module.exports的函數(shù)');
    }

};
// 3.js
var a = require('./2.js');  
// 當(dāng)屬性和函數(shù)在module.exports都有定義時(shí):
console.log(a.id);  // module.exports的id  
console.log("~~~~~~~~~~~~~~~~~~"); 
console.log(a.func()); // module.exports的函數(shù)
console.log("~~~~~~~~~~~~~~~~~~"); 
// 當(dāng)屬性在module.exports沒有定義唯咬,函數(shù)在module.exports有定義
console.log(a.id2);  // undefined  
console.log("~~~~~~~~~~~~~~~~~~"); 
console.log(a.func());  // module.exports的函數(shù)
console.log("~~~~~~~~~~~~~~~~~~"); 

// 當(dāng)函數(shù)在module.exports沒有定義蜀涨,屬性在module.exports有定義
console.log(a.id);        // module.exports的id  
console.log("~~~~~~~~~~~~~~~~~~"); 
console.log(a.func2());    // 報(bào)錯(cuò)了 TypeError: a.func2 is not a function 
console.log("~~~~~~~~~~~~~~~~~~");  
image.png

1.module.exports像是exports的大哥瞎嬉,當(dāng)module.exports以{}整體導(dǎo)出時(shí)會覆蓋exports的屬性和方法,
2.注意厚柳,若只是將屬性/方法掛載在module.exports./exports.上時(shí)氧枣,exports.id=1和module.exports.id=100,module.exports.id=function(){}和exports.id=function(){}别垮,最后id的值取決于exports.id和module.exports.id的順序便监,誰在后,就是最后的值

3.若exports和module.exports同時(shí)賦值時(shí)宰闰,exports所使用的屬性和方法必須出現(xiàn)在module.exports茬贵,若屬性沒有在module.exports中定義的話簿透,出現(xiàn)undefined,若方法沒有在module.exports中定義解藻,會拋出TypeError錯(cuò)誤老充。
4.js、5.js

module.exports的對象螟左、prototype啡浊、構(gòu)造函數(shù)使用

// 4.js
var a = require('./5.js');  
// 若傳的是類,new一個(gè)對象
var person = new a('Kylin',20);  
console.log(person.speak()); // my name is Kylin ,my age is 20

// 若不需要在構(gòu)造函數(shù)時(shí)初始化參數(shù)胶背,直接調(diào)用方法/屬性
// a.speak();  // my name is kylin ,my age is 20
// 5.js
// Person類
function Person(name,age){  
    this.name = name;
    this.age = age;
}
// 為類添加方法
Person.prototype.speak = function(){  
    console.log('my name is '+this.name+' ,my age is '+this.age);
};

// 返回類
module.exports = Person;

// 若構(gòu)造函數(shù)沒有傳入?yún)?shù)(name,age)巷嚣,直接傳入對象
// module.exports = new Person('kylin',20);
image.png

如果只是單一屬性或方法的話,就使用exports.屬性/方法钳吟。要是導(dǎo)出多個(gè)屬性或方法或使用對象構(gòu)造方法廷粒,結(jié)合prototype等,就建議使用module.exports = {}红且。
旨在學(xué)習(xí)記錄坝茎,其中描述可能不是很準(zhǔn)確,若是存在問題暇番,還望大神指正建議嗤放。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市壁酬,隨后出現(xiàn)的幾起案子次酌,更是在濱河造成了極大的恐慌,老刑警劉巖舆乔,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岳服,死亡現(xiàn)場離奇詭異,居然都是意外死亡蜕煌,警方通過查閱死者的電腦和手機(jī)派阱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斜纪,“玉大人贫母,你說我怎么就攤上這事『懈眨” “怎么了腺劣?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長因块。 經(jīng)常有香客問我橘原,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任趾断,我火速辦了婚禮拒名,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好衣摩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布誊稚。 她就那樣靜靜地躺著虐拓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天炸站,我揣著相機(jī)與錄音,去河邊找鬼疚顷。 笑死旱易,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的荡含。 我是一名探鬼主播咒唆,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼释液!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起装处,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤误债,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后妄迁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寝蹈,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年登淘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了箫老。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黔州,死狀恐怖耍鬓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情流妻,我是刑警寧澤牲蜀,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站绅这,受9級特大地震影響涣达,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一度苔、第九天 我趴在偏房一處隱蔽的房頂上張望匆篓。 院中可真熱鬧,春花似錦寇窑、人聲如沸奕删。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽完残。三九已至,卻和暖如春横漏,著一層夾襖步出監(jiān)牢的瞬間谨设,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工缎浇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扎拣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓素跺,卻偏偏與公主長得像二蓝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子指厌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

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