第二章:模塊機(jī)制
總結(jié):nodejs遵循commonjs規(guī)范,commonjs定義了模塊、I/O、二進(jìn)制、文件等規(guī)范,其中最重要的就是nodejs模塊規(guī)范,下面總結(jié)一下nodejs的模塊加載:
nodejs的模塊分為核心模塊和文件模塊,核心模塊在nodejs源代碼編譯中,已經(jīng)編譯進(jìn)了二進(jìn)制可執(zhí)行文件中,只要node啟動(dòng),就已經(jīng)被加載到內(nèi)存中,所以加載速度比較快。像文件模塊就需要經(jīng)歷路徑解析、文件定位和編譯執(zhí)行的過(guò)程。
路徑解析可以是一個(gè)標(biāo)識(shí)符、相對(duì)路徑或者絕對(duì)路徑,最終require方法會(huì)轉(zhuǎn)換成真實(shí)路徑。
文件定位包括文件擴(kuò)展名分析和包目錄分析等,其中文件擴(kuò)展名沒(méi)帶時(shí),是以.js .json .node的順序進(jìn)行解析的。
完成路徑解析和文件定位后,node會(huì)新建一個(gè)模塊對(duì)象,這時(shí)候就有了exports、module等變量,再具體的編譯過(guò)程中,node會(huì)對(duì)加載的js文件進(jìn)行頭尾的包裝(包裝見(jiàn)下面示例代碼),包裝的過(guò)程中,將模塊對(duì)象的module exports __filename __dirname等變量傳遞給function函數(shù),這就是我們沒(méi)有在js文件中定義module等變量,卻可以使用的原因。
//(function(exports, require, module, __filename, __dirname){//頭
var a = 123;
exports.add = function(b){
return a+b;
}
//...
//});//尾
另外,node對(duì)于模塊的加載是有緩存的,以減少二次引用時(shí)的性能開(kāi)銷(核心模塊的緩存檢查優(yōu)先于文件模塊的緩存檢查)。
////////////////
筆記:
- nodejs特點(diǎn):
單線程、數(shù)據(jù)驅(qū)動(dòng)、異步、速度快、耗費(fèi)內(nèi)存多
劣勢(shì):
- 默認(rèn)不支持多核,但可以用cluster實(shí)現(xiàn)
- 不支持服務(wù)器集群 ,但可以用node-http-proxy實(shí)現(xiàn)
- 借助nginx實(shí)現(xiàn)負(fù)載均衡
- 災(zāi)難恢復(fù) 可以用node-cluster實(shí)現(xiàn)