Node.js模塊以及模塊加載機制

Node.js中的模塊

????在Node.js中途茫,以模塊為單位劃分功能桌吃,通過一個完整的模塊加載機制使得開發(fā)人員可以將應(yīng)用程序劃分為多個不同的部分娜睛。模塊的使用可以提高代碼重用率哆键,提高應(yīng)用程序的開發(fā)效率掘托,而且開發(fā)人員可以根據(jù)具體的需求引入第三方模塊或者自定義模塊到應(yīng)用程序中。
????在Node.js中一個Node.js文件就是一個模塊籍嘹,這樣的文件可以是JavaScript代碼腳本闪盔,可以是JSON,也可以是編譯過的C/C++擴展辱士。

Node.js的核心模塊與文件模塊

????在開發(fā)中可以使用require()方法加載模塊泪掀,如果是加載Node.js的核心模塊,只需要將被加載的模塊的名稱作為參數(shù)傳給require()即可颂碘,程序示例:

var http = require('http'); //加載Node.js的核心模塊http模塊
var fs = require('fs'); //加載Node.js的核心模塊fs模塊

var server = http.createServer();   //使用http模塊創(chuàng)建服務(wù)
server.on('connection', function(request, response){    //通過on()方法監(jiān)聽connection事件
    fs.readFile('./text.txt', function(err, data){  //使用fs模塊的readFile()方法讀取text.txt文件內(nèi)容
        if(err){
            console.log('文件讀取時出現(xiàn)錯誤:' + err);
        }else{
            console.log(data.toString());
        }
    });
});

server.listen(8000, '127.0.0.1');

程序運行截圖:


圖片1.png

????在使用require()方法加載模塊的時候异赫,如果寫錯了模塊的名稱就會引起程序報錯,require()函數(shù)將會拋出異常头岔,程序示例:

var http = require('aaaa'); //故意寫錯模塊名稱

var server = http.createServer();
server.on('connection', function(request, response){
    console.log(request.url);
});

server.listen(8000, '127.0.0.1');

程序運行截圖:


圖片2.png

以下的幾種文件可以作為Node.js的模塊文件:

  • 后綴名為.js的JavaScript腳本文件塔拳。
  • 后綴名為.json的JSON文本文件。
  • 后綴名為.node的經(jīng)過編譯的二進制模塊文件峡竣。
    ????在Node.js中加載模塊時需要指定模塊文件的完整路徑以及文件名稱靠抑。可以是相對路徑也可以是絕對路徑适掰,程序示例:
    ????(1)創(chuàng)建myModule.js:
var myFunction = function(){
    console.log('自定義模塊中的方法執(zhí)行了颂碧。');
}

exports.myFunction = myFunction;

????(2)創(chuàng)建module.js:

var myModule = require('./myModule.js');    //使用require()方法引入自定義模塊

myModule.myFunction();  //執(zhí)行自定義模塊中的方法

????程序運行截圖:


圖片3.png

以類的方式定義模塊

????在定義模塊時可以將“exports”對象寫為“module.exports”荠列,但是在以類的方式定義模塊的時候只能寫做“module.exports”。程序示例:

  • (1)創(chuàng)建student.js模塊文件:
var _Name,_Age;
var Name = '', Age = 0;

//模塊對象的構(gòu)造方法
var student = function(name, age){
    _Name = name;
    _Age = age;
}

//獲取私有變量_Name的值
student.prototype.GetName = function(){
    return _Name;
}

//設(shè)置私有變量_Name的值
student.prototype.SetName = function(name){
    _Name = name;
}

//獲取私有變量_Age的值
student.prototype.GetAge = function(){
    return _Age;
}

//設(shè)置私有變量_Age的值
student.prototype.SetAge = function(age){
    _Age = age;
}

student.prototype.Name = Name;
student.prototype.Age = Age;

module.exports = student;
  • (2)創(chuàng)建app.js文件:
var student = require('./student.js');

var s1 = new student('Tom', 12);
/*
*獲取模塊中的私有變量
*/
console.log('模塊中的私有變量:');
console.log('姓名:' + s1.GetName());
console.log('年齡:' + s1.GetAge());

//設(shè)置模塊中中公有變量的值
student.Name = 'Danny';
student.Age = 14;

/*
*獲取模塊中公有變量值
*/
console.log('模塊中的公有變量的值:');
console.log('姓名:' + student.Name);
console.log('年齡:' + student.Age);

程序運行截圖:


圖片4.png

加載node_modules目錄中的模塊

????在Node.js中使用require()方法加載模塊時只傳入了文件名稱作為require()方法的參數(shù)稚伍,而沒有指明文件的路徑弯予,

require(‘module.js’);   //只指定了文件的名稱,沒有指定文件的路徑

????則程序在運行的時候Node.js會將該文件視為node_modules目錄下的文件个曙。

通過目錄加載模塊

????在Node.js中锈嫩,把目錄名稱指定為模塊名,就可以通過目錄對模塊進行管理垦搬『舸纾可以直接require一個目錄,假設(shè)有一個目錄名為folder猴贰,如:

var myMod = require('./folder');

????程序在運行的時候对雪,Node將搜索整個folder目錄,Node會假設(shè)folder為一個包并試圖找到包定義文件package.json米绕。如果folder 目錄里沒有包含package.json文件瑟捣,Node會假設(shè)默認主文件為index.js,即會加載index.js栅干。如果index.js也不存在迈套, 那么加載將失敗。

從全局目錄中加載模塊

????如果在操作系統(tǒng)的環(huán)境變量中設(shè)置NODE_PATH變量碱鳞,并且已經(jīng)將變量值設(shè)置為一個有效的磁盤目錄桑李,在使用require()方法加載模塊時只指定了模塊的名稱而沒有指定模塊的路徑,而且Node.js從其他路徑中找不到需要被加載的模塊文件時窿给,Node.js將會從NODE_PATH變量值所指向的磁盤目錄中尋找并加載模塊文件贵白。如果最終都沒有找到,require()方法就會拋出異常崩泡。

require()方法對模塊的查找策略

????Node.js的require()方法加載模塊時禁荒,對模塊文件的查找策略如下圖:


圖片5.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市角撞,隨后出現(xiàn)的幾起案子圈浇,更是在濱河造成了極大的恐慌,老刑警劉巖靴寂,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異召耘,居然都是意外死亡百炬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門污它,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剖踊,“玉大人庶弃,你說我怎么就攤上這事〉鲁海” “怎么了歇攻?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長梆造。 經(jīng)常有香客問我缴守,道長,這世上最難降的妖魔是什么镇辉? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任屡穗,我火速辦了婚禮,結(jié)果婚禮上忽肛,老公的妹妹穿的比我還像新娘村砂。我一直安慰自己,他們只是感情好屹逛,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布础废。 她就那樣靜靜地躺著,像睡著了一般罕模。 火紅的嫁衣襯著肌膚如雪评腺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天手销,我揣著相機與錄音歇僧,去河邊找鬼。 笑死锋拖,一個胖子當著我的面吹牛诈悍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兽埃,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼侥钳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了柄错?” 一聲冷哼從身側(cè)響起舷夺,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎售貌,沒想到半個月后给猾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡颂跨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年敢伸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恒削。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡池颈,死狀恐怖尾序,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躯砰,我是刑警寧澤每币,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站琢歇,受9級特大地震影響兰怠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矿微,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一痕慢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涌矢,春花似錦掖举、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至名秀,卻和暖如春励负,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匕得。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工继榆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人汁掠。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓略吨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親考阱。 傳聞我的和親對象是個殘疾皇子翠忠,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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