限定項目的 Node.js 版本
限定項目運作所需的 Node.js 版本可保證項目在一個穩定可預期的環境中運作,減少不必要的故障。甚至有些依賴庫隻能工作于某些版本下。同時,不加以限制的話,在多人合作的項目中恐怕會引起環境不一緻帶來的相容性問題,部署上也會存在相同的問題。
為項目指定 Node.js 的版本可通過版本管理器,或者通過 package.json 中添加相應屬性來實作。
nvm
管理 Node.js 的版本最好可通過相應的版本管理器來完成,比如 nvm。用法在 nvm --help 中描述得很詳盡。
通過在項目根目錄建立一個 .nvmrc,其中寫上需要的 Node.js 版本号。這個版本号不一定是數字,可以是 nvm 能夠了解的其他别稱,詳見 nvm --help 中對 的描述。
Note: refers to any version-like string nvm understands. This includes:
full or partial version numbers, starting with an optional "v" (0.10, v0.1.2, v1)
default (built-in) aliases: node, stable, unstable, iojs, system
custom aliases you define with nvm alias foo
-- nvm 幫助資訊中對 版本号的描述
示例:
将目前版本寫入
$ node -v > .nvmrc
使用 5.9 的版本
$ echo "5.9" > .nvmrc
使用最新的 LTS (Long-term Support) 版本
$ echo "lts/*" > .nvmrc
使用最新的 Node.js 版本
$ echo "node" > .nvmrc
在執行如下這些指令時,會自動讀取 .nvmrc 中版本号以應用上,
nvm use
nvm install
nvm exec
nvm run
nvm which
這樣協作者将項目 clone 下來後直接 nvm use 就直接切換到相應版本,如果本地沒有安裝,nvm install 則會安裝相應版本。
engines
根據 npm-package 文檔的描述,可以在 package.json 中通過 engines 屬性指定 Node.js 的版本。
{
"engines": { "node": ">=0.10.3 <0.12" }
}
甚至可以限定 npm 的版本:
"engines": { "npm": "~1.0.20" }
有趣的是,在執行 npm install 安裝項目依賴時,這個設定并不生效,相反,非官方的 yarn 是有效(respect)的,它會檢查這裡的設定,如果目前環境與所需不比對,直接報錯,這是我們期望的結果:
yarn 執行安裝前檢查版本不對時抛錯
是以推薦使用 yarn。
如果使用的 npm 怎麼辦呢。隻能手動寫腳本來做這個事情了。
$ npm i -D semver
$ touch checkver.js
實作我們檢查版本的邏輯:
checkver.js
const semver = require("semver");
const { engines } = require("./package");
const version = engines.node;
if (!semver.satisfies(process.version, version)) {
console.error(
Required node version ${version}, got: ${process.version}.
);
process.exit(1);
添加 postinstall 指令到 package.json:
"scripts": {
"postinstall": "node ./checkver.js"
運作效果:
使用 postinstall 執行 Node.js 版本的檢查
使用
postinstall
執行 Node.js 版本的檢查
為什麼使用 postinstall 呢,如果使用 preinstall 豈不是更好,這樣在執行安裝前就能檢查。但這裡我們依賴了 semver 這個 npm 包,是以需要讓安裝先執行。
相關資源
creationix/nvm
How to Lock down Your Project’s Node Version Using .Nvmrc Or engines.
npm-package.json
原文位址
https://www.cnblogs.com/Wayou/p/restrict_node_version.html