Node.js 从v12升级到v18

1,354 阅读3分钟

Node.js升级背景

当前node版本 12,官方已不再维护。详见Node.js发布计划

活跃版本发布时间表(截止2014.01.23) image.png 已终止维护版本(截止2014.01.23) image.png

升级流程

选择Node.js版本

Node.js发布计划可知,除了Node.js 18处于稳定的维护状态外,其余版本仍在更新。且根据官方v18新特性说明来看,选择了v18。

管理Node.js版本

使用nvm管理node版本,完整用法参考官方文档

  1. 安装nvm

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

  1. nvm用法
// 安装最新版node
$ nvm install node

// 安装指定版node
$ nvm install 16.3.0

// 查看所有可用版本
$ nvm ls-remote

// 使用指定版本node
$ nvm use 16.3.0

限制node版本

安装时限制版本

为保证项目的开发者们环境统一,package.json中增加engines限制node版本

"engines": {
    "node": "18.x"
  }

nvm 快捷切换版本

在.nvmrc文件中(不存在就创建)指定Node.js版本

v.18.3
$ nvm use #无需指定版本号,会自动使用.nvmrc文件中指定的版本

本地环境升级

升级node版本

  1. 查看node版本
$ node -v

  1. 安装node v18,安装完成后会自动切换到v18
$ node -i 18.3
  1. 查看本地node
$ nvm ls

image.png

更新项目依赖

  1. 删除package.lock.json
  2. 删除node_modules/
  3. 重新安装依赖包
$ rm -rf package.lock.json
$ rm -rf node_modules
$ npm cache clean --force
$ npm install
  1. 重新安装全局依赖包,参考# How to properly upgrade node using nvm
nvm install NEW_VERSION --reinstall-packages-from=OLD_VERSION

// eg: nvm install 18.3.0 —reinstall-packages-from=12.22.12

注:当时升级node时没有使用这种方式,而是在遇到XXX not found报错时,单独安装了全局依赖包

验证过程

依次执行开发模式脚本、生产模式脚本验证项目是否可以正常运行

$ npm run dev
$ npm run build

发布系统环境升级

过程同本地开发环境类似。

  1. 指定发布系统的node版本;
  2. 清除旧的依赖包(一般情况下,发布系统环境没有node_modules/,只清除npm缓存即可)
$ npm cache clean --force
  1. 安装依赖包
$ npm i

问题&解决

npm i 没有安装devDependencies下的依赖包

在发布系统环境上,出现XXX not found问题。本地环境开发模式无问题,可知依赖包存在。切换至生产模式,npm inode_modules/下没有依赖包文件,手动安装依赖后,又有其他依赖包找不到,后发现找不到的均是devDependencies依赖。

根据npm官方介绍,当 NODE_ENV === 'production',或者npm i --productionnpm 不会安装devDependencies下列出的模块。发布系统环境是生产环境,NODE_ENV = production,故没有安装开发依赖。

By default, npm install will install all modules listed as dependencies in package.json.

With the --production flag (or when the NODE_ENV environment variable is set to production), npm will not install modules listed in devDependencies. To install all modules listed in both dependencies and devDependencies when NODE_ENV environment variable is set to production, you can use --production=false.

NOTE: The --production flag has no particular meaning when adding a dependency to a project.

解决方案

本次采用了方式一,方式二未验证

// 方式一
NODE_ENV=development
npm cache clean --force
# 安装依赖
npm install
NODE_ENV=production

// 方式二(待验证)
npm cache clean --force
# 安装依赖
npm install --production=false

编译plyr失败

升级node版本到18后,启动项目,以下错误,当前plyr版本 3.7.8

ERROR  Failed to compile with 1 errors                                

error  in ./node_modules/plyr/dist/plyr.min.js

Module parse failed: Unexpected token (1:11056)
You may need an appropriate loader to handle this file type.

解决方案

"plyr": "3.6.4" // 写死版本

方法来源:github.com/sampotts/pl…