当你艰难入门 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. 两个防火墙的IPsec

    首先要保证双面都能通信到对面! 拓扑图: P1 没有要求默认就行 P2 没有要求默认就行 对流体 对流体细节问题 预共享密钥要一致 IPsec 创建隧道 添加路由 Ping对方激活ipsec Ping ...

  2. C#数据结构与算法入门教程,值得收藏学习!

    前言 最近看到DotNetGuide技术社区交流群有不少小伙伴提问:想要系统化的学习数据结构和算法,不知道该怎么入门,有无好的教程推荐的?,今天大姚给大家推荐2个开源.免费的C#数据结构与算法入门教程 ...

  3. 梁培利DeFi去中心化金融课程笔记2024版

    课程链接:https://space.bilibili.com/220951871/channel/collectiondetail?sid=2824381&ctype=0 讲义仓库:http ...

  4. sora未来在哪里,是否改变世界?

    什么是Sora?(Solo 社区投稿) Sora在日语中是天空的意思,是一种文本到视频的扩散模型,Sora与使用文本提示创建图像的 Dall-E 非常相似,Sora 使用文本提示创建短视频.Sora ...

  5. Three光源Target位置改变光照方向不变的问题及解决方法

    0x00 楔子 在 Three.js 中,光源的目标(target)是一种用于指定光源方向的重要元素.在聚光灯中和定向光(DirectionalLight)中都有用到. 有时我们可能会遇到光源目标位置 ...

  6. oeasy 教您玩转linux 010304 图形界面 xfce

    我们来回顾一下 上一部分我们都讲了什么? 讲了文件管理器和命令行终端互相交互 用命令nautilus在文件管理器打开某路径 这次我们来看看 图形用户界面(GUI)的情况 图形界面和发行版的关系 一个发 ...

  7. 系动词&使役动词

    系动词 系动词的作用就是赋值 I am a rabbit 把 a rabbit赋值给i我 我是一只兔子 The rabbit is smart 这兔子是聪明的 smart赋值给兔子 系动词连系的方式, ...

  8. .NET 开源快捷的数据库文档查询和生成工具

    前言 在实际项目开发中,需求变更和项目迭代是常态.要求我们能够迅速响应,对数据库结构进行相应的调整,如添加新表.更新现有表结构或增加字段等. 为了确保团队成员之间的信息同步,实时更新和维护数据库文档变 ...

  9. 【MySQL】拆分经纬度字段

    数据结构: 表中一字段存储经度和纬度: +---------------------------+ | INSTALL_LOLA_NUM | +---------------------------+ ...

  10. 【Hibernate】Re01.5 API

    1.Session单表的CRUD操作 1.增加或者修改,使用同一个方法,或者下面的两个也行: 感觉多此一举... 2.删除方法,硬删除: 3.获取方法提供了两种,Get & Load get方 ...