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