node中的模塊
編寫(xiě)稍大一點(diǎn)的程序時(shí)一般都會(huì)將代碼模塊化蝉绷。在NodeJS中鸭廷,一般將代碼合理拆分到不同的JS文件中,每一個(gè)文件就是一個(gè)模塊熔吗,而文件路徑就是模塊名辆床。
在編寫(xiě)每個(gè)模塊時(shí),都有require桅狠、exports讼载、module三個(gè)預(yù)先定義好的變量可供使用轿秧。
一: require
require函數(shù)用于在當(dāng)前模塊中加載和使用別的模塊,傳入一個(gè)模塊名咨堤,返回一個(gè)模塊導(dǎo)出對(duì)象菇篡。模塊名可使用相對(duì)路徑(以./開(kāi)頭),
或者是絕對(duì)路徑(以/或C:之類(lèi)的盤(pán)符開(kāi)頭)一喘。另外驱还,模塊名中的.js擴(kuò)展名可以省略。以下是一個(gè)例子凸克。
復(fù)制代碼
var foo1 = require('./foo');
var foo2 = require('./foo.js');
var foo3 = require('/home/user/foo');
var foo4 = require('/home/user/foo.js');
// foo1至foo4中保存的是同一個(gè)模塊的導(dǎo)出對(duì)象议蟆。
復(fù)制代碼
另外,可以使用以下方式加載和使用一個(gè)JSON文件萎战。
var data = require('./data.json');
二:exports
exports對(duì)象是當(dāng)前模塊的導(dǎo)出對(duì)象咐容,用于導(dǎo)出模塊公有方法和屬性。別的模塊通過(guò)require函數(shù)使用當(dāng)前模塊時(shí)得到的就是當(dāng)前模塊的exports對(duì)象蚂维。
以下例子中導(dǎo)出了一個(gè)公有方法戳粒。
exports.hello = function () {
console.log('Hello World!');
};
三:module
通過(guò)module對(duì)象可以訪問(wèn)到當(dāng)前模塊的一些相關(guān)信息,但最多的用途是替換當(dāng)前模塊的導(dǎo)出對(duì)象鸟雏。例如模塊導(dǎo)出對(duì)象默認(rèn)是一個(gè)普通對(duì)象享郊,
如果想改成一個(gè)函數(shù)的話,可以使用以下方式孝鹊。
module.exports = function () {
console.log('Hello World!');
};
以上代碼中炊琉,模塊默認(rèn)導(dǎo)出對(duì)象被替換為一個(gè)函數(shù)。
四:模塊初始化
一個(gè)模塊中的JS代碼僅在模塊第一次被使用時(shí)執(zhí)行一次又活,并在執(zhí)行過(guò)程中初始化模塊的導(dǎo)出對(duì)象苔咪。之后,緩存起來(lái)的導(dǎo)出對(duì)象被重復(fù)利用柳骄。
五:主模塊
通過(guò)命令行參數(shù)傳遞給NodeJS以啟動(dòng)程序的模塊被稱(chēng)為主模塊团赏。主模塊負(fù)責(zé)調(diào)度組成整個(gè)程序的其它模塊完成工作。例如通過(guò)以下命令啟動(dòng)程序時(shí)耐薯,main.js就是主模塊舔清。
$ node main.js
六:完整示例
例如有以下目錄。
- /home/user/hello/
- util/
counter.js
main.js
其中counter.js內(nèi)容如下:
復(fù)制代碼
var i = 0;
function count() {
return ++i;
}
exports.count = count;
復(fù)制代碼
該模塊內(nèi)部定義了一個(gè)私有變量i曲初,并在exports對(duì)象導(dǎo)出了一個(gè)公有方法count体谒。
主模塊main.js內(nèi)容如下:
復(fù)制代碼
var counter1 = require('./util/counter');
var? ? counter2 = require('./util/counter');
console.log(counter1.count());
console.log(counter2.count());
console.log(counter2.count());
復(fù)制代碼
運(yùn)行該程序的結(jié)果如下:
$ node main.js
1
2
3
可以看到,counter.js并沒(méi)有因?yàn)楸籸equire了兩次而初始化兩次臼婆。
七:補(bǔ)充內(nèi)容:二進(jìn)制模塊(只做了解)
雖然一般我們使用JS編寫(xiě)模塊抒痒,但NodeJS也支持使用C/C++編寫(xiě)二進(jìn)制模塊。編譯好的二進(jìn)制模塊除了文件擴(kuò)展名是.node外颁褂,
和JS模塊的使用方式相同故响。雖然二進(jìn)制模塊能使用操作系統(tǒng)提供的所有功能傀广,擁有無(wú)限的潛能,但對(duì)于前端同學(xué)而言編寫(xiě)過(guò)于困難彩届,
并且難以跨平臺(tái)使用伪冰,因此不在本教程的覆蓋范圍內(nèi)。
小結(jié)
本章介紹了有關(guān)NodeJS的基本概念和使用方法惨缆,總結(jié)起來(lái)有以下知識(shí)點(diǎn):
NodeJS是一個(gè)JS腳本解析器糜值,任何操作系統(tǒng)下安裝NodeJS本質(zhì)上做的事情都是把NodeJS執(zhí)行程序復(fù)制到一個(gè)目錄,
然后保證這個(gè)目錄在系統(tǒng)PATH環(huán)境變量下坯墨,以便終端下可以使用node命令寂汇。
終端下直接輸入node命令可進(jìn)入命令交互模式,很適合用來(lái)測(cè)試一些JS代碼片段捣染,比如正則表達(dá)式骄瓣。
NodeJS使用CMD模塊系統(tǒng),主模塊作為程序入口點(diǎn)耍攘,所有模塊在執(zhí)行過(guò)程中只初始化一次榕栏。
除非JS模塊不能滿(mǎn)足需求,否則不要輕易使用二進(jìn)制模塊蕾各,否則你的用戶(hù)會(huì)叫苦連天扒磁。