在使用 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 版本:

  1. 降级到 Node.js 16.x LTS 版本
  2. 或升级到最新的 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 的加密方法,使其能够继续使用这些算法。

最佳实践建议

  1. 优先选择设置环境变量的方案,这是最简单且对项目影响最小的解决方法
  2. 对于新项目,建议使用最新的 LTS 版本 Node.js,并确保所有依赖包都是最新的稳定版本
  3. 在团队开发中,建议在项目文档中清晰记录所需的 Node.js 版本和相关环境配置
  4. 考虑使用 .nvmrc 文件指定项目的 Node.js 版本,方便团队成员保持一致的开发环境

常见问题解答

Q: 设置环境变量后依然报错怎么办? A: 确保完全关闭终端并重新打开,或尝试重启开发工具,因为环境变量的修改需要在新的会话中才能生效。

Q: 这个解决方案会影响项目的安全性吗? A: 启用 legacy provider 主要是为了兼容性考虑,对于大多数现代 Web 应用来说不会造成实质性的安全风险。但从长远来看,建议逐步更新项目依赖至支持新版 OpenSSL 的版本。

结语

这个错误虽然让人困扰,但解决方法相对简单。选择合适的解决方案时,需要考虑项目的具体情况、团队协作需求以及长期维护计划。建议在解决当前问题的同时,也制定计划逐步更新项目依赖,使其与最新的 Node.js 版本保持兼容。


也可以看看