如何完成一个简单的rust WebAssembly调用

news/2025/11/12 17:31:17/文章来源:https://www.cnblogs.com/JohannaFeng/p/19214824

1、安装wasm编译目标

rustup target add wasm32-unknown-unknown
wasm32-unknown-unknown 是 WebAssembly (Wasm) 的一个编译目标,表示一个独立于特定环境(如浏览器或Node.js)的 32 位 WebAssembly 二进制文件。它是 Rust 等语言编译成 WebAssembly 的基础,用于生成可在任何支持 Wasm 的环境中运行的代码。 - wasm32: 指示目标架构是 32 位 WebAssembly。
- unknown: 表示目标操作系统和 ABI(应用程序二进制接口)是未知的,因为 Wasm 是一种通用格式,它不依赖于特定的操作系统。
- 用途: 它是生成独立于特定环境的 WebAssembly 模块的基础。
- 扩展: 在 wasm-bindgen 等项目中,wasm32-unknown-unknown 是基础目标,其他特定环境的目标会基于它进行扩展,以添加与 JavaScript 或其他环境的绑定代码和加载逻辑。 

2、安装wasm-pack可执行工具

cargo install wasm-pack

3、以lib形式新建项目

cargo new wasm-demo --lib

4、在wasm-demo的toml文件加上

[package]
name = "wasm-demo"
version = "0.1.0"
edition = "2024"[lib]
crate-type = ["cdylib"][dependencies]
wasm-bindgen = "0.2.105"

解析: crate-type是什么

   crate-type = ["cdylib"] 是 Rust 项目中的一个配置,它告诉编译器将项目编译成一个动态库,该库可以被其他语言(如 C, C++)通过 FFI (Foreign Function Interface) 调用。这意味着生成的库不是一个独立的 Rust 可执行文件,而是供其他程序集成的共享库文件,例如生成 .so (Linux), .dylib (macOS) 或 .dll (Windows) 文件。 详细解释:
- [lib]: 这表示该配置是针对库 (lib) 的。在 Cargo.toml 文件中,[lib] 部分通常包含关于如何构建这个库的设置。
- crate-type: 这个键指定了 Rust crate 的类型。
- ["cdylib"]: 这是 crate-type 的一个值,表示创建的是一个 "C-compatible dynamic library"。
- c: 强调这是一个可以被 C 语言使用的动态库。
- dylib: 表示这是一个动态库文件,而不是静态库。
- 用途: 这种设置主要用于希望将 Rust 代码作为库提供给其他非 Rust 语言的项目使用,例如开发操作系统组件、游戏引擎、浏览器插件等。 
与其他库类型的区别
- rlib: 这是 Rust 自身的静态库格式,只能被其他 Rust 项目链接使用。
- staticlib: 创建一个可以在其他语言中作为静态库使用的库,它会被直接链接到目标程序中,而不是作为单独的动态共享库

5、lib.rs文件写上

use wasm_bindgen::prelude::*;#[wasm_bindgen]
pub fn add(left: u64, right: u64) -> u64 {left + right
}#[wasm_bindgen]
pub fn greet(name: &str) -> String {format!("Hello, {}!", name)
}#[wasm_bindgen]
pub fn sum_bytes(data: &[u8]) -> u32 {data.iter().map(|&b| b as u32).sum()
}#[wasm_bindgen]
pub fn make_data(size: usize) -> Vec<u8> {(0..size as u8).collect()
}#[cfg(test)]
mod tests {use super::*;#[test]fn it_works() {let result = add(2, 2);assert_eq!(result, 4);}#[test]fn greet_works() {let result = greet("World");assert_eq!(result, "Hello, World!");}#[test]fn sum_bytes_works() {let data = vec![1, 2, 3, 4, 5];let result = sum_bytes(&data);assert_eq!(result, 15);}#[test]fn make_data_works() {let size = 5;let result = make_data(size);assert_eq!(result, vec![0, 1, 2, 3, 4]);}
}

