nodejs的require是如何執行的

一般,在Node.js裏導入是經過 require函數調用進行的。
Node.js會根據 require的是相對路徑仍是非相對路徑作出不一樣的行爲。node

相對路徑

相對路徑很簡單。 例如,假設有一個文件路徑爲 /root/src/moduleA.js,包含了一個導入json

var x = require("./moduleB");

Node.js如下面的順序解析這個導入:函數

  1. 檢查/root/src/moduleB.js文件是否存在。
  2. 檢查/root/src/moduleB目錄是否包含一個package.json文件,且package.json文件指定了一個"main"模塊。 在咱們的例子裏,若是Node.js發現文件 /root/src/moduleB/package.json包含了{ "main": "lib/mainModule.js" },那麼Node.js會引用/root/src/moduleB/lib/mainModule.js。
  3. 檢查/root/src/moduleB目錄是否包含一個index.js文件。 這個文件會被隱式地看成那個文件夾下的"main"模塊。

非相對路徑

非相對模塊名的解析是個徹底不一樣的過程。
Node會在一個特殊的文件夾 node_modules裏查找你的模塊。
node_modules可能與當前文件在同一級目錄下,或者在上層目錄裏。
Node會向上級目錄遍歷,查找每一個 node_modules直到它找到要加載的模塊。
假設/root/src/moduleA.js裏使用的是非相對路徑導入:ui

var x = require("moduleB");

Node則會如下面的順序去解析 moduleB,直到有一個匹配上。

/root/src/node_modules/moduleB.js
/root/src/node_modules/moduleB/package.json (若是指定了"main"屬性)
/root/src/node_modules/moduleB/index.js 

/root/node_modules/moduleB.js
/root/node_modules/moduleB/package.json (若是指定了"main"屬性)
/root/node_modules/moduleB/index.js 

/node_modules/moduleB.js
/node_modules/moduleB/package.json (若是指定了"main"屬性)
/node_modules/moduleB/index.js
注意Node.js在步驟(4)和(7)會向上跳一級目錄。code

相關文章
相關標籤/搜索