# Vercel

返回:工具

# 部署问题

# Error: error:0308010C:digital envelope routines::unsupported

前言

随着Node.js不断更新,特别是从版本V17开始引入了OpenSSL 3.0,一些开发者遇到了新的错误:Error: error:0308010C:digital envelope routines::unsupported。这个错误主要是由于OpenSSL 3.0对加密算法和密钥大小增加了更为严格的限制所引起的。本文将简单讲讲这个问题的原因以及我所使用的解决方案。

  • 错误原因分析
    • Node.js V17及以上版本:这些版本引入了OpenSSL 3.0,该版本对允许使用的加密算法和密钥大小进行了更严格的限制。
    • 遗留代码或依赖库:某些旧版本的应用程序或依赖库可能使用了不再被OpenSSL 3.0支持的加密算法或密钥大小,导致在新环境中无法正常工作。

# 解决方案

  • 方法一:设置环境变量 NODE_OPTIONS
    • 通过设置环境变量NODE_OPTIONS,可以指定使用旧版OpenSSL提供程序,从而确保与现有项目的兼容性。具体操作如下:

临时解决(命令行)

# Windows:
SET NODE_OPTIONS=--openssl-legacy-provider

#Linux/MacOS:
export NODE_OPTIONS=--openssl-legacy-provider
1
2
3
4
5

长期解决(修改package.json文件中的脚本部分)

在package.json文件内的scripts部分添加环境变量设置,例如:

"scripts": {
    "dev": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
    "build": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build"
}
1
2
3
4

这种方法适用于不想更改Node.js版本的情况,它可以让项目继续使用旧版OpenSSL,而无需降级Node.js。

  • 方法二:降低Node.js版本
    • 降低Node.js版本到V16或更低版本也是一个有效的解决方案,因为这些版本仍然使用的是OpenSSL 1.1.x,对加密算法的支持更为宽松。您可以选择适合您项目的稳定版本,并通过您的版本管理工具进行切换。具体步骤如下:

选择并安装特定版本的Node.js: 使用您现有的Node.js版本管理工具(如nvm)安装所需版本。例如,如果您使用nvm,可以通过以下命令安装v16.14.2:

nvm install 16.14.2
1

切换到安装的版本: 使用版本管理工具切换到所需的Node.js版本。例如,如果您使用nvm,可以通过以下命令切换:

nvm use 16.14.2
1

验证当前使用的Node.js版本:

node -v
1

通过这种方式,您可以避免OpenSSL 3.0带来的兼容性问题,同时继续享受其他Node.js特性。

  • 方法三:升级依赖库
    • 如果您的项目依赖于某些不再受支持的加密算法或库,考虑升级这些依赖库以获得更好的兼容性和安全性。许多库已经发布了更新版本,以支持最新的OpenSSL标准。请查阅相关库的文档,了解如何迁移到最新版本。具体步骤如下:
  1. 检查依赖库的版本: 查看package.json文件中的依赖项,找出哪些库需要升级。

  2. 查找最新版本: 访问各个库的官方文档或GitHub页面,查找最新的稳定版本。

  3. 升级依赖库: 使用npm或yarn命令升级依赖库。例如:

npm update <library-name>
# 或者
yarn upgrade <library-name>
1
2
3

测试项目 升级后,务必进行全面测试,确保项目在新的依赖环境下正常运行。

  • 方法四:调整应用程序代码
    • 对于直接使用不支持的加密算法的应用程序代码,考虑调整代码以使用OpenSSL 3.0支持的算法。具体步骤如下:
  1. 识别问题代码: 检查报错信息中的堆栈跟踪,找到涉及加密操作的具体代码段。

  2. 替换算法: 将不支持的算法替换为OpenSSL 3.0支持的算法。例如,如果使用的是MD5哈希函数,可以考虑替换为SHA-256等更安全的算法。

  3. 测试更改: 确保替换后的代码能够正确运行,并且没有引入新的问题。

# 注意事项与建议

虽然上述方法都可以快速解决问题,但这并不是长久之计。建议大家关注项目的依赖项更新情况,尝试调整代码或配置以兼容新的OpenSSL版本。随着时间推移,继续使用较老版本的Node.js可能会导致错过安全更新和其他改进。因此,在条件允许的情况下,逐步迁移项目至更高版本的Node.js仍然是推荐的做法。

# JavaScript heap out of memory

原因是node使用的堆内存超出了V8引擎允许的最大值。 经过搜索常常得出了两种解决方案。

# 1、使用 increase-memory-limit 插件

TypeScript 和 webpack 时的常见问题,项目过大时,使用 increase-memory-limit,增加node服务器内存限制。

安装:

npm install -g increase-memory-limit
1

进入工程目录执行:

increase-memory-limit
1

在执行上述操作后,然后执行npm run build 后,会报错:

'"node --max-old-space-size=4096"' 不是内部或外部命令,也不是可运行的程序

在高版本中移除了node命令,所以也不能解决。

# 2、修改cmd文件

在目录node_modules/.bin下打开ng.cmdngc.cmd文件,添加 --max_old_space_size=4096

但是因为最终部署在GitHub Pages,没有办法直接修改 node_modules 的文件,所以这种方法不行。

# 解决方案

Node.js v8.0 开始,可以使用NODE_OPTIONS 环境变量来全局设置 max_old_space_size 来增加内存限制

export NODE_OPTIONS=--max_old_space_size=4096
1

increase-memory-limit 将附加 --max-old-space-size=4096 到文件中的所有 node 调用中node_modules/.bin/*。

如果在windows系统,可以使用命令

set NODE_OPTIONS=--max_old_space_size=4096
1

因为export是linux命令

最终修改Vercel的流水线命令如下:

export NODE_OPTIONS=\"--max_old_space_size=4096 --openssl-legacy-provider\" && vuepress build docs
1