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)
rror: error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:71:19) at Object.createHash (node:crypto:133:10)
这个错误 (ERR_OSSL_EVP_UNSUPPORTED) 出现是因为从 Node.js 17 版本开始,Node.js 默认使用了 OpenSSL 3,这会限制某些旧版加密算法的使用。在情况下,Webpack 和一些其他依赖项依赖于旧的加密算法,而 OpenSSL 3 不再支持这些算法。
解决方案:
1. 使用环境变量允许使用旧版 OpenSSL 算法
这是最简单且最直接的解决方法,尤其是当你不打算降级 Node.js 时。你可以通过设置 NODE_OPTIONS 环境变量来允许使用 OpenSSL 3 中的旧版加密算法。
对于 Windows 系统:
打开命令提示符或 PowerShell,运行以下命令:
set NODE_OPTIONS=--openssl-legacy-provider
对于 macOS/Linux 系统:
打开终端,运行以下命令:
export NODE_OPTIONS=--openssl-legacy-provider
设置完之后,再次运行开发服务器或构建命令:
npm run serve
或者:
npm install
这样 Webpack 和其他依赖项就可以继续使用旧版加密算法了,避免出现 ERR_OSSL_EVP_UNSUPPORTED 错误。
2. 降级 Node.js 版本
如果你不想使用 --openssl-legacy-provider 这个环境变量,也可以选择降级 Node.js 到版本 16 或更早版本。这些版本使用 OpenSSL 1.1.1,因此不会遇到此类问题。
使用 NVM(Node Version Manager)来管理不同版本的 Node:
- Windows 上: 安装 nvm-windows。
- macOS/Linux 上: 安装 NVM。
安装并切换到 Node.js v16:
nvm install 16
nvm use 16
然后重新运行:
npm install
3. 更新 Webpack 和依赖项
有时,问题可能是由于某些依赖项(例如 Webpack)不兼容 Node.js 18。你可以尝试更新 Webpack 和相关依赖项到兼容的版本。
更新 Webpack:
npm install webpack@latest --save-dev
然后再执行:
npm install
4. 清除 npm 缓存并重新安装依赖
有时依赖项或缓存可能会导致问题,你可以尝试删除 node_modules 和缓存,然后重新安装依赖项。
-
删除
node_modules文件夹:rm -rf node_modules -
清除 npm 缓存:
npm cache clean --force -
重新安装依赖:
npm install
总结:
最简单的解决方法是设置 NODE_OPTIONS=--openssl-legacy-provider 环境变量,它可以让 Webpack 和其他依赖项继续使用旧版加密算法。如果你希望避免使用这个环境变量,可以考虑降级 Node.js 或更新依赖项以确保兼容性。
















