這是前端工程化的系列文章
版本號組成
node package 版本號由四部分組成:major.minor.patch[-prerelease],比如:1.0.2-beta.1,其中 prerelease 可選。
- major:代表主版本號,通常在需要提交不能向下兼容的情況下對該版本號進行升級
- minor:代表次版本號,通常在新增功能時才對該版本號進行升級
- patch:代表修復版本號,升級該版本號通常代表修復一些bug,但沒有新增功能或者存在不向下兼容的功能
- prerelease:帶有該版本號的包通常表示在測試階段,尚未穩定,通常不建議用户安裝。
prerelease 説明: alpha、beta、rc
- alpha: 代表內部測試版,會有很多Bug,是比beta更早的版本,一般不建議對外發布
- beta: 相對alpha版本已有了很大的改進,但還是存在一些缺陷,需要經過多次測試來進一步消除
- rc:Release Candidate顧名思義就是正式發佈的候選版本。和Beta版最大的差別在於Beta階段會一直加入新的功能,但是到了RC版本,幾乎就不會加入新的功能了,而主要着重於除錯! RC版本是最終發放給用户的最接近正式版的版本,發行後改正bug就是正式版了,就是正式版之前的最後一個測試版
版本發佈最佳實踐
為了幫助依賴您的代碼的開發人員,我們建議您從 1.0.0 開始您的包版本並按如下方式遞增
major:代表主版本號,通常在需要提交不能向下兼容的情況下對該版本號進行升級
minor:代表次版本號,通常在新增功能時才對該版本號進行升級
patch:代表修復版本號,升級該版本號通常代表修復一些bug,但沒有新增功能或者存在不向下兼容的功能
prerelease:帶有該版本號的包通常表示在測試階段,尚未穩定,通常不建議用户安裝。
| 代碼狀態 | 階段 | 規則 | 示例版本 |
|---|---|---|---|
| 首次發佈 | 新產品 | 從 1.0.0 開始 | 1.0.0 |
| 向後兼容的缺陷修復 | 補丁版本 | 增加第三個數字 | 1.0.1 |
| 向後兼容的新功能 | 次要版本 | 增加中間數字並將最後一位重置為零 | 1.1.0 |
| 破壞向後兼容性的更改 | 要版本 | 增加第一位數字並將中間和最後一位數字重置為零 | 2.0.0 |
安裝 NPM 時的版本控制
我們經常看到,在 package.json 中各種依賴的不同寫法:
"dependencies": {
"signale": "1.4.0",
"figlet": "*",
"react": "16.x",
"table": "~5.4.6",
"yargs": "^14.0.0"
}
前三個容易理解:
- "signale": "1.4.0":固定版本號
- "figlet": "*":任意版本號(即 >=0.0.0)
- "react": "16.x":匹配主要版本(>=16.0.0 < 17.0.0)
- "react": "16.3.x":匹配主要版本和次要版本(>=16.3.0 <16.4.0)
再看看後面兩個,版本號包含 ~ 和 ^ 符號:
- ~:當安裝依賴時獲取到有最新版本時,安裝到 x.y.z 中 z 的最新版本。即保持主版本號、次版本號不變的情況下,保持修訂號的最新版本
- ^:當安裝依賴時獲取到由最新版本時,安裝到 x.y.z 中 y 和 z 都為最新版本。即保持主版本號不變的情況下,保持次版本號、修訂版本號為最新版本。
-
當主版本號為 0 的情況,會被認為是一個不穩定版本,情況與上面不同:
- 主版本號和次版本號都為 0: ^0.0.z、~0.0.z 都被當作固定版本,安裝依賴時均不會發生變化。
- 主版本號為 0: ^0.y.z 表現和 ~0.y.z 相同,只保持修訂號為最新版本。
除此以外,還包含以下規則:
>:接受高於指定版本的任何版本>=:接受等於或高於指定版本的任何版本<=:接受等於或低於指定版本的任何版本<:接受低於指定版本的任何版本=:接受確切的版本-:接受一定範圍的版本,例如 2.1.0 - 2.6.2||:組合集合,例如 < 2.1 || > 2.6- 可以合併其中一些符號,例如 1.0.0 || >= 1.1.0 < 1.2.0 即使用 1.0.0 或從 1.1.0 開始但低於 1.2.0 的版本。
使用 npm 安裝
npm install
分5個階段執行:
- 讀取 package.json 文件裏聲明的項目所需的包和版本
- 分析 package.json 依賴關係
- 下載 npm 包和依賴項。
- 安裝 npm 包和依賴項。
-
把 npm 包和依賴項的變化寫進 package-lock.json
npm ci
分6個階段執行:
- 檢查 package-lock.json文件,如果不存在則退出
- 刪除 node_modules 文件夾 (相當於刪除已經安裝的 npm 包)
- 讀取 package-lock.json 以確定項目特定的包版本和依賴項
- 安裝這些特定版本的 npm 和依賴項
- 通過對比 package-lock.json 驗證安裝的完整性
- 不更新 package-lock.json。
注意事項: - 僅當 package-lock.json 或者 npm-shrinkwrap.json 存在於工作目錄中時,該命令才能正常執行;如果該 package-lock 文件丟失,命令無法執行
- package-lock.json 或 npm-shrinkwrap.json 中聲明的安裝包應該也存在於 package.json 文件聲明裏,否則它將退出。
npm install vs npm ci
npm install會在你允許的版本里安裝最新的版本,例如 package.json 文件聲明的依賴包A版本 ^1.1.2,當 A存在 1.2.0 時,實際會安裝 1.2.0; 而npm ci則會嚴格按照 package-lock.json 裏聲明的版本進行版本安裝- 所以
npm ci不更新 package-lock.json,而npm install則可能會更新 package-lock.json npm ci在進行安裝時會刪除 node_modules 的內容,而npm install則不會
總之,npm ci 能嚴格按照聲明版本進行安裝,是一種比較安全的安裝方式。
總結
本文內容講了 NPM的版本介紹、版本發佈、版本安裝和使用 npm 工具安裝 NPM 的知識。後續我們會講到其他版本管理(如 Yarn、Pnpm)工具安裝 npm 的內容以及它們之間的聯繫和對比~
參考
- https://github.com/canvasT/blog/issues/2
- https://tsejx.github.io/node-guidebook/overview/ecology/npm-v...
- https://nodejs.cn/npm/packages-and-modules/contributing-packa...