Node.js 的 模組化

XiSoil發表於2024-08-21

Node.js 中的模組

Node.js 遵循了 CommonJS 模組化規範,CommonJS 規定了模組的特性和各模組之間如何相互依賴

  • 每個模組內部,module 變數代表當前模組
  • module 變數是一個物件,它的 exports 屬性(即 module.exports)是對外的介面
  • 載入某個模組,其實是載入該模組的 module.exports 屬性。require() 方法用於載入模組

Node.js 中的第三方模組又叫做包

不同於 Node.js 中的內建模組與自定義模組,包是由第三方個人或團隊開發出來的,免費供所有人使用。Node.js 中的包都是免費且開源的

  • 由於 Node.js 的內建模組僅提供了一些底層的 API,導致在基於內建模組進行專案開發的時,效率很低
  • 包是基於內建模組封裝出來的,提供了更高階、更方便的 API,極大的提高了開發效率
  • 包和內建模組之間的關係,類似於 jQuery和 瀏覽器內建 API 之間的關係

我們可以使用這些命令在專案中新增包

npm install 包的完整名稱
#或者
npm i 包的完整名稱
npm i 包的完整名稱 包的完整名稱(加空格可以安裝多個包)
npm add 包的完整名稱

使用 npm uninstall 來解除安裝指定的包

使用映象源可以解決一些npm下載緩慢的問題

設定映象

npm 官方原始映象網址是:https://registry.npmjs.org/
淘寶 NPM 映象:http://registry.npmmirror.com
阿里雲 NPM 映象:https://npm.aliyun.com
騰訊雲 NPM 映象:https://mirrors.cloud.tencent.com/npm/
華為雲 NPM 映象:https://mirrors.huaweicloud.com/repository/npm/
網易 NPM 映象:https://mirrors.163.com/npm/
中國科學技術大學開源映象站:http://mirrors.ustc.edu.cn/
清華大學開源映象站:https://mirrors.tuna.tsinghua.edu.cn/

使用淘寶映象源加速 NPM

# new
npm config set registry https://registry.npmmirror.com
# old
npm config set registry https://registry.npm.taobao.org

使用阿里雲 映象源加速 NPM

npm config set registry https://npm.aliyun.com

使用騰訊雲映象源加速 NPM

npm config set registry http://mirrors.cloud.tencent.com/npm/

使用華為雲 映象源加速 NPM

npm config set registry https://mirrors.huaweicloud.com/repository/npm/

返回npm 官方原始映象

npm config set registry https://registry.npmjs.org/

使用那個映象,只需要 npm config set registry + 對應的映象網址就好了

npm config set registry + URL

檢視當前的映象源:

npm config get registry
包的分類

專案包

那些被安裝到專案的 node_modules 目錄中的包,都是專案包。專案包又分為兩類

  • 開發依賴包(被記錄到 devDependencies節點中的包,只在開發期間會用到)npm i 包名 -D
  • 核心依賴包(被記錄到 dependencies節點中的包,在開發期間和專案上線之後都會用到)npm i 包名

全域性包

在執行 npm install 命令時,如果提供了 -g 引數,則會把包安裝為全域性包

全域性包會被安裝到 C:\Users\使用者目錄\AppData\Roaming\npm\node_modules 目錄下

npm install 包名 -g	# 全域性安裝指定的包
npm uninstall 包名 -g	# 解除安裝全域性指定的包

注意

  • 只有工具性質的包,才有全域性安裝的必要性。因為它們提供了好用的終端命令
  • 判斷某個包是否需要全域性安裝後才能使用,可以參考官方提供的使用說明即可
規範的包結構

一個規範的包,它的組成結構,必須符合以下 3 點要求

  • 包必須以單獨的目錄而存在
  • 包的頂級目錄(點進去的目錄)下要必須包含 package.json 這個包管理配置檔案
  • package.json 中必須包含 nameversionmain這三個屬性,分別代表包的名字、版本號、包的入口(.js檔案)(require()載入的檔案)

模組的載入機制

模組在第一次載入後會被快取,多次呼叫 require() 模組的程式碼只會被執行一次。不論是內建模組、使用者自定義模組、還是第三方模組,它們都會優先從快取中載入,從而提高模組的載入效率。

  1. 內建模組的載入優先順序最高(當第三方模組和內建模組同名時)
  2. 使用 require() 載入自定義模組時,必須指定以 ./…/ 開頭的路徑識別符號。在載入自定義模組時,如果沒有指定 ./…/ 這樣的路徑識別符號,則 node 會把它當作內建模組或第三方模組進行載入。
  3. 在使用 require() 匯入自定義模組時,如果省略了檔案的副檔名,Node.js 會按順序分別嘗試載入以下的檔案
    1. 按照確切的檔名進行載入
    2. 補全 .js 副檔名進行載入
    3. 補全 .json 副檔名進行載入
    4. 補全 .node 副檔名進行載入
    5. 載入失敗,終端報錯
  4. 如果傳遞給 require() 的模組識別符號不是一個內建模組,也沒有以 ./ 或 …/ 開頭,則 Node.js 會從當前模組的父目錄開始,嘗試從 /node_modules 資料夾中載入第三方模組,如果沒有找到對應的第三方模組,則移動到再上一層父目錄中,進行載入,直到檔案系統的根目錄
  5. 假設在 ‘C:\Users\Public\Desktop\demo\node_modules\a.js’ 裡呼叫 require(‘tools’),Node.js 會按以下順序查詢
    1.C:\Users\Public\Desktop\demo\node_modules\tools
    2.C:\Users\Public\Desktop\node_modules\tools
    3.C:\Users\Public\Desktop\tools
    ....
    4.C:\tools
    5.報錯
  6. 當把目錄作為模組使用require載入時,會按照下面的步驟嘗試載入模組
    在被載入的目錄下查詢一個叫做 package.json 的檔案,並尋找 main 屬性值作為 require() 載入的入口-->(如果目錄裡沒有 package.json 檔案,或者 main 入口不存在或無法解析)試圖載入目錄下的 index.js 檔案-->在終端列印錯誤訊息,報告模組的缺失:Error: Cannot find module ‘xxx’

相關文章