極簡node_modules快速瞭解

一、概述

在 Node。js 模組系統中,每個檔案都被視為一個獨立的模組;

npm install 執行完畢後,我們可以在 nodemodules 中看到所有依賴的包。雖然使用者無需關注這個目錄裡的資料夾結構細節,只管在業務程式碼中引用依賴包即可;node_modules是安裝node後用來存放用包管理工具下載安裝的包的資料夾。比如webpack、gulp、grunt這些工具。在node。js中模組與檔案是一一對應的,也就是說一個node。js檔案就是一個模組。

二、模組型別

node。js中模組有兩種型別:核心模組和檔案模組;

三、核心模組

Node。js 核心模組會被編譯成二進位制,核心模組定義在 Node。js 原始碼的

lib/

目錄下,

require()

總是會

優先

載入核心模組;

核心模組直接使用名稱獲取:

var http=require(‘http’);

四、檔案模組

如果按確切的檔名沒有找到模組,則 Node。js 會嘗試帶上

。js

。json

。node

拓展名再載入。

const circle = require(‘。/circle。js’);console。log(`半徑為 4 的圓的面積是 ${circle。area(4)}`);

1、。js 檔案會被解析為 JavaScript 文字檔案, 。json 檔案會被解析為 JSON 文字檔案。 。node 檔案會被解析為透過 process。dlopen() 載入的編譯後的外掛模組。

2、以 ‘/’ 為字首的模組是檔案的絕對路徑。 例如, require(‘/home/marco/foo。js’) 會載入 /home/marco/foo。js 檔案。

3、以 ‘。/’ 為字首的模組是相對於呼叫 require() 的檔案的。 也就是說, circle。js 必須和 foo。js 在同一目錄下以便於 require(‘。/circle’) 找到它。

4、當沒有以 ‘/’、 ‘。/’ 或 ‘。。/’ 開頭來表示檔案時,這個模組必須是一個核心模組或載入自 node_modules 目錄。

5、如果給定的路徑不存在,則 require() 會丟擲一個 code 屬性為 ‘MODULE_NOT_FOUND’ 的 Error。

五、目錄模組

可以把程式和庫放到一個單獨的目錄,然後提供一個單一的入口來指向它。把目錄遞給

require()

作為一個引數,有三種方式:

1、第一種方式是在根目錄下建立一個

package。json

檔案,並指定一個

main

模組。 例子,

package。json

檔案類似:

{ “name” : “some-library”, “main” : “。/lib/some-library。js” }

如果這是在

。/some-library

目錄中,則

require(‘。/some-library’)

會試圖載入

。/some-library/lib/some-library。js

這就是 Node。js 處理

package。json

檔案的方式。

如果目錄裡沒有

package。json

檔案,或者

‘main’

入口不存在或無法解析,則 Node。js 將會試圖載入目錄下的

index。js

index。node

檔案。 例如,如果上面的例子中沒有

package。json

檔案,則

require(‘。/some-library’)

會試圖載入:

。/some-library/index。js

。/some-library/index。node

2、如果傳遞給

require()

的模組識別符號不是一個核心模組,也沒有以

‘/’

‘。。/’

‘。/’

開頭,則 Node。js 會從當前模組的父目錄開始,嘗試從它的

/node_modules

目錄里加載模組。 Node。js 不會附加

node_modules

到一個已經以

node_modules

結尾的路徑上。如果還是沒有找到,則移動到再上一層父目錄,直到檔案系統的根目錄。

例如:如果在

‘/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

3、從全域性目錄載入

如果

NODE_PATH

環境變數被設為一個以冒號分割的絕對路徑列表,則當在其他地方找不到模組時 Node。js 會搜尋這些路徑;

$HOME/。node_modules

$HOME/。node_libraries

$PREFIX/lib/node