6、编译成wasm

  • 运行后可以看见一个pkg文件夹,里面有wasm、ts和js的后缀文件,这些就是可以在网页中直接使用的文件。
wasm-pack build --target web

7、调用

<!DOCTYPE html>
<html><body><button id="btn">add</button><button id="btn1">greet</button><button id="btn2">sum</button><button id="btn3">array</button><script type="module">import init, { add, greet,sum_bytes,make_data} from "./wasm-demo/pkg/wasm_demo.js";// 初始化 WASM 模块async function main() {await init(); }main();//   绑定按钮事件   document.getElementById("btn").onclick = () => {alert("ADD" + add(10n, 20n));};document.getElementById("btn1").onclick = () => {alert(greet("Rust"));};document.getElementById("btn2").onclick = () => {alert(sum_bytes(new Uint8Array([1,2,3,4,5])));};document.getElementById("btn3").onclick = () => {alert(make_data(5));};</script></body>
</html>

8、wasm里rust和js类型的对应问题

number:- i8	- i16	- i32- u8	- u16	- u32	- f32	- f64	
BigInt:- i64- u64
boolean:- bool
string:- char- &str- String
Array:- vec
TypedArray:- &[T]- Uint8Array = &[u8]- Int8Array = &[i8]- Uint16Array = &[u16]- Float32Array = &[f32]- Float64Array = &[f64]
  • 上面代码可以看见BigInt数字要加上n,不然报错。
  • 而最后的类型切片, 其实涉及共享内存的概念——Rust的数组数据存放在wasm的线性内存(WebAssembly.Memory)中,而 JS 的 Uint8Array 是这块内存的“视图”,也就是说Rust的&[u8]只是这块内存的“引用”,而JS的Uint8Array是通过 new Uint8Array(wasm.memory.buffer, offset, length)访问相同的内存。这期间wasm-bindgen完成了:
      -- 把 JS 数组拷贝进 wasm 内存;-- 传入内存偏移和长度;-- 调用 wasm 函数;-- 可能再把结果从 wasm 内存拷回 JS。
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/963635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

焊接工业机器人节气装置

在现代制造业如飞驰列车般迅猛发展的当下,机器人焊接技术俨然成为提升生产效率、铸就高品质产品的中流砥柱。但在这看似一切顺遂的背后,焊接过程中保护气体的消耗问题,却似一座横亘于制造成本之途的大山,令人颇为挠…

详细介绍:考研408--组成原理--day1

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:海尔 Haier Master 智能家居网关安装 Home Assistant 实践指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

枣庄西林瓶灌装轧盖机:SIP灭菌快,自动冷却高效

在枣庄地区,随着制药与生物制剂产业的持续升级,对西林瓶灌装设备的技术要求日益精细化。尤其在涉及无菌保障的关键环节——SIP(在线灭菌)流程中,用户普遍关注两个核心问题:一是整个灭菌周期需要多长时间;二是灭…

【Nano Banana超详细教程】AI绘图神器Gemini 2.5实测:一键生成神图!

【Nano Banana超详细教程】AI绘图神器Gemini 2.5实测:一键生成神图!Nano Banana,大香蕉模型小名“纳米香蕉”是 Google/DeepMind 推出的图像生成/编辑子模型(Gemini 2.5 Flash Image 系列的俗称),以强大的一步/迭…

已完成今日基础缩索大学习

搜索,指通过对状态进行枚举,来计算最优解或统计解的个数。 一般的题目很少有纯粹搜索,但它是很多算法的基础,并且在考场上考虑拿暴力分时,它应该是最好的选择了。 dfs 深度优先搜索(dfs),指通过递归的方式,将…

配置ElactisSearch跨域

配置ElactisSearch跨域,从而使head能够成功connect上ElactisSearch。 1.先在yml配置文件中,将安全配置总开关关闭: xpack.security.enabled: false当xpack.security.enabled: false,则 xpack.security.enrollment.…

