我們已經知道,`require`函數支持斜杠(`/`)或盤符(`C:`)開頭的絕對路徑,也支持`./`開頭的相對路徑。但這兩種路徑在模塊之間建立了強耦合關系,一旦某個模塊文件的存放位置需要變更,使用該模塊的其它模塊的代碼也需要跟著調整,變得牽一發動全身。因此,`require`函數支持第三種形式的路徑,寫法類似于`foo/bar`,并依次按照以下規則解析路徑,直到找到模塊位置。
1. 內置模塊
如果傳遞給`require`函數的是NodeJS內置模塊名稱,不做路徑解析,直接返回內部模塊的導出對象,例如`require('fs')`。
2. node_modules目錄
NodeJS定義了一個特殊的`node_modules`目錄用于存放模塊。例如某個模塊的絕對路徑是`/home/user/hello.js`,在該模塊中使用`require('foo/bar')`方式加載模塊時,則NodeJS依次嘗試使用以下路徑。
~~~
/home/user/node_modules/foo/bar
/home/node_modules/foo/bar
/node_modules/foo/bar
~~~
3. NODE_PATH環境變量
與PATH環境變量類似,NodeJS允許通過NODE_PATH環境變量來指定額外的模塊搜索路徑。NODE_PATH環境變量中包含一到多個目錄路徑,路徑之間在Linux下使用`:`分隔,在Windows下使用`;`分隔。例如定義了以下NODE_PATH環境變量:
~~~
NODE_PATH=/home/user/lib:/home/lib
~~~
當使用`require('foo/bar')`的方式加載模塊時,則NodeJS依次嘗試以下路徑。
~~~
/home/user/lib/foo/bar
/home/lib/foo/bar
~~~