由于之前的一些简单站点是通过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版本,省去手动切换版本