天天看點

子產品

在Node中引入子產品,需要經曆如下3個步驟

1.路徑分析

2.檔案定位

3.編譯執行

在Node中,子產品分為兩類,一類是Node提供的子產品,稱為核心子產品,一類是使用者編寫的,稱為檔案子產品

核心子產品在Node源碼編譯過程中,編譯進了二進制執行檔案。在Node程序啟動時,部分核心子產品就被直接加載到了記憶體中,是以在引入時,檔案定位和編譯執行的步驟省略了,并在路徑分析時優先判斷,是以速度快

檔案子產品則是動态加載的,需要完整的路徑分析、檔案定位、編譯執行過程,速度比加載核心子產品要慢

Node對于引入過的子產品都會進行緩存,以減少二次引入時的開銷,且緩存的是編譯和執行之後的對象,不論是哪種子產品,require()對相同子產品的二次加載都一律采用緩存優先的方式,核心子產品緩存檢查優先檔案子產品

require接收一個辨別符作為參數,辨別符主要分為一下幾類:

1 核心子產品,如http、fs、path

2 .或..開始的相對路徑檔案子產品

3 以/開始的絕對路徑檔案子產品

4 非路徑形式的檔案子產品,如自定義的子產品(如node_modules中的,查找速度最慢)

node_modules中的都是自定義子產品

自定義子產品的引入會沿着目前目錄逐級向上層找node_modules,有點類似原型鍊查找,是以路徑越深,查找子產品越耗時

require在分析辨別符的過程中,若無擴充名,會按照.js .json .node次序補足,依次嘗試

在分析辨別符過程中,require通過分析檔案擴充名之後,可能沒有查找到對應檔案,但卻得到一個目錄,此時會當做包來處理。

1.首先查找package.json中的main屬性,對指定檔案名進行定位,若缺少檔案名,則進入擴充名分析,若main中指定的檔案若無,或壓根就沒有package.json檔案,Node會将index當做預設檔案名

2..然後依次查找index.js index.json index.node,若還是沒有定位到檔案,則進入下一個子產品路徑查找,若最終依然沒有查找到目标檔案,抛出異常