首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

将 Rust 代码编译为 WASM

编程知识
2024年08月14日 10:13

前言

在现代 Web 开发中,WebAssembly (WASM) 已成为一种强大的工具。它使得开发者可以在浏览器中运行高性能的代码,跨越传统的 JavaScript 性能限制。Rust 语言因其高效性和内存安全性,成为了编写 WASM 模块的热门选择。本文将介绍如何将 Rust 代码编译为 WebAssembly,并在 Web 项目中使用。

1. 创建 Rust 项目

首先,我们需要创建一个新的 Rust 项目。由于我们要生成一个可以被其它语言或工具调用的模块,因此选择创建一个库项目,而不是可执行程序。使用 cargo 命令可以轻松完成:

cargo new lib_wasm --lib

这个命令会生成一个名为 lib_wasm 的项目,其中包含一个基础的 Cargo.toml 配置文件和一个 src/lib.rs 文件,你将在其中编写你的 Rust 代码。

2. 添加 wasm-bindgen 依赖项

在 Rust 中,wasm-bindgen 是一个关键工具,它使 Rust 和 JavaScript 之间的交互变得更加简单。wasm-bindgen 负责生成与 JavaScript 交互所需的绑定代码,让你能够直接调用 Rust 编写的函数。

要添加 wasm-bindgen,你可以使用 cargo add 命令:

cargo add wasm-bindgen

或者,手动编辑 Cargo.toml 文件,添加如下依赖项:

[dependencies]
wasm-bindgen = "0.2"

添加 wasm-bindgen 后,Rust 编译器会在编译过程中生成必要的绑定文件,从而使你的 WASM 模块可以被 JavaScript 直接调用。

3. 安装 wasm32-unknown-unknown 目标

Rust 编译器默认会生成适用于本地机器架构的可执行文件。要编译成适用于 Web 的 WebAssembly 文件,我们需要添加一个特定的目标架构,即 wasm32-unknown-unknown。这是一个通用的 WASM 目标,不依赖任何特定的操作系统。

使用以下命令安装该目标:

rustup target add wasm32-unknown-unknown

此命令会配置你的 Rust 工具链,使其能够生成适用于 WebAssembly 的二进制文件。

4. 编写 Rust 代码

现在,你可以在 src/lib.rs 文件中编写你希望导出的功能。例如,我们可以编写一个简单的函数,它接受一个名字作为参数并返回一个问候语:

use wasm_bindgen::prelude::*;

// 使用 #[wasm_bindgen] 宏来导出函数到 JavaScript
#[wasm_bindgen]
pub fn greet(name: &str) -> String {
    format!("Hello, {}!", name)
}

在这段代码中,我们使用了 #[wasm_bindgen] 宏将 greet 函数导出,使其可以从 JavaScript 中调用。

5. 编译 Rust 项目为 WASM

编写完代码后,我们可以将其编译为 WASM 文件。编译时指定目标为 wasm32-unknown-unknown,并使用 --release 选项生成优化后的构建:

cargo build --target wasm32-unknown-unknown --release

编译完成后,生成的 .wasm 文件将存储在 target/wasm32-unknown-unknown/release/ 目录下。

6. 使用 wasm-bindgen 生成 JavaScript 绑定代码

虽然编译生成了 .wasm 文件,但直接在 JavaScript 中使用它并不方便。为此,我们需要使用 wasm-bindgen 工具生成相应的 JavaScript 绑定代码。这将创建一个便于在 JavaScript 中调用的模块。

首先,确保已安装 wasm-bindgen-cli 工具。你可以通过以下命令安装:

cargo install wasm-bindgen-cli

然后,运行以下命令生成 JavaScript 绑定文件:

wasm-bindgen --out-dir ./out --target web target/wasm32-unknown-unknown/release/lib_wasm.wasm

这会在 out 目录中生成一系列文件,包括 .js 文件和 .wasm 文件,你可以直接在 Web 项目中使用。

7. 在网页中使用 WASM 模块

现在,生成的 WASM 模块已经可以在 Web 项目中使用。你只需在 HTML 文件中导入生成的 JavaScript 绑定文件,并调用 Rust 导出的函数。例如:

<!DOCTYPE html>
<html>
<head>
    <title>Lib WASM Demo</title>
</head>
<body>
    <script type="module">
        import init, { greet } from "./out/lib_wasm.js";
        init().then(() => {
            console.log(greet("World"));
        });
    </script>
</body>
</html>

这个示例会在控制台打印出 "Hello, World!"。其中,init 函数用于初始化 WASM 模块,而 greet 函数则调用了我们在 Rust 中定义的函数。

web 项目目录结构如下:

index.html
out/
    ├── lib_wasm_bg.wasm
    ├── lib_wasm_bg.wasm.d.ts
    ├── lib_wasm.d.ts
    └── lib_wasm.js

