极客时间返利平台,你可以在上边通过山月的链接购买课程,并添加我的微信 (shanyue94) 领取返现。
每天晚上九点 B站讲解前端工程化直播,并解答相关问题。

# 如何为一个项目指定 node 版本号

Issue

欢迎在 Gtihub Issue 中回答此问题: Issue 533 (opens new window)

  • 我: 老大,我这个项目本地白屏了,今天调了一天都没找到问题,快来看看
  • leader: (瞄了一眼) 你的 node 版本号有问题
  • 我: 老大,不能怪我跑挂了,我一个新入职的小前端怎么能够知道这个项目所需的 Node 版本号是多少呢
  • leader: 怎么不能知道,这说明你水平不到家

指定一个项目所需的 node 最小版本,这属于一个项目的质量工程。

如果对于版本不匹配将会报错(yarn)或警告(npm),那我们需要在 package.json 中的 engines 字段中指定 Node 版本号

更多质量工程问题,见 如何保障项目质量 (opens new window)

{
  "engines": {
    "node": ">=14.0.0"
  }
}

一个示例:

我在本地把项目所需要的 node 版本号改成 >=16.0.0,而本地的 node 版本号为 v10.24.1

此时,npm 将会发生警告,提示你本地的 node 版本与此项目不符。

npm WARN EBADENGINE Unsupported engine { package: 'next-app@1.0.0',
npm WARN EBADENGINE   required: { node: '>=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v10.24.1', npm: '7.14.0' } }

而 yarn 将会直接报错,提示。

error next-app@1.0.0: The engine "node" is incompatible with this module. Expected version ">=16.0.0". Got "10.24.1"

最为重要的是,项目中某些依赖所需要的 Node 版本号与项目运行时的 Node 版本号不匹配,也会报错(在 yarn 中),此时无法正常运行项目,可避免意外发生。

可看一个示例,engines 示例 (opens new window),其中 ansi-regex 该依赖所需的 node 版本号为 12+,而此时本地的 node 版本号为 10,使用 yarn 安装报错!

// 在 package.json 中,所需 node 版本号需要 >=10
{
  "engines": {
    "node": ">=10.0.0"
  }
}

// 在 package-lock.json 中,所需 node 版本号需要 >=12
{
  "node_modules/ansi-regex": {
    "version": "6.0.1",
    "engines": {
      "node": ">=12"
    }
  }
}

PS: 如果项目的 package.json 中没有 engines 字段,可查看 Dockerfile 中 node 镜像确定项目所需的 node 版本号。

Great!

nice job~ !!

Last Updated: 1/2/2022, 12:04:55 PM