Node?文件查找優(yōu)先級及?Require?方法文件查找策略
一、模塊規(guī)范
NodeJS
對CommonJS
進行了支持和實現,讓我們在開發(fā)node
的過程中可以方便的進行模塊化開發(fā):
- 在Node中每一個js文件都是一個單獨的模塊
- 模塊中包括CommonJS規(guī)范的核心變量:exports、module.exports、require
- 通過上述變量進行模塊化開發(fā)
而模塊化的核心是導出與導入,在Node
中通過exports
與module.exports
負責對模塊中的內容進行導出,通過require
函數導入其他模塊(自定義模塊、系統(tǒng)模塊、第三方庫模塊)中的內容
二、查找策略
require
方法接收一下幾種參數的傳遞:
- 原生模塊:http、fs、path等
- 相對路徑的文件模塊:./mod或../mod
- 絕對路徑的文件模塊:/pathtomodule/mod
- 目錄作為模塊:./dirname
- 非原生模塊的文件模塊:mod
require
參數較為簡單,但是內部的加載卻是十分復雜的,其加載優(yōu)先級也各自不同,如下圖:
從上圖可以看見,文件模塊存在緩存區(qū),尋找模塊路徑的時候都會優(yōu)先從緩存中加載已經存在的模塊
原生模塊
而像原生模塊這些,通過require
方法在解析文件名之后,優(yōu)先檢查模塊是否在原生模塊列表中,如果在則從原生模塊中加載
絕對路徑、相對路徑
如果require
絕對路徑的文件,則直接查找對應的路徑,速度最快
相對路徑的模塊則相對于當前調用require
的文件去查找
如果按確切的文件名沒有找到模塊,則 NodeJs
會嘗試帶上 .js
、.json
或 .node
拓展名再加載
目錄作為模塊
默認情況是根據根目錄中package.json
文件的main
來指定目錄模塊,如:
{ "name" : "some-library", "main" : "main.js" }
如果這是在./some-library node_modules
目錄中,則 require('./some-library')
會試圖加載 ./some-library/main.js
如果目錄里沒有 package.json
文件,或者 main
入口不存在或無法解析,則會試圖加載目錄下的 index.js
或 index.node
文件
非原生模塊
在每個文件中都存在module.paths
,表示模塊的搜索路徑,require
就是根據其來尋找文件
在window
下輸出如下:
[ 'c:\nodejs\node_modules','c:\node_modules' ]
可以看出module path
的生成規(guī)則為:從當前文件目錄開始查找node_modules
目錄;然后依次進入父目錄,查找父目錄下的node_modules
目錄,依次迭代,直到根目錄下的node_modules
目錄
當都找不到的時候,則會從系統(tǒng)NODE_PATH
環(huán)境變量查找
舉個例子
如果在/home/ry/projects/foo.js
文件里調用了 require('bar.js')
,則 Node.js 會按以下順序查找:
- /home/ry/projects/node_modules/bar.js
- /home/ry/node_modules/bar.js
- /home/node_modules/bar.js
- /node_modules/bar.js
這使得程序本地化它們的依賴,避免它們產生沖突
三、總結
通過上面模塊的文件查找策略之后,總結下文件查找的優(yōu)先級:
- 緩存的模塊優(yōu)先級最高
- 如果是內置模塊,則直接返回,優(yōu)先級僅次緩存的模塊
- 如果是絕對路徑 / 開頭,則從根目錄找
- 如果是相對路徑 ./開頭,則從當前require文件相對位置找
- 如果文件沒有攜帶后綴,先從js、json、node按順序查找
- 如果是目錄,則根據 package.json的main屬性值決定目錄下入口文件,默認情況為 index.js
- 如果文件為第三方模塊,則會引入 node_modules 文件,如果不在當前倉庫文件中,則自動從上級遞歸查找,直到根目錄
到此這篇關于Node 文件查找優(yōu)先級及 Require 方法文件查找策略的文章就介紹到這了,更多相關Node 文件查找內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章

nvm報錯Now?using?node?v版本號(64-bit)圖文解決方法