out 目录中包含了生成的 WASM 文件以及相应的 JavaScript 绑定文件,index.html 是一个简单的网页,用于测试和展示你的 WASM 模块。

结语

通过这套流程,你可以轻松地将 Rust 代码编译为 WebAssembly,并将其集成到 Web 项目中。Rust 的高效性和 WebAssembly 的灵活性相结合,可以为 Web 应用带来显著的性能提升。

From:https://www.cnblogs.com/guojikun/p/18358337
本文地址: http://shuzixingkong.net/article/1088
0评论
提交 加载更多评论
其他文章 老弟想自己做个微信,被我一个问题劝退了。。
大家好,我是程序员鱼皮。最近老弟小阿巴放暑假,想找点事情做,于是就来问我:老鲏,我想做个练手项目,有没有什么好的建议? 我说:练手项目的话,就做个自己感兴趣的呗,想加什么功能就加什么,做起来会更舒服~ 小阿巴:Emm,我感兴趣的太多了,有没有推荐啊? 我说:那就想想自己经常使用的网站或 APP,选个
老弟想自己做个微信,被我一个问题劝退了。。 老弟想自己做个微信,被我一个问题劝退了。。 老弟想自己做个微信,被我一个问题劝退了。。
面试官:说说volatile应用和实现原理?
volatile 是并发编程中的重要关键字,它的名气甚至是可以与 synchronized、ReentrantLock 等齐名,也是属于并发编程五杰之一。 需要注意的是 volatile 并不能保证原子性,因此使用 volatile 并没有办法保证线程安全。 并发编程五杰: PS:“并发编程五杰”是
面试官:说说volatile应用和实现原理? 面试官:说说volatile应用和实现原理?
Sy.ExpressionBuilder 动态查询新体验
省流模式,看下对比 //常规查询 var query = users .WhereIf(m =&gt; m.UserName.Contains(input.UserName), !string.IsNullOrEmpty(input.UserName)) .WhereIf(m =&gt; input
Sy.ExpressionBuilder 动态查询新体验 Sy.ExpressionBuilder 动态查询新体验 Sy.ExpressionBuilder 动态查询新体验
.NET 8 中利用 MediatR 实现高效消息传递
前言 MediatR 是 .NET 下的一个实现消息传递的库,轻量级、简洁高效,用于实现进程内的消息传递机制。它基于中介者设计模式,支持请求/响应、命令、查询、通知和事件等多种消息传递模式。通过泛型支持,MediatR 可以智能地调度不同类型的消息,非常适合用于领域事件处理。 在本文中,将通过一个简
.NET 8 中利用 MediatR 实现高效消息传递 .NET 8 中利用 MediatR 实现高效消息传递 .NET 8 中利用 MediatR 实现高效消息传递
附038.Kubernetes_v1.30.3高可用部署架构二
部署组件 该 Kubernetes 部署过程中,对于部署环节,涉及多个组件,主要有 kubeadm 、kubelet 、kubectl。 kubeadm介绍 Kubeadm 为构建 Kubernetes 提供了便捷、高效的“最佳实践” ,该工具提供了初始化完整 Kubernetes 过程所需的组件,
附038.Kubernetes_v1.30.3高可用部署架构二 附038.Kubernetes_v1.30.3高可用部署架构二 附038.Kubernetes_v1.30.3高可用部署架构二
线上问题排查指南
前言 最近经常有小伙伴问我,遇到了线上问题要如何快速排查。 这非常考验工作经验了。 有些问题你以前遇到,如果再遇到类似的问题,就能很快排查出导致问题的原因。 但如果某个问题你是第一次遇到,心中可能会有点无从下手的感觉。 这篇文章总结了,我之前遇到过的一些线上问题排查思路,希望对你会有所帮助。 1 O
线上问题排查指南 线上问题排查指南 线上问题排查指南
C#数据结构与算法实战入门指南
前言 在编程领域,数据结构与算法是构建高效、可靠和可扩展软件系统的基石。它们对于提升程序性能、优化资源利用以及解决复杂问题具有至关重要的作用。今天大姚分享一些非常不错的C#数据结构与算法实战教程,希望可以帮助到有需要的小伙伴。 C#经典十大排序算法 主要讲解C#经典十大排序算法的实现,部分包含图解!
C#数据结构与算法实战入门指南 C#数据结构与算法实战入门指南 C#数据结构与算法实战入门指南
再升级!MoneyPrinterPlus集成GPT_SoVITS
MoneyPrinterPlus现在可以和大名鼎鼎的GPT_SoVITS集成了,让money printer快人一步
再升级!MoneyPrinterPlus集成GPT_SoVITS 再升级!MoneyPrinterPlus集成GPT_SoVITS 再升级!MoneyPrinterPlus集成GPT_SoVITS