解决 Rust WebAssembly 启动 Web 程序报错
当你艰难入门 Rust
,并满怀斗志准备投身 WebAssembly
,第一课也许会先给你泼盆凉水。
跟随 《Rust 🦀 和 WebAssembly》 文档的指引,一路 install、coding、build,终于来到 Web 的启动:
npm run start
然而,现在是 2024 年,你电脑上 Node
版本已经 >= 18
,结果就是,你收到了报错:
Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:67:19)
at Object.createHash (node:crypto:130:10)
at module.exports
...
opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
报错的原因: 你电脑上 Node
版本为 17+
(使用 OpenSSL 3.0
),但 node_modules
中模块的算法已经不受 OpenSSL 3.0
支持。
解决的办法:
- 降级
Node
版本 Node
启用OpenSSL 3.0
旧版提供程序Webpack
升级到5.54.0+
一个个来看:
1. 降级 Node
版本
如果你已经安装了 Node
版本管理器 NVM
,很方便就可以切换到 v16
版本,否则可以先去安装 NVM (国内源)。
# 如果你还没安装过
nvm install v16.20.2
# 切换到 16 版本
nvm use 16
2. Node
启用 OpenSSL 3.0
旧版提供程序
需要使用 openssl-legacy-provider
标识 (Node17
新增,参见文档:https://nodejs.cn/api-v18/cli/openssl_legacy_provider.html )告诉 Node
,我们不想使用更严格的算法和密钥大小限制。
在 Mac/Linux 上,可以直接执行:
NODE_OPTIONS='--openssl-legacy-provider' npm run start
或修改一下 package.json
:
"scripts": {
"start": "export NODE_OPTIONS=--openssl-legacy-provider && npm run start",
...
}
另一种方式是在 ~/.zsrch
、~/.bashrc
中添加一句:
export NODE_OPTIONS=--openssl-legacy-provider
如果是 Windows,则按以下方式设置环境变量:
set NODE_OPTIONS=--openssl-legacy-provider
3. Webpack
升级到 5.54.0+
Webpack v5.54.0+,它带有一个不依赖 OpenSSL 的哈希算法。
咱们这里干脆全升级到最新版本:
npm install --force webpack@latest webpack-cli@latest webpack-dev-server@latest copy-webpack-plugin@latest
然后修改一下 webpack.config.js
:
module.exports = {
...
plugins: [
// copy-webpack-plugin 入参改成这样:
new CopyWebpackPlugin({
patterns: [
{ from: "index.html" },
]
})
],
// 添加下面这段,支持 WebAssembly 打包
experiments: {
asyncWebAssembly: true,
syncWebAssembly: true
},
};
好了,再次启动工程试试!