digital envelope routines::unsupported

518 阅读2分钟

由于之前的一些简单站点是通过vuepress打包生成,现在只是修改部分站点信息,在开发环境下运行yarn dev是正常的,但是运行打包yarn build是报错的,本文针对这种情况进行分析,以及一般如何处理

1、背景

  • 报错信息:
(undefined) assets/js/styles.f8e37946.js from Terser
Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:68:19)
    at Object.createHash (node:crypto:138:10)
    at E:\staticPage\devxixi\node_modules\terser-webpack-plugin\dist\index.js:217:37
    at Array.forEach (<anonymous>)
    at TerserPlugin.optimizeFn (E:\staticPage\devxixi\node_modules\terser-webpack-plugin\dist\index.js:160:259)
    at _next0 (eval at create (E:\staticPage\devxixi\node_modules\tapable\lib\HookCodeFactory.js:33:10), <anonymous>:13:1)
    at eval (eval at create (E:\staticPage\devxixi\node_modules\tapable\lib\HookCodeFactory.js:33:10), <anonymous>:30:1)
  • 初步怀疑: 因为存在太多项目,有的项目node版本比较高,怀疑这个项目使用node版本比较低,才导致在打包时候出现这种现象

  • 结果: 后面经过验证,确认是node 版本不一致导致。高版本node 中的OpenSSL 在3.0版本以后,md4不再被允许使用。

查看报错的源码,确实使用了md4

 hash: _crypto.default.createHash('md4').update(input).digest('hex')

补充: 查看node内置的crypto使用openssl版本

# 查看openssl版本
node -p "process.versions.openssl"
# node 16.13.0 版本 中 openssl:1.1.1l+quic
# node 20.10.0 版本 中 openssl:3.0.12+quic

2、解决方案:

  • 方案1:切换node版本到16
  • 方案2:不切换node版本,打包时候添加指定配置,允许可以使用md4
  "scripts": {
    "dev": "vuepress dev docs",
    "build": "set NODE_OPTIONS=--openssl-legacy-provider & vuepress build docs"
  }

3、优化方案

  • 优化1:后期可以在package中添加,指定node 版本,再手动切换指定node版本。避免切换node版本后再回来运行项目,导致出现异常报错
  "engines": {
    "node": "=16.13.0"
  },
  • 优化2:也可以直接使用volta,切换不同项目时候,自动切换node版本,省去手动切换版本

4、参考