当你艰难入门 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. Android 各层架构

    Android应用框架层和硬件抽象层以及底层之间的关系 1. JNI技术: (1).JNI技术简单的说就是在本地Java语言声明本地方法和加载动态链接库(.so文件) (2).动态链接库(.so文件) ...

  2. 基于SQLite3的C学习总结

    背景 针对 SQLite3 的学习总结 arm linux 移植 SQLite 3 如何在 Linux 上移植使用 SQLite3,标题虽然是在讲 arm linux,但实际上是跨平台的. 基于 SQ ...

  3. 嵌入式ARM端测试手册——全志T3+Logos FPGA开发板(上)

    前 言 本指导文档适用开发环境: Windows开发环境:Windows 7 64bit.Windows 10 64bit Linux开发环境:Ubuntu18.04.4 64bit 虚拟机:VMwa ...

  4. 使用bootstrap-select 动态加载数据不显示的问题,级联数据置为空

    动态加载数据 $.showLoading('数据加载中');//开启遮挡层 $.ajax({ url: "/PickoutStock/GetSendReceive", data: ...

  5. 2 手机号登录时,调的不是login接口,而是注册的一个接口

    手机号登录时,调的不是login接口,而是注册的一个接口

  6. MViT:性能杠杠的多尺度ViT | ICCV 2021

    论文提出了多尺度视觉Transformer模型MViT,将多尺度层级特征的基本概念与Transformer模型联系起来,在逐层扩展特征复杂度同时降低特征的分辨率.在视频识别和图像分类的任务中,MViT ...

  7. VUE小知识~作用域插槽

    作用域插槽可以为我们向组件内插入特定的标签,方便修改维护. 组件内需要使用 <slot></slot>进行插槽站位. 组件标签内需要使用<template > &l ...

  8. odoo Actions学习总结

    环境 odoo-14.0.post20221212.tar Actions(动作) action定义系统响应用户操作的行为:登录.操作按钮.选择发票等- action可以存储在数据库中,也可以作为字典 ...

  9. odoo 为form表单视图添加chatter功能

    实践环境 Odoo 14.0-20221212 (Community Edition) 需求描述 如图,给表单新增一个类似聊天的窗口,当记录一些表单活动(本例为自动记录当前记录状态变化) 需求实现 模 ...

  10. JMeter 逻辑控制之IF条件控制器

    逻辑控制之IF条件控制器 测试环境 JMeter-5.4.1 循环控制器介绍 添加While Controller 右键线程组->添加->逻辑控制器->While控制器 控制器面板介 ...