报错信息
原因分析:
这个错误 error:0308010C:digital envelope routines::unsupported
是由于 Node.js v17+ 中默认加密算法变更导致的。以下是详细的错误原因分析:
根本原因
-
Node.js 安全策略变更
-
从 Node.js v17 开始,OpenSSL 的安全策略变得更加严格,默认禁用了一些不安全的哈希算法(如 MD4)。
-
Webpack 和相关插件(如
compression-webpack-plugin
、copy-webpack-plugin
)在处理文件哈希时,可能使用了这些被禁用的算法。
-
-
Webpack 依赖问题
-
部分 Webpack 插件(尤其是较旧版本)在生成资源哈希时使用了 MD4 等算法。
-
当 Node.js 版本升级到 v17+ 时,这些算法不再被默认支持,导致加密模块抛出
unsupported
错误。
-
为什么旧版本 Node.js 没有问题?
-
在 Node.js v16 及以下版本中,OpenSSL 的安全策略较宽松,默认允许使用 MD4 等算法。
-
因此,同样的 Webpack 配置在旧版本 Node.js 上可以正常工作,升级 Node.js 后才会出现此错误。
解决办法:
方案一:更换低版本的 node.js
方案二:
临时环境变量修改:
在运行打包命令前设置环境变量 NODE_OPTIONS=--openssl-legacy-provider
:
# Windows (命令提示符) set NODE_OPTIONS=--openssl-legacy-provider
# Windows (PowerShell) $env:NODE_OPTIONS="--openssl-legacy-provider"
# macOS/Linux NODE_OPTIONS=--openssl-legacy-provider npm run build
或者直接修改 package.json
中的脚本:
"scripts": {
"dev": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
},