在使用 yarn run build
命令构建项目时,可能会遇到以下错误:
Error: error:0308010C:digital envelope routines::unsupported
这个错误通常出现在使用较新版本的 Node.js(通常是 Node.js 17 及以上版本)时,因为这些版本默认使用了更新的 OpenSSL 3.0,而一些旧的加密算法在新版本中被标记为不安全并默认禁用。
这是最快速、最简单的解决方案,不需要修改项目配置或降级 Node.js。
set NODE_OPTIONS=--openssl-legacy-provider
yarn run build
$env:NODE_OPTIONS="--openssl-legacy-provider"
yarn run build
export NODE_OPTIONS=--openssl-legacy-provider
yarn run build
如果你希望团队中的所有开发者都能避免这个问题,可以直接在项目的 package.json
中修改构建脚本:
{
"scripts": {
"build": "set NODE_OPTIONS=--openssl-legacy-provider && your-build-command"
}
}
如果以上方案不适合你的项目,可以考虑调整 Node.js 版本:
使用 nvm 管理 Node.js 版本:
# 安装 Node.js 16
nvm install 16
nvm use 16
# 或安装最新的 LTS 版本
nvm install --lts
nvm use --lts
这个错误的根本原因是 Node.js 17 及以上版本使用了 OpenSSL 3.0,而 OpenSSL 3.0 默认禁用了一些被认为不够安全的旧算法。当项目中使用了这些旧算法时,就会触发这个错误。
设置 NODE_OPTIONS=--openssl-legacy-provider
的作用是启用旧版 OpenSSL 的加密方法,使其能够继续使用这些算法。
.nvmrc
文件指定项目的 Node.js 版本,方便团队成员保持一致的开发环境Q: 设置环境变量后依然报错怎么办? A: 确保完全关闭终端并重新打开,或尝试重启开发工具,因为环境变量的修改需要在新的会话中才能生效。
Q: 这个解决方案会影响项目的安全性吗? A: 启用 legacy provider 主要是为了兼容性考虑,对于大多数现代 Web 应用来说不会造成实质性的安全风险。但从长远来看,建议逐步更新项目依赖至支持新版 OpenSSL 的版本。
这个错误虽然让人困扰,但解决方法相对简单。选择合适的解决方案时,需要考虑项目的具体情况、团队协作需求以及长期维护计划。建议在解决当前问题的同时,也制定计划逐步更新项目依赖,使其与最新的 Node.js 版本保持兼容。