当你艰难入门 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 支持。

解决的办法:

  1. 降级 Node 版本
  2. Node 启用 OpenSSL 3.0 旧版提供程序
  3. 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
},
};

好了,再次启动工程试试!

解决 Rust WebAssembly 启动 Web 程序报错的更多相关文章

  1. Abnormal build process termination--解决IDEA启动web项目报错

    iDEA启动后报Error:Abnormal build process terminatio 报错的原因如下: Error:Abnormal build process termination: & ...

  2. 启动web项目报错:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone.

    解决: 在application.properties配置文件中的添加标红部分 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/miaosha?se ...

  3. 解决HDFS无法启动namenode,报错Premature EOF from inputStream;Failed to load FSImage file, see error(s) above for more info

    一.情况描述 启动hadoop后发现无法打开hdfs web界面,50070打不开,于是jps发现少了一个namenode: 查看日志信息,发现如下报错: 2022-01-03 23:54:10,99 ...

  4. Web程序报错:Error instantiating servlet

    ---恢复内容开始--- web程序的前期准备工作都做好了,也就是web程序的目录都建好了,在WEB-INF文件夹下建立了classes文件夹,用于存放编好的.class文件.我想这两个类应该都在相应 ...

  5. 启动node程序报错:event.js:183 throw er; // unhandled 'error' event

    启动node程序时,报如下错误:

  6. 【Python】解决使用pyinstaller打包Tkinker程序报错问题

    问题描述 使用pyinstaller打包使用Tkinter编写的控制台程序,出现报错 15793 INFO: Adding Microsoft.Windows.Common-Controls to d ...

  7. 【待解决】创建maven web工程报错

    报错信息如下: Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:2.6 o ...

  8. 【待解决】maven创建web项目报错

    创建web项目时报错

  9. 启动android程序报错

    提示错误如下: The connection to adb is down, and a severe error has occured. [2010-03-11 09:36:56 - HelloO ...

  10. WEB程序报错Address localhost:1099 is already in use的解决方案(网络端口被占用导致程序无法运行)

    首先,这是说明你的本地端口1099已经被占用了,解决的方法有两个: 1.停止本地占用端口 打开cmd 按如下指令进行命令输入,就能找出占用端口的进程并停止啦 2.修改程序运行端口 一个问题,两种解决办 ...

随机推荐

  1. 生成数字csv

    csv文件: import time import mcpi.minecraft as minecraft import mcpi.block as block mc = minecraft.Mine ...

  2. 3568F-Docker容器部署方法说明

                 

  3. java开发webservice报Service(URL, QName, WebServiceFeature[]) is undefined错误的解决方法

    Description Resource Path Location TypeThe constructor Service(URL, QName, WebServiceFeature[]) is u ...

  4. react上传文件显示上传进度

    Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.在使用react, vue框架的时候, 如果需要监听文件上传可以使用axios里的onUploadPro ...

  5. [oeasy]教您玩转python - 0004 - 万行代码之梦

    ​ 继续运行 回忆上次内容 上次从1行代码进化到了2行代码 yy p粘贴剪贴板中的内容 将剪贴板中的代码粘贴9999次 9999p 真的实现了万行代码梦 是真·圆梦 没有撒谎的那种 不过圆梦之后多少有 ...

  6. 题解:AT_abc360_c [ABC360C] Move It

    背景 机房大佬掉大分了,乐悲. 题意 给你几个箱子和每个箱子里装有的东西 \(a\) 和对应的重量 \(w\),现在要让每个箱子里都装有一个东西,每次可以移动任意一个箱子中的任意一个东西,代价为它的重 ...

  7. 如何平稳地从nacos迁移到r-nacos?

    1. 引言 很多同学了解r-nacos特性后最开始只将r-nacos用于开发测试环境. 经过一段时间的使用后,部分同学有打算生成环境也从nacos迁移到r-nacos. 一些之前使用nacos服务的同 ...

  8. CF301B Yaroslav and Time 题解

    CF301B 这不最短路的板子题吗? 思路 用 \(ak\) 代表走到第 \(k\) 点时的可恢复单位时间的值. \(i\) 到 \(j\) 的距离是 \(\left ( \left | xi-xj ...

  9. 2023/4/20 SCRUM个人博客

    1.我昨天的任务 学习了PYQT5的部分控件,例如按钮,文本框,文本编辑框,并了解了一些基础布局以及部分对窗口的自定义实现 2.遇到了什么困难 无法理解信号和槽的概念 3.我今天的任务 学习信号和槽的 ...

  10. 内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程)

    内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程) 原文地址 https://zhanghan.blog.csdn.net/article/details/109255980 前言 ...