前面的話
我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、中牟ssl等。為數(shù)千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的中牟網(wǎng)站制作公司Node在實(shí)現(xiàn)中并非完全按照CommonJS規(guī)范實(shí)現(xiàn),而是對(duì)模塊規(guī)范進(jìn)行了一定的取舍,同時(shí)也增加了少許自身需要的特性。本文將詳細(xì)介紹NodeJS的模塊實(shí)現(xiàn)
引入
nodejs是區(qū)別于javascript的,在javascript中的頂層對(duì)象是window,而在node中的頂層對(duì)象是global
[注意]實(shí)際上,javascript也存在global對(duì)象,只是其并不對(duì)外訪問(wèn),而使用window對(duì)象指向global對(duì)象而已
在javascript中,通過(guò)var a = 100;是可以通過(guò)window.a來(lái)得到100的
但在nodejs中,是不能通過(guò)global.a來(lái)訪問(wèn),得到的是undefined
這是因?yàn)関ar a = 100;這個(gè)語(yǔ)句中的變量a,只是模塊范圍內(nèi)的變量a,而不是global對(duì)象下的a
在nodejs中,一個(gè)文件就是一個(gè)模塊,每個(gè)模塊都有自己的作用域。使用var來(lái)聲明的一個(gè)變量,它并不是全局的,而是屬于當(dāng)前模塊下
如果要在全局作用域下聲明變量,則如下所示
概述
Node中模塊分為兩類:一類是Node提供的模塊,稱為核心模塊;另一類是用戶編寫(xiě)的模塊,稱為文件模塊
核心模塊部分在Node源代碼的編譯過(guò)程中,編譯進(jìn)了二進(jìn)制執(zhí)行文件。在Node進(jìn)程啟動(dòng)時(shí),部分核心模塊就被直接加載進(jìn)內(nèi)存中,所以這部分核心模塊引入時(shí),文件定位和編譯執(zhí)行這兩個(gè)步驟可以省略掉,并且在路徑分析中優(yōu)先判斷,所以它的加載速度是最快的
文件模塊則是在運(yùn)行時(shí)動(dòng)態(tài)加載,需要完整的路徑分析、文件定位、編譯執(zhí)行過(guò)程,速度比核心模塊慢
接下來(lái),我們展開(kāi)詳細(xì)的模塊加載過(guò)程
模塊加載
在javascript中,加載模塊使用script標(biāo)簽即可,而在nodejs中,如何在一個(gè)模塊中,加載另一個(gè)模塊呢?
使用require()方法來(lái)引入
【緩存加載】
再展開(kāi)介紹require()方法的標(biāo)識(shí)符分析之前,需要知道,與前端瀏覽器會(huì)緩存靜態(tài)腳本文件以提高性能一樣,Node對(duì)引入過(guò)的模塊都會(huì)進(jìn)行緩存,以減少二次引入時(shí)的開(kāi)銷。不同的地方在于,瀏覽器僅僅緩存文件,而Node緩存的是編譯和執(zhí)行之后的對(duì)象
不論是核心模塊還是文件模塊,require()方法對(duì)相同模塊的二次加載都一律采用緩存優(yōu)先的方式,這是第一優(yōu)先級(jí)的。不同之處在于核心模塊的緩存檢查先于文件模塊的緩存檢查
【標(biāo)識(shí)符分析】
require()方法接受一個(gè)標(biāo)識(shí)符作為參數(shù)。在Node實(shí)現(xiàn)中,正是基于這樣一個(gè)標(biāo)識(shí)符進(jìn)行模塊查找的。模塊標(biāo)識(shí)符在Node中主要分為以下幾類:[1]核心模塊,如http、fs、path等;[2].或..開(kāi)始的相對(duì)路徑文件模塊;[3]以/開(kāi)始的絕對(duì)路徑文件模塊;[4]非路徑形式的文件模塊,如自定義的connect模塊
根據(jù)參數(shù)的不同格式,require命令去不同路徑尋找模塊文件
1、如果參數(shù)字符串以“/”開(kāi)頭,則表示加載的是一個(gè)位于絕對(duì)路徑的模塊文件。比如,require('/home/marco/foo.js')將加載/home/marco/foo.js
2、如果參數(shù)字符串以“./”開(kāi)頭,則表示加載的是一個(gè)位于相對(duì)路徑(跟當(dāng)前執(zhí)行腳本的位置相比)的模塊文件。比如,require('./circle')將加載當(dāng)前腳本同一目錄的circle.js
3、如果參數(shù)字符串不以“./“或”/“開(kāi)頭,則表示加載的是一個(gè)默認(rèn)提供的核心模塊(位于Node的系統(tǒng)安裝目錄中),或者一個(gè)位于各級(jí)node_modules目錄的已安裝模塊(全局安裝或局部安裝)
[注意]如果是當(dāng)前路徑下的文件模塊,一定要以./開(kāi)頭,否則nodejs會(huì)試圖去加載核心模塊,或node_modules內(nèi)的模塊
//a.js console.log('aaa'); //b.js require('./a');//'aaa' require('a');//報(bào)錯(cuò)
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。