前言

这是在一次更新NodeJs版本后项目出现的问题,具体为什么在最开始可以运行,后续出现依赖问题以及不得而知,
可能是因为更新了NodeJs版本,出现了不兼容问题,但是理论上来说,NodeJs的版本更新不会出现这种问题,
所以这里记录一下,以防以后再次出现这种问题。

依赖问题描述

以及记不得最开始使用的NodeJs版本是多少了大概是16.20.0,然后更新到了18.16.0,然后就出现了问题,
在安装依赖的时候,会出现依赖安装失败问题,具体原因是html-webpack-plugin这个依赖我在这里使用的是5.5.0,
然后在安装的时候会出现这个问题,具体的错误信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: ruoyi@3.8.1
npm ERR! Found: html-webpack-plugin@5.5.3
npm ERR! node_modules/html-webpack-plugin
npm ERR! dev html-webpack-plugin@"^5.5.1" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer html-webpack-plugin@"^3.0.0 || ^4.0.0" from script-ext-html-webpack-plugin@2.1.5
npm ERR! node_modules/script-ext-html-webpack-plugin
npm ERR! dev script-ext-html-webpack-plugin@"2.1.5" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.

这里的意思是说,html-webpack-plugin这个依赖的版本是5.5.3,需要使用的webpack版本是5,但是在script-ext-html-webpack-plugin这个依赖中,
需要的版本是3.0.0或者4.0.0,但是这里的版本是webpack5,所以如果要解决这个问题,需要将html-webpack-plugin这个依赖的版本降低到4及以下。

运行问题描述

由于之前更新了NodeJs版本,所以在运行的时候会出现一些问题,具体的错误信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
node:internal/crypto/hash:71
this[kHandle] = new _Hash(algorithm, xofLen);
^

Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:71:19)
at Object.createHash (node:crypto:133:10)
at module.exports (C:\Users\Peridot\Escritorio\proyectos\DoneWithIt\node_modules\webpack\lib\util\createHash.js:135:53)
at NormalModule._initBuildHash (C:\Users\Peridot\Escritorio\proyectos\DoneWithIt\node_modules\webpack\lib\NormalModule.js:417:16)
at handleParseError (C:\Users\Peridot\Escritorio\proyectos\DoneWithIt\node_modules\webpack\lib\NormalModule.js:471:10)
at C:\Users\Peridot\Escritorio\proyectos\DoneWithIt\node_modules\webpack\lib\NormalModule.js:503:5
at C:\Users\Peridot\Escritorio\proyectos\DoneWithIt\node_modules\webpack\lib\NormalModule.js:358:12
at C:\Users\Peridot\Escritorio\proyectos\DoneWithIt\node_modules\loader-runner\lib\LoaderRunner.js:373:3
at iterateNormalLoaders (C:\Users\Peridot\Escritorio\proyectos\DoneWithIt\node_modules\loader-runner\lib\LoaderRunner.js:214:10)
at Array.<anonymous> (C:\Users\Peridot\Escritorio\proyectos\DoneWithIt\node_modules\loader-runner\lib\LoaderRunner.js:205:4)
at Storage.finished (C:\Users\Peridot\Escritorio\proyectos\DoneWithIt\node_modules\enhanced-resolve\lib\CachedInputFileSystem.js:55:16)
at C:\Users\Peridot\Escritorio\proyectos\DoneWithIt\node_modules\enhanced-resolve\lib\CachedInputFileSystem.js:91:9
at C:\Users\Peridot\Escritorio\proyectos\DoneWithIt\node_modules\graceful-fs\graceful-fs.js:123:16
at FSReqCallback.readFileAfterClose [as oncomplete] (node:internal/fs/read_file_context:68:3) {
opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

Node.js v18.12.1

在这里的错误信息中,可以看到,这里的错误信息是在crypto这个模块中出现的,具体的错误信息是说,这个模块中的hash方法出现了问题,
这个方法是用来加密的,但是在这里出现了不支持的错误,这个错误的原因是从NodeJs版本 17 开始,NodeJs从 OpenSSL1.1.1 升级到 OpenSSL3。OpenSSL3不支持一些旧的哈希技术。这就是为什么我们面临这个错误“ERR_OSSL_EVP_UNSUPPORTED”。如果不想降低NodeJs版本,我们就需要在终端在设置NodeJs需要使用的OpenSSL版本,具体的命令如下:

1
export NODE_OPTIONS=--openssl-legacy-provider

这样子,当我们再次运行的时候,就不会出现这个问题了。

总结

这个问题困扰了我很久很久,前端的项目依赖相对与Java来说要混乱很多,这也就是package-lock.json 的存在原因,避免随着依赖的变更导致项目无法运行。虽然新的版本会有更好的优化以及新功能,但是偶尔会废弃一些旧的功能,我们在新版本的环境是,可能就会出现不兼容问题了,所以在选择升级之前一定要搞清楚每一次的更新细节,更改了什么,废弃了什么,这样子才能避免一些不必要的问题。