Skip to main content
席宇博客

欢迎访问席宇博客

解决nodejs更新到v18后旧项目报错

背景 #

去年我发现使用的电脑性能太差了,同时开两个项目内存就会爆满,导致各种卡顿及闪退,用起来很不爽,我就自费买了个8g内存,组成16g后内存占用明显缓解了,启动两个项目基本上只占用一半内存。然后我又发现第二个问题:笔记本的温度不对,长期运行待机下,温度能达到90度撞到功耗墙,同时能闻到一股烧硬塑料的味道,摸了一下出风口几乎没有风力,我又自费给笔记本清了一下灰,真是自费上班第一人,维修工程师拆机涂硅脂清灰一气呵成,我看他清理出了大片结块的灰尘,就是这玩意堵住了出风口。清灰后果然好了很多,鲁大师烤机10分钟 温度温度60+度。 但是启动项目还是很慢,以及npm i安装新的依赖时偶尔会报错,重新安装能解决。删除依赖包的速度很慢,反正不是一个合格的固态硬盘的速度,硬盘我也不方便换,只能另想办法了。于是就想到之前看新闻说nodejs18更换了最新的v8引擎,性能提升很大,于是就...

nvm install 18.13.0
nvm use 18.13.0

报错及解决 #

安装完最新版本神清气爽,立马npm run dev启动项目,发现报了个错

{
  opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

搜索引擎搜索后,是nodev17以后的版本都不支持openssl的一个加密算法了,解决方法也很简单 在环境变量-系统变量中添加变量名"NODE_OPTIONS", 变量值"--openssl-legacy-provider",重启电脑后再运行旧项目,就可以跳过这个报错正常启动了。系统变量

我踩过的坑 #

一般情况下上个步骤修改环境变量就可以了,但是我添加环境变量始终无效,一直报这个错,不知原因,于是开始了漫长的踩坑之路。首先改为采用另一种解决方法:配置临时变量。 即先设置临时变量,再运行项目

set NODE_OPTIONS=--openssl-legacy-provider
npm run dev

这样也不无法运行项目,改为另一种解决方案:在dev的命令里配置node临时变量并启动项目。 即把package.json中的

...
"scripts": {
    "dev": "vue-cli-service serve",
    ...
  },
...

改为

...
"scripts": {
    "dev": "SET NODE_OPTIONS=--openssl-legacy-provider &&vue-cli-service serve",
    ...
  },
...

然后再npm run dev,这样成功运行老项目了,但是!!!多人协作项目我不可能把这玩意提交到仓库去,也不可能每次手动改自己本地的package.json文件,那也太蠢了。绕了一圈又回到最开始,先搞清楚为什么环境变量无效,我一直使用的是vscode的终端,在终端输入

$env:NODE_OPTIONS

打印为空,再输入

$env:Path
C:\ProgramData\Anaconda3;C:\ProgramData\Anaconda3\Library\mingw-w64\bin;...

能打印出这个原来就配好的环境变量Path,打不开NODE_OPTIONS。我又去win10的系统变量里反复确认我添加好了,这就奇怪了,我又打开系统的powershell打印变量,奇迹出现了

$env:NODE_OPTIONS
--openssl-legacy-provider

powershell能打印出NODE_OPTIONS,原来是vscode的bug,它没有正确的加载到最新的环境变量,而我一直没有怀疑是vscode的原因,害我排除了这么久的问题,虽然也有一些收获。我猜重新安装vscode能解决这个bug,但我已经不想折腾了,以后只在powershell里npm run dev启动项目就行了,哪天有空再重装vscode吧。对了,升级后性能是有提升,启动项目快了,内存占用也更稳定了。