为何限定项目的 Node.js 版本

首先区分三个概念nvm,npm,nodejs。

  1. Node.js:

    • Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境。
    • 它允许开发者使用 JavaScript 在服务器端编写应用程序,而不仅限于在浏览器中运行 JavaScript。
    • Node.js 提供了一系列内置的模块和 API,使得开发高性能、可扩展的网络应用变得更加容易。
    • 它采用事件驱动、非阻塞 I/O 模型,适合编写高并发的网络应用。
  2. npm (Node Package Manager):

    • npm 是 Node.js 的默认包管理器,随 Node.js 一起安装。
    • 它允许开发者发布、分享和使用 JavaScript 模块(也称为包)。
    • 通过 npm,你可以轻松地安装、管理和分享第三方模块,以及管理你自己项目的依赖。
    • npm 提供了一个庞大的模块注册中心(https://www.npmjs.com/),开发者可以在其中搜索和下载需要的模块。
    • 使用 npm 命令行工具,你可以初始化项目、安装模块、更新模块、运行脚本等。
  3. nvm (Node Version Manager):

    • nvm 是一个用于管理多个 Node.js 版本的命令行工具。
    • 在开发过程中,你可能需要在不同的项目中使用不同版本的 Node.js。nvm 允许你在同一台机器上安装和切换不同的 Node.js 版本。
    • 通过 nvm,你可以轻松地安装、卸载和切换 Node.js 版本,而不会相互干扰。
    • nvm 支持 Windows、macOS 和 Linux 等多个操作系统。

总结:

  • Node.js 是一个 JavaScript 运行时环境,用于服务器端开发。
  • npm 是 Node.js 的包管理器,用于管理 JavaScript 模块和项目依赖。
  • nvm 是一个用于管理多个 Node.js 版本的工具,方便在不同项目中切换 Node.js 版本。

为什么要限定nodejs版本?

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

如何限定?

nvm

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

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

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 执行安装前检查版本不对时抛错https://user-images.githubusercontent.com/3783096/55612524-fe178a80-57ba-11e9-9193-a76d17719003.png

yarn 执行安装前检查版本不对时抛错,而如果直接使用npm来拉包,容易出现安装依赖后,nodejs版本不支持运行这些依赖的问题,以至于需要重新安装一遍。

所以推荐使用 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(</span>Required node version <span class="pl-s1"><span class="pl-pse">${</span>version<span class="pl-pse">}</span></span>, got: <span class="pl-s1"><span class="pl-pse">${</span><span class="pl-c1">process</span>.<span class="pl-c1">version</span><span class="pl-pse">}</span></span>.<span class="pl-pds">);
process.exit(1);
}

添加 postinstall 命令到 package.json:

{
  "scripts": {
    "postinstall": "node ./checkver.js"
  }
}

运行效果:

使用 postinstall 执行 Node.js 版本的检查https://user-images.githubusercontent.com/3783096/55612510-f9eb6d00-57ba-11e9-8856-1f7347ac1ddf.png

使用 postinstall 执行 Node.js 版本的检查

为什么使用 postinstall 呢,如果使用 preinstall 岂不是更好,这样在执行安装前就能检查。但这里我们依赖了 semver 这个 npm 包,所以需要让安装先执行。

npm有时候还会与nodejs出现版本冲突,一般有两种解决办法:一种是在终端或者手动删除一遍npm和nodejs,重装对应版本nodejs时,自动安装对应版本的npm,见解决方案;一种是直接安装一个与npm版本相对应的nodejs版本,或者与nodejs版本相对应的npm版本,直接覆盖即可。

  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值