在构建Web 应用时,Webpack 通常会使用 Terser 插件来优化和压缩 JavaScript 文件,当使用 Node.js 17 或更新版本时,构建过程中可能会出现如下错误:
js/chunk-vendors.57e08fad.js from Terser
Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:69:19)
at Object.createHash (node:crypto:133:10)
...
此错误通常伴随着 Build failed with errors
消息,导致构建失败。
错误原因
这个问题主要源于 Node.js 17+ 加密模块crypto
发生了变化。这些版本默认使用 OpenSSL 3.x,而某些加密算法或配置在 OpenSSL 3.x 中已经不再受支持。这会导致 Terser 这样的工具在进行哈希操作时遇到问题,
解决方案
解决这个问题有几种方式,具体取决于你的项目环境
1. 使用 --openssl-legacy-provider
在 Node.js 17 +的版本中 ,通过指定 --openssl-legacy-provider
可以让 Node.js 使用 OpenSSL 的旧版加密方法
操作步骤:
使用 Yarn 作为包管理工具
NODE_OPTIONS=--openssl-legacy-provider yarn build
使用 npm 进行构建
NODE_OPTIONS=--openssl-legacy-provider npm run build
2. 降级 Node.js 版本
如果你的项目不需要使用 Node.js 17+,降级到 Node.js 16.x 或 14.x 版本也是一种可行的解决方案。
操作步骤:
- 确认当前使用的 Node.js 版本:
node -v
- 如果需要降级,可以使用 Node Version Manager (NVM) 来管理 Node.js 版本:
nvm install 16
nvm use 16
降级后,再次运行构建命令,错误应该会消失。
3. 升级相关依赖
如果你想继续使用最新版本的 Node.js,另一种解决方案是升级项目中的 Webpack 和 Terser 插件版本。
操作步骤:
- 更新
terser-webpack-plugin
和webpack
到最新版本:
yarn add terser-webpack-plugin@latest webpack@latest
- 再次运行构建命令,检查是否已解决问题。
总结
error:0308010C
主要是由于 Node.js 和加密库的版本不兼容。通过使用 --openssl-legacy-provider
选项、降级 Node.js 版本或升级构建工具链即可解决
原创文章,作者:geeklinux.cn,如若转载,请注明出处:https://www.geeklinux.cn/jsjc/1572.html