Node.js 中的模組
Node.js
遵循了 CommonJS
模組化規範,CommonJS
規定了模組的特性和各模組之間如何相互依賴
- 每個模組內部,
module
變數代表當前模組 module
變數是一個物件,它的exports
屬性(即module.exports
)是對外的介面- 載入某個模組,其實是載入該模組的
module.export
s 屬性。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
中必須包含name
,version
,main
這三個屬性,分別代表包的名字、版本號、包的入口(.js
檔案)(require()
載入的檔案)
模組的載入機制
模組在第一次載入後會被快取,多次呼叫 require()
模組的程式碼只會被執行一次。不論是內建模組、使用者自定義模組、還是第三方模組,它們都會優先從快取中載入,從而提高模組的載入效率。
- 內建模組的載入優先順序最高(當第三方模組和內建模組同名時)
- 使用 require() 載入自定義模組時,必須指定以
./
或…/
開頭的路徑識別符號。在載入自定義模組時,如果沒有指定./
或…/
這樣的路徑識別符號,則 node 會把它當作內建模組或第三方模組進行載入。 - 在使用 require() 匯入自定義模組時,如果省略了檔案的副檔名,Node.js 會按順序分別嘗試載入以下的檔案
- 按照確切的檔名進行載入
- 補全
.js
副檔名進行載入 - 補全
.json
副檔名進行載入 - 補全
.node
副檔名進行載入 - 載入失敗,終端報錯
- 如果傳遞給 require() 的模組識別符號不是一個內建模組,也沒有以 ./ 或 …/ 開頭,則 Node.js 會從當前模組的父目錄開始,嘗試從 /node_modules 資料夾中載入第三方模組,如果沒有找到對應的第三方模組,則移動到再上一層父目錄中,進行載入,直到檔案系統的根目錄
- 假設在 ‘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.報錯 - 當把目錄作為模組使用require載入時,會按照下面的步驟嘗試載入模組
在被載入的目錄下查詢一個叫做package.json
的檔案,並尋找 main 屬性值作為 require() 載入的入口-->(如果目錄裡沒有package.json
檔案,或者 main 入口不存在或無法解析)試圖載入目錄下的index.js
檔案-->在終端列印錯誤訊息,報告模組的缺失:Error: Cannot find module ‘xxx’