西林瓶粉末灌装机:塔城培训服务免费提供

在当前制药与生物制剂设备采购市场中,用户对西林瓶灌装设备的选购已从单纯关注价格,逐步转向对技术适配性、售后服务体系及培训支持能力的综合评估。据2024年行业调研数据显示,超过68%的采购决策者将“是否提供系统…

Ubuntu设置中文智能拼音输入法

设置-区域与语言-汉语-中文智能拼音

一份用pyhon生成word/wps文档的代码2

import os, pythoncom, win32com.client as win32 ---------------------- 工具函数 ---------------------- def get_or_add_style(doc, name): try: return doc.Styles(name) except: return doc.Styles.Add(Name=na…

200粉粉福

博客园评论 和 luogu私信 均可 Q&A(询问与回答)

【chrome】chrome浏览器OptGuideOnDeviceModel模型占用磁盘空间的解决方法!

解决方法: 1、在浏览器依次输入以下内容并回车,在结果页面修改状态为关闭 chrome://flags/#prompt-api-for-gemini-nanochrome://flags/#optimization-guide-on-device-model2、删除该文件所属目录OptGuideOnDeviceM…

这样的算作“全栈技术”吗?

一、前端 1、vue3开发web端,并生成build包,加生产配置,开发后台管理系统,包括用户管理、系统管理、系统详情、内存、cpu、磁盘、数据看板 2、vue3 +uniapp开发手机端 二、后端 1、python开发后端webapi接口 2、nod…

2025-11-12 aoao Round2 赛后总结

T1 空 题意 给定一个排列 \(p\) 和一个数 \(b\),求这个排列有多少长度为奇数的子段的中位数是 \(b\)。 赛时 观察性质。 题解 考虑把排列中大于 \(b\) 的数变成 \(1\),小于 \(p\) 的数变成 \(-1\)。 所以做个前缀和,…

商丘西林瓶灌装线:人员更替需再培训?费用明晰

在制药与生物制剂行业,西林瓶灌装设备的操作人员流动性问题日益受到关注。尤其当熟悉流程的技术人员离职后,新接手人员是否需要重新培训、二次培训成本如何控制,成为企业采购决策中的关键考量因素之一。面对这一现实…

vue3+ts实现页面滚动位置的保存及恢复

vue3+ts实现页面滚动位置的保存及恢复前言: 折腾了n个小时才搞定,这个在vue2中不显眼的功能到了vue3中没想到成为了拦路虎。借助于AI一遍一遍的尝试各种方案,最终敲定了路由scrollBehavior保存组件滚动位置到pinia,…

SAP屏幕增强自定义界面字段使用自定义搜索帮助方法

背景:在比如采购订单、销售订单屏幕界面,做了自定义字段,里面要选择一些底表的数据显示。 1、直接使用系统标准的搜索帮助。 假设我们已经有底表数据ZTCMS002,SE11建立搜索帮助. 进到屏幕界面,点击布局 双击字段,…

南大-操作系统-绿导师原谅你了

现在在看的视频: 操作系统上的程序 (什么是程序和编译器) [南京大学2022操作系统-P2] 1. 缘起 事情起因是在学习youtube上benEater的制作cpu的视频,然后在b站上搜索有没有人做过搬运或者中文翻译的视频。 B站搜索后找…

昌都西林瓶粉末灌装机:远程可控,手机电脑轻松操作

在制药、生物试剂及精细化工等行业,西林瓶灌装设备的选型常面临多重挑战:一方面,用户对灌装精度、洁净等级、自动化程度等核心参数理解不足;另一方面,市场产品种类繁杂,功能描述模糊,导致需求与设备实际能力错配…

深入解析:EI会议预订又又+1

深入解析:EI会议预订又又+12025-11-12 17:07 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…