若要加载模块二进制_春哥说 | 浅谈NodeJs的模块机制-2
★ 目錄 ★
01
Node的模塊實(shí)現(xiàn)概述
02
優(yōu)先從緩存中加載
03
路徑分析和文件定位
Node的模塊實(shí)現(xiàn)概述
Nodejs再集成CommonJs的模塊機(jī)制的規(guī)范時(shí)進(jìn)行了取舍,同時(shí)增加了特性。
Nodejs在引入模塊,主要是分為三個(gè)步驟:
- 路徑分析
- 文件定位
- 文件編譯
同時(shí),模塊主要分為兩類。核心模塊和文件模塊。
核心模塊:
由NodeJs提供的模塊,并且部分核心模塊在NodeJS進(jìn)程啟動時(shí)就編譯成二進(jìn)制文件,加載進(jìn)了內(nèi)存中。
在引入時(shí)則省略文件定位和文件編譯兩個(gè)步驟,并且具有最高優(yōu)先級。
文件模塊:
由用戶提供的模塊,在NodeJs進(jìn)程動態(tài)運(yùn)行時(shí)進(jìn)行引入。
優(yōu)先從緩存中加載
NodeJs在引入模塊的過程中,會使用緩存進(jìn)行優(yōu)化性能。
與瀏覽器緩存文件不同,NodeJs會對引入過的文件進(jìn)行緩存,緩存編譯執(zhí)行后的對象。
此時(shí)緩存進(jìn)內(nèi)存中的模塊具有最高優(yōu)先級。核心模塊緩存檢查高于文件模塊緩存檢查。
路徑分析和文件定位
文件標(biāo)識符存在多種形式,那么對于這些差異,模塊的查找和定位也存在區(qū)別。
模塊標(biāo)識符的分析
在通過require()進(jìn)行引入模塊時(shí),需要傳入一個(gè)標(biāo)識符。
標(biāo)識符主要具有以下類型:
- 核心模塊http,buffer,fs等;
- .或..開始的相對路徑;
- 以/開始的絕對路徑;
- 非路徑形式的文件模塊,如自定義的connect模塊。
核心模塊
核心模塊在服務(wù)啟動時(shí)就已經(jīng)編譯成二進(jìn)制代碼,其加載過程最快,優(yōu)先級僅次于緩存加載。
路徑形式的模塊
以.,..和/開始的標(biāo)識符都被轉(zhuǎn)換為真實(shí)文件路徑為索引的模塊,并且在編譯后將會加載進(jìn)緩存中,其速度僅次于核心模塊加載。
自定義模塊
自定義模塊非核心模塊也不是路徑形式的標(biāo)識符,是一種特殊的文件模塊。可能是一個(gè)文件或一個(gè)包的形式,這類模塊的查找是最費(fèi)事的,也是所有方式中最慢的。
在這之前我們先知道什么是模塊路徑。
模塊路徑是Node在定位文件模塊的具體文件時(shí)制定的查找策略,具體表現(xiàn)為一個(gè)路徑組成的數(shù)組。
我們可以動手嘗試以下:
module_path.js
然后執(zhí)行這個(gè)腳本
可以看出模塊路徑的生成規(guī)則,從當(dāng)前目錄下的node_module的文件夾開始,遞歸搜索父目錄直至根目錄。
類似于Javascript的原型鏈或者作用域鏈。在加載過程中逐個(gè)嘗試模塊路徑路徑,直至找到目標(biāo)文件。
并且可以看出文件嵌套越深,耗時(shí)越久,這也是為什么自定義模塊加載最慢的原因。
文件定位
文件拓展名的分析
require()在分析標(biāo)識符時(shí),會出現(xiàn)沒有文件拓展名的情況。在這種情況,使用的是CommonJs的處理方式,是按js,json和node拓展名依次嘗試。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的若要加载模块二进制_春哥说 | 浅谈NodeJs的模块机制-2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拼接图像亮度均匀调整_液晶拼接屏如何才能
- 下一篇: fpga电平约束有什么作用_FPGA从串