一些老项目对 node 版本是有要求的,往往使用默认的新版本包安装不上,scripts 也跑不起来。

之前就遇到过运行一个小程序项目时,根据文档来,第一步安装就出错。本着办法总比问题多的理念,来一个解决一个。问题还真是一个接一个的出现。折腾头天,在解决一个包的运行问题时,发现切换到较低版本的 node 后一切安好。

所以,对于老项目,最好使用兼容性强的版本 8 或 10 的 LTS。

解决问题的根本方法是项目中要对 node 版本进行提示或锁死,否则新人仍会踩坑。

.nvmrc

在项目根目录添加 .nvmrc 文件可指定 nvm 默认的 node 版本。

$ node -v > .nvmrc

在执行 nvm use, nvm install, nvm exec, nvm runnvm which 这些命令时,都会从该文件读取版本信息。

在新的环境下,clone 项目后通过 nvm install && nvm use 就可使用上与项目相匹配的 node 版本。

engines

通过在 package.json 中指定 engines 字段,可限定项目使用的 node 版本,甚至 npm 版本。

不过,通常情况下,配置之后你会发现,该字段只对 yarn 生效:

$ yarn
yarn install v1.22.5
info No lockfile found.
[1/5] Validating package.json...
error test-node@1.0.0: The engine "node" is incompatible with this module. Expected version ">=14". Got "10.22.0"
error Found incompatible module.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

而使用 npm 进行安装时,直接成功没有提示,连 warnning 都没有:

$ npm i
npm WARN test-node@1.0.0 No description
npm WARN test-node@1.0.0 No repository field. up to date in 0.48s
found 0 vulnerabilities

根据 npm 文档中关于 engines 的部分,发现要让 npm 识别 engines 字段,还需要配置 engine-strict: true,但是进一步看,

This feature was removed in npm 3.0.0

王德发?

好消息是,进一步研究发现,创建 .npmrc 文件配置如下内容:

engine-strict = true

就可以使得 engines 字段对 npm 生效了。

$ npm i
npm ERR! code ENOTSUP
npm ERR! notsup Unsupported engine for test-node@1.0.0: wanted: {"node":">=14"} (current: {"node":"10.22.0","npm":"6.14.6"})
npm ERR! notsup Not compatible with your version of node/npm: test-node@1.0.0
npm ERR! notsup Not compatible with your version of node/npm: test-node@1.0.0
npm ERR! notsup Required: {"node":">=14"}
npm ERR! notsup Actual: {"npm":"6.14.6","node":"10.22.0"} npm ERR! A complete log of this run can be found in:
npm ERR! /Users/wayongliu/.npm/_logs/2020-09-14T13_43_33_020Z-debug.log

结合之前关于项目中私有 npm 源的设置,所以在项目中添加 .npmrc 真的是最佳实践了。

相关资源

The text was updated successfully, but these errors were encountered:

锁定项目的 node 版本的更多相关文章

  1. eclipse 修改maven项目的jdk版本

      eclipse 修改maven项目的jdk版本 CreationTime--2018年6月8日10点29分 Author:Marydon 1.情景展示 jdk版本太低,如何修改 2.错误方式 第一 ...

  2. Eclipse中修改某个java项目的jdk版本【我】

    Eclipse中修改某个项目的jdk版本,主要有下面4个地方 右键项目名,有如下3个地方 另外如果要在Tomcat中运行,还可能需要设置运行这个项目的Tomcat的容器的 jdk 版本,设置方式:

  3. 限定项目的 Node.js 版本

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

  4. maven命令更新子父项目的pom版本

    Q:一个maven项目,有多个子module,在顶级父pom.xml里设置<version>1.0.0-SHAPSHOT</version>,在子pom.xml里都用了 < ...

  5. Eclipse.修改项目的JDK版本

    1.我实际使用过程中,只是修改了 项目右键-->Properties-->左侧选择"Java Compiler" -->右侧的"JDK Complian ...

  6. 在myeclipse中换项目的jdk版本,你需要做哪些?

    首先,我们必须把jdk在系统中安装好,环境变量配好,才能进行下一步的操作…… 然后在点击项目,右键选择Properties,找到Java Build Path,拉倒最下面,把原来的jdk版本给remo ...

  7. Pycharm使用中背景颜色和更改项目的Python版本

    一.背景颜色 颜色是每一个人都会去更改的,而且可以保护眼睛! 第二步: 选择图中画框的位置,便可以更改背景颜色! 二.项目版本的更改: python2 和 python3 有很大的不同,使用pytho ...

  8. IDEA-Maven项目的jdk版本设置

    在 Intellij IDEA 中,我们需要设置 Settings 中的 Java Compiler 和 Project Structure 中的 Language Level 中的 jdk 版本为自 ...

  9. 有什么类方法或是函数可以查看某个项目的Laravel版本的?

    查看composer.json文件: "require": { "php": ">=7.0.0", "fideloper/p ...

随机推荐

  1. vue-axios插件、django-cors插件、及vue如何使用第三方前端样式库:element/jQuery/bootstrap

    目录 一.vue的ajax插件:axios 1.安装axios 2.axios参数 二.CORS跨域问题(同源策略) 1.Django解决CORS跨域问题方法 三.前端请求携带参数及Django后台如 ...

  2. Adapper 入门

    Adapper 入门 特点 单实体实现自动装配.连表查询需要自己处理装配,查看查询. 原生sql语句. 连接接口: IDbConnection connection = new SqlConnecti ...

  3. 《C++ Primer》笔记 第8章 IO库

    iostream定义了用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型. 标准库使我们能忽略这些不同类型的流之间的差异,这是通过继承机制 ...

  4. POJ-2240(floyd算法简单应用)

    Arbitrage poj-2240 #include<iostream> #include<cstdio> #include<cstring> #include& ...

  5. pytorch(11)模型创建步骤与nn.Module

    模型创建与nn.Module 网络模型创建步骤 nn.Module graph LR 模型 --> 模型创建 模型创建 --> 构建网络层 构建网络层 --> id[卷积层,池化层, ...

  6. MySQL 表的约束与数据库设计

    DQL 查询语句 排序 # 单列排序 * 只按某一个字段进行排序,单列排序 # 组合排序 * 同时对多个字段进行排序,如果第1个字段相等,则按照第2个字段排序,依次类推 * 语法: # 具体操作 * ...

  7. Android实现三角形气泡效果方式汇总

    在开发过程中,我们可能会经常遇到这样的需求样式: 这张图是截取京东消息通知的弹出框,我们可以看到右上方有个三角形的气泡效果,这只是其中一种,三角形的方向还可以是上.下.左.右. 通过截图可以发现,气泡 ...

  8. Docker SDK api操作Docker

    下载包 go get "github.com/docker/docker/api/types" go get "github.com/docker/docker/clie ...

  9. Java并发编程之多线程

    线程 进程/线程/协程/管程 进程:操作系统会以进程为单位,分配系统资源(CPU时间片.内存等资源),是资源分配的最小单位 进程间通信(IPC): 管道(Pipe) 命名管道(FIFO) 消息队列(M ...

  10. 对控制器类型“StudentController”的操作“Edit”的当前请求在下列操作方法之间不明确:

    "/"应用程序中的服务器错误. 对控制器类型"StudentController"的操作"Edit"的当前请求在下列操作方法之间不明确:类型 ...