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');
程序運行截圖:
????在使用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');
程序運行截圖:
以下的幾種文件可以作為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í)行自定義模塊中的方法
????程序運行截圖:
以類的方式定義模塊
????在定義模塊時可以將“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);
程序運行截圖:
加載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()方法加載模塊時禁荒,對模塊文件的查找策略如下圖: