当前位置: 首页 > news >正文

限定项目的 Node.js 版本

限定项目运行所需的 Node.js 版本可保证项目在一个稳定可预期的环境中运行,减少不必要的故障。甚至有些依赖库只能工作于某些版本下。同时,不加以限制的话,在多人合作的项目中恐怕会引起环境不一致带来的兼容性问题,部署上也会存在相同的问题。

为项目指定 Node.js 的版本可通过版本管理器,或者通过 package.json 中添加相应属性来实现。

nvm

管理 Node.js 的版本最好可通过相应的版本管理器来完成,比如 nvm。用法在 nvm --help 中描述得很详尽。

通过在项目根目录创建一个 .nvmrc,其中写上需要的 Node.js 版本号。这个版本号不一定是数字,可以是 nvm 能够理解的其他别称,详见 nvm --help 中对 <version> 的描述。

Note: <version> 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 执行安装前检查版本不对时抛错

所以推荐使用 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

相关文章:

  • [基础]MySQL中的数据类型
  • cj
  • alexa跳过10万,直杀4万名
  • P5282 【模板】快速阶乘算法(多项式运算+拉格朗日插值+倍增)
  • 脚本自动安装rkhunter检查rootkit
  • 第二次会议(2019.4.5)
  • 30 个重点是 RHCE 考试的主要方向
  • 最长双回文串
  • 实现图片滑块滚动条效果
  • 关于GPRS 拨号上网配置
  • 141. 环形链表
  • 搞笑集合
  • 正式搬家到博客园
  • C# 和 c++的语法不同点
  • 我的新浪微博
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 2017年终总结、随想
  • ES6 ...操作符
  • Fundebug计费标准解释:事件数是如何定义的?
  • IP路由与转发
  • JavaScript的使用你知道几种?(上)
  • jdbc就是这么简单
  • js写一个简单的选项卡
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • text-decoration与color属性
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • Vue2 SSR 的优化之旅
  • 二维平面内的碰撞检测【一】
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 什么是Javascript函数节流?
  • 新书推荐|Windows黑客编程技术详解
  • 学习ES6 变量的解构赋值
  • 一份游戏开发学习路线
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ###项目技术发展史
  • #{}和${}的区别?
  • #if和#ifdef区别
  • #mysql 8.0 踩坑日记
  • $.ajax()参数及用法
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (07)Hive——窗口函数详解
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (175)FPGA门控时钟技术
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (SpringBoot)第七章:SpringBoot日志文件
  • (二)springcloud实战之config配置中心
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (十三)Flask之特殊装饰器详解
  • (转) Android中ViewStub组件使用