限定项目运行所需的 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"
- }
- }
运行效果:
caption
为什么使用 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