之前有一个Ant Design 4的项目,最近将node升到了最新的v22.x版本,然后,编译的时候就报错了。
yarn run v1.22.22
$ react-scripts build
Creating an optimized production build...
Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:79:19)
at Object.createHash (node:crypto:139:10)
at module.exports (F:\work\web\background\node_modules\webpack\lib\util\createHash.js:90:53)
at NormalModule._initBuildHash (F:\work\web\background\node_modules\webpack\lib\NormalModule.js:401:16)
at handleParseError (F:\work\web\background\node_modules\webpack\lib\NormalModule.js:449:10)
at F:\work\web\background\node_modules\webpack\lib\NormalModule.js:481:5
at F:\work\web\background\node_modules\webpack\lib\NormalModule.js:342:12
at F:\work\web\background\node_modules\loader-runner\lib\LoaderRunner.js:373:3
at iterateNormalLoaders (F:\work\web\background\node_modules\loader-runner\lib\LoaderRunner.js:214:10)
at iterateNormalLoaders (F:\work\web\background\node_modules\loader-runner\lib\LoaderRunner.js:221:10)
at F:\work\web\background\node_modules\loader-runner\lib\LoaderRunner.js:236:3
at runSyncOrAsync (F:\work\web\background\node_modules\loader-runner\lib\LoaderRunner.js:130:11)
at iterateNormalLoaders (F:\work\web\background\node_modules\loader-runner\lib\LoaderRunner.js:232:2)
at Array.<anonymous> (F:\work\web\background\node_modules\loader-runner\lib\LoaderRunner.js:205:4)
at Storage.finished (F:\work\web\background\node_modules\enhanced-resolve\lib\CachedInputFileSystem.js:43:16)
at F:\work\web\background\node_modules\enhanced-resolve\lib\CachedInputFileSystem.js:79:9
(node:8344) [DEP0060] DeprecationWarning: The `util._extend` API is deprecated. Please use Object.assign() instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
F:\work\web\background\node_modules\react-scripts\scripts\build.js:19
throw err;
^
Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:79:19)
at Object.createHash (node:crypto:139:10)
at module.exports (F:\work\web\background\node_modules\webpack\lib\util\createHash.js:90:53)
at NormalModule._initBuildHash (F:\work\web\background\node_modules\webpack\lib\NormalModule.js:401:16)
at F:\work\web\background\node_modules\webpack\lib\NormalModule.js:433:10
at F:\work\web\background\node_modules\webpack\lib\NormalModule.js:308:13
at F:\work\web\background\node_modules\loader-runner\lib\LoaderRunner.js:367:11
at F:\work\web\background\node_modules\loader-runner\lib\LoaderRunner.js:233:18
at context.callback (F:\work\web\background\node_modules\loader-runner\lib\LoaderRunner.js:111:13)
at F:\work\web\background\node_modules\babel-loader\lib\index.js:51:103
at process.processTicksAndRejections (node:internal/process/task_queues:105:5) {
opensslErrorStack: [
'error:03000086:digital envelope routines::initialization error',
'error:0308010C:digital envelope routines::unsupported'
],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
}
Node.js v22.16.0
error Command failed with exit code 1.
这是Node升到17及以上版本后,默认启用OpenSSL 3.0,移除了对旧加密算法(如MD4/MD5)的支持,解决办法有三种:
一、强制启用旧版OpenSSL提供程序
修改项目下的package.json
文件,在scripts中编译常数添加NODE_OPTIONS=--openssl-legacy-provider
,如:
## Windows 中
"scripts": {
"start": "set NODE_OPTIONS=--openssl-legacy-provider && react-scripts start",
"build": "set NODE_OPTIONS=--openssl-legacy-provider && react-scripts build"
}
## Linux/macOS中
"scripts": {
"start": "export NODE_OPTIONS=--openssl-legacy-provider && react-scripts start",
"build": "export NODE_OPTIONS=--openssl-legacy-provider && react-scripts build"
}
- 适用于开发环境快速恢复编译
二、降级Node.js至V16及改下版本
使用nvm
管理多版本:
nvm install 16.20.2 # 安装Node v16
nvm use 16.20.2 # 切换版本
- 彻底规避OpenSSL 3.0兼容问题,适合长期维护的老项目
三、升级项目依赖
更新关键依赖
npm update webpack compression-webpack-plugin --save-dev
- compression-webpack-plugin:升级至v10+
- webpack:升级至v5+,并在配置中显式声明哈希算法:
// webpack.config.js
output: {
hashFunction: "sha256", // 替换旧版MD类算法
}
不过,我的项目是Ant Design 4的,要将webpack
更新到v5以上版本,需要更新antd、ant-design/compatible等等一大堆的依赖库,还要修改代码,最后,还是放弃了,使用旧版本。
评论区