当前位置: 首页 > article >正文

Rust + WebAssembly 新手完全入门指南

Rust WebAssembly 新手完全入门指南这篇文章面向前端、Rust 开发者只要跟着步骤就能跑通你的第一个 WebAssembly 前端组件。WebAssembly 是什么WebAssembly简称 Wasm是一种可在现代浏览器中运行的低级、紧凑、高效的二进制指令格式。它的出现主要是用来解决 JavaScript 天生的性能瓶颈尤其是计算密集型场景下WebAssembly 能达到接近原生的执行性能。可以说WebAssembly 的出现使得在网页上运行高级、复杂的客户端应用如图像编辑、Web AI 推理、复杂的游戏引擎成为可能。通过 caniuse我们可以看到 WebAssembly 在主流浏览器中已经广泛可用如下图所示环境准备首先确保你已经安装好 Nodejs 和 Rust 环境。这里我们会用到 wasm-packwasm-pack是 Rust Wasm 开发的核心工具负责构建、打包、测试 Wasm 项目。# 安装 wasm-packcargoinstallwasm-pack接下来我们使用wasm-pack初始化项目# 初始化项目wasm-pack new wasm-examplecdwasm-examplewasm-pack会帮我们生成如下的目录结构.├── Cargo.toml ├── LICENSE_APACHE ├── LICENSE_MIT ├── README.md ├── src │ ├── lib.rs │ └── utils.rs └── tests └── web.rswasm-pack初始化项目时默认使用的是 wasm-pack-template 这个模板由于缺少维护所以默认使用的Edition、wasm-bindgen 等的版本都比较低你可以手动调整下但是在这个案例中我们就暂时不动它们了。在以后的开发中你可以维护一个自己的模板然后通过如下命令使用模板wasm-pack newname--templatetemplate实现一个简单 Wasm 组件我们首先实现一个简单 Wasm 组件我们将会用到 js-sys 这个库它包含 JavaScript 语言本身的 API如数组、字符串、console、Promise 等。# 添加 js-syscargoaddjs-sys现在我们直接修改src/lib.rs文件# 默认模板里有 src/utils.rs这里引入了它modutils;usewasm_bindgen::prelude::*;#[wasm_bindgen]pubfnsum_array(arr:js_sys::Array)-u32{letmutsum0;foriin0..arr.length(){letvalarr.get(i).as_f64().unwrap_or(0.0)asu32;sumval;}sum}#[wasm_bindgen]属性宏声明了将导出sum_array函数以供 JS 调用这就是我们这个简单组件提供的能力。接下来我们进行编译wasm-pack build--targetweb编译完成后我们可以在pkg目录中看到编译结果pkg ├── package.json ├── README.md ├── wasm_example_bg.js ├── wasm_example_bg.wasm ├── wasm_example_bg.wasm.d.ts ├── wasm_example.d.ts └── wasm_example.jswasm_example_bg.wasm是核心的 Wasm 二进制文件包含我们编写的 Rust 逻辑wasm_example.js是 JS 胶水代码负责 Wasm 的加载、类型转换把 Rust 函数封装成 JS 可直接调用的方法wasm_example.d.ts是 TypeScript 类型定义用于支持 TS 项目。这里的--target web表示我们的目标编译平台是 web这样方便在 HTML 文件中引入。在根目录创建index.html并编辑!DOCTYPEhtmlhtmllangenheadmetacharsetUTF-8metanameviewportcontentwidthdevice-width, initial-scale1.0titleRust WebAssembly/title/headbodyscripttypemoduleimportinit,{sum_array}from./pkg/wasm_example.js;awaitinit();console.log(求和结果为,sum_array([10,20,30]));/script/body/html由于浏览器的安全策略不允许加载本地 Wasm 模块所以无法使用file://协议打开 HTML 文件我们需要一个本地 HTTP 服务器来启动项目。npx serve.这时候打开浏览器的控制台就能够看到打印出来的求和结果了。使用 Rust 操作 DOM借助 web-sys我们可以直接用 Rust 操作 DOM。与js-sys不同web-sys包含浏览器环境提供的 Web API。cargoaddweb-sys--featuresWindow,Document,HtmlElement这里需要注意的是web-sys必须指定启用的feature不然编译不通过。现在我们通过web-sys来修改网页标题编辑src/lib.rs添加#[wasm_bindgen]pubfnset_title(title:str){// 1. 获取 window 对象letwinmatchweb_sys::window(){Some(w)w,Nonereturn,};// 获取 document 对象letdocmatchwin.document(){Some(d)d,Nonereturn,};// 修改网页标题doc.set_title(title);}重新编译完成后我们修改index.html添加scripttypemoduleimportinit,{set_title,sum_array}from./pkg/wasm_example.js;awaitinit();console.log(求和结果为,sum_array([10,20,30]));set_title(Hello world);/script刷新网页后我们就能够看到网页的标题被修改为Hello world了。接入 Vite在实际开发中我们很少直接写原生 HTML基本上是基于 Vite、Webpack 等构建工具进行开发这里以最常用的 Vite 为例演示如何集成 Rust Wasm。npmcreate vitelatest wasm-vite-example ----templatevanilla-tscdwasm-vite-example把之前的wasm-example项目整个拷贝到wasm-vite-example的根目录。在实际开发中这种时候肯定是要用 monorepo 的但在这个案例中就不这么弄了一切从简。.├── .gitignore ├── index.html ├── node_modules ├── package-lock.json ├── package.json ├── public ├── src ├── tsconfig.json └── wasm-example安装插件npminstall-Dvite-plugin-wasm-pack创建vite.config.ts并编辑import{defineConfig}fromvite;importwasmPackfromvite-plugin-wasm-pack;exportdefaultdefineConfig({plugins:[wasmPack(./wasm-example)]});接下来在src/main.ts中添加上我们之前写的业务逻辑如下importinit,{set_title,sum_array}fromwasm_exampleasyncfunctioninitWasm(){awaitinit();console.log(求和结果为,sum_array([10,20,30]));set_title(Hello world);}initWasm();启动开发服务npmrun dev打开浏览器就能看到 Wasm 函数的执行结果了。结尾至此我们就成功实现了第一个 WebAssembly 前端组件虽然它很简陋没有涉及到测试与调试如用wasm-pack test进行单元测试、使用浏览器 DevTools 调试 Wasm 代码Wasm 高级特性如共享内存、多线程、SIMD 指令等性能优化与踩坑。不过没有关系这些内容在后续的文章更新中可能会涉及到。现在我们需要做的是动手实现一遍这个简单的 Wasm 组件。毕竟对于新手而言最好的学习方式就是动手实践。

相关文章:

Rust + WebAssembly 新手完全入门指南

Rust WebAssembly 新手完全入门指南 这篇文章面向前端、Rust 开发者,只要跟着步骤就能跑通你的第一个 WebAssembly 前端组件。 WebAssembly 是什么 WebAssembly(简称 Wasm)是一种可在现代浏览器中运行的低级、紧凑、高效的二进制指令格式…...

MySQL——事务管理

一、认识事务1.引入若MySQL的CURD不加控制会出现的问题:对于以上的问题,CURD 满足以下条件买票的过程是原子的买票互相不能影响买完票要永久有效买前,和买后都要是确定的状态而事务就是来解决这种问题的2.事务的概念事务的定义事务是由一组逻…...

终极原神帧率解锁指南:简单三步突破60FPS限制

终极原神帧率解锁指南:简单三步突破60FPS限制 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 还在为《原神》的60FPS帧率限制感到困扰吗?你的高性能硬件是否被游戏…...

洋葱这都啥问题啊?

洋葱问题一、伪人现象严重目前“洋葱”有不少伪人。它们集中于各大试炼场与不知名班级,人人不漏面,神神秘秘。 1. 伪人在哪里? 可以去“我的—我的班级”里添加班级,建议随机填写六个数字,其中“555553”特别厉害&…...

轻量级CoAP库:面向Arduino/ESP32的嵌入式RESTful通信实现

1. 项目概述 CoAP Simple Library 是一款专为资源受限嵌入式平台设计的轻量级 Constrained Application Protocol(CoAP)协议实现,面向 Arduino 生态系统(包括 ESP32、ESP8266、Particle Photon/Core 等主流 MCU 平台)提…...

SAP BAPI实战:生产工单入库与取消入库的MIGO操作指南(101/102)

1. SAP生产工单入库与取消入库的核心逻辑 在SAP系统中处理生产工单的物料移动时,101和102移动类型是最常用的组合。101代表生产入库,102则是它的逆向操作——生产取消入库。这两种移动类型构成了生产执行环节的闭环管理。 我见过不少新手容易混淆这两个移…...

当“按键伤企”遇上AI:舆情处置不再靠“刷脸”

你有没有发现,这几年“按键伤企”这个词出现的频率越来越高?一条没经过核实的短视频、一波有组织的恶意差评、一篇断章取义的自媒体文章,都能在极短时间内把一家企业推上风口浪尖。更让人头疼的是,等你反应过来想处理时&#xff0…...

六爻预测实战:如何用六爻占卜婚姻、事业与财运(附真实案例解析)

六爻预测实战:如何用六爻占卜婚姻、事业与财运(附真实案例解析) 六爻预测作为易学体系中最具实操性的分支,近年来在婚姻决策、职业规划和投资理财等领域的应用越来越广泛。不同于星座运势的泛泛而谈,六爻通过严谨的卦象…...

终极指南:3步快速解密网易云音乐NCM文件,免费解锁你的音乐库

终极指南:3步快速解密网易云音乐NCM文件,免费解锁你的音乐库 【免费下载链接】ncmppGui 一个使用C编写的转换ncm文件的GUI工具 项目地址: https://gitcode.com/gh_mirrors/nc/ncmppGui 你是否曾经在网易云音乐下载了喜欢的歌曲,却发现…...

数据结构可视化:用动画演示哈夫曼树的构建过程(Web版可交互)

数据结构可视化:用动画演示哈夫曼树的构建过程(Web版可交互) 在计算机科学中,理解复杂算法的内部工作原理往往需要直观的视觉辅助。哈夫曼编码作为一种经典的数据压缩算法,其核心在于构建最优前缀码的二叉树结构。传统…...

【0基础学机器学习】2.决策树

决策树模型笔记 1. 基础知识 基本模型形式 决策树是一种常见的监督学习模型,既可以做分类,也可以做回归。它通过一系列“如果…那么…”的规则不断划分特征空间,最终在叶子节点给出预测结果。 对于分类任务,模型会根据样本特征逐层…...

Rigol DHO1000系列示波器实测:12-bit高分辨率到底有多香?

Rigol DHO1000系列示波器实测:12-bit高分辨率如何重塑精密测量体验 当你在调试一个微弱的生物电信号传感器,或是排查物联网设备的低功耗射频干扰时,传统8-bit示波器上那些模糊的波形轮廓是否曾让你陷入"猜谜游戏"?去年我…...

C盘清理后如何恢复Python环境并部署Nanbeige 4.1-3B

C盘清理后如何恢复Python环境并部署Nanbeige 4.1-3B 你是不是也遇到过这种情况?为了给C盘腾出空间,一顿操作猛如虎,结果回头一看,Python环境没了,项目依赖也找不到了,整个人瞬间懵了。特别是当你正准备部署…...

AI营销进入深水区:2026年主流GEO服务商竞争格局与战略价值报告

2026年3月GEO服务商权威榜单与选型指南正式发布。本榜单基于对行业技术演进与商业实践的持续观察,结合多家第三方独立分析机构的公开数据与评测框架,旨在为企业提供一份客观、实用的GEO服务商参考名单。随着生成式AI深度融入商业决策,GEO&…...

PlantUML vs Visual Paradigm:哪个更适合你的UML绘图需求?

PlantUML与Visual Paradigm深度对比:如何选择最适合你的UML工具? 在软件开发、系统设计或业务流程建模中,UML(统一建模语言)是工程师们不可或缺的沟通工具。面对众多UML工具,开发者常陷入选择困境&#xff…...

Z-Image-Turbo-辉夜巫女性能优化:利用CUDA与卷积神经网络加速推理

Z-Image-Turbo-辉夜巫女性能优化:利用CUDA与卷积神经网络加速推理 最近在星图GPU上部署Z-Image-Turbo-辉夜巫女模型时,我发现了一个问题:生成单张高清图片的时间比预期要长。对于需要批量处理或者实时交互的场景来说,这个速度显然…...

基于EmbeddingGemma-300m的MySQL全文搜索优化方案

基于EmbeddingGemma-300m的MySQL全文搜索优化方案 1. 引言 在日常的业务系统中,我们经常会遇到这样的场景:用户想搜索"性价比高的笔记本电脑",但传统的MySQL全文搜索只能匹配包含这些关键词的记录,无法理解"性价…...

百川2-13B-Chat WebUI v1.0 实战指南:如何用‘请继续’解决回复中断问题

百川2-13B-Chat WebUI v1.0 实战指南:如何用‘请继续’解决回复中断问题 你是不是也遇到过这种情况?用大模型聊天,正说到关键地方,它突然就“卡壳”了,回复戛然而止,留下一句没说完的话,让人抓…...

Python零基础到入门-八大基本数据类型(2)

5.字典类型(dict)字典类型是 key:value 形式来存储数据语法:{"key":"value"}people_info{"name":"zhang san","age":25,"gender":"male"} # 方式一&#…...

GCN在推荐系统中的落地实践:如何用DGL构建用户-商品二部图模型

GCN在推荐系统中的落地实践:如何用DGL构建用户-商品二部图模型 推荐系统作为互联网产品的核心组件,其性能直接影响用户体验和商业价值。传统协同过滤方法面临数据稀疏和冷启动的挑战,而图卷积网络(GCN)通过挖掘用户-商…...

windows的hadoop集群环境直接配

已经配好资源如下: https://download.csdn.net/download/hashiqimiya/92754521https://download.csdn.net/download/hashiqimiya/92754521 修改 core-site.xml 配置文件 : - 找到文件: G:\1\hadoo2.6.4的hadoop.dll和winutils.exe\em\hado…...

Arduino I2C LCD驱动库:PCF8574与HD44780通信详解

1. 项目概述LCD_I2C 是一款专为 Arduino 平台设计的轻量级 C 库,用于驱动基于 PCF8574 IC 扩展芯片的 162 字符型液晶显示屏。该库不依赖于 Arduino LiquidCrystal 库的底层并行接口实现,而是完全重构为面向 IC 总线通信的专用驱动架构,通过 …...

【仅限医疗器械开发者】:C语言合规检查自动化流水线搭建(Jenkins+GitLab CI+定制化MISRA规则集)

第一章:医疗器械C语言合规检查的法规与标准全景医疗器械软件的安全性与可靠性直接受其底层C语言实现质量影响,因此全球主要监管体系均对嵌入式C代码提出明确合规要求。在法规层面,ISO 13485:2016《医疗器械 质量管理体系》为开发流程提供框架…...

GEENYmodem库:面向tingg.io平台的嵌入式GPRS物联网开发框架

1. GEENYmodem 库概述GEENYmodem 是一款专为 GEENYmodem GPRS 模块设计的 Arduino 兼容库,核心目标是简化嵌入式设备通过蜂窝网络接入物联网平台的开发流程。该模块采用标准 UART 接口与主控 MCU(如 ATmega328P、ESP32、STM32F1/F4 系列)通信…...

libesp:ESP-IDF嵌入式开发的高精度延时与结构化日志增强库

1. libesp 库概述:ESP-IDF 生态中的底层工具集libesp 是一个面向 ESP32/ESP32-S2/S3/C3/C6 系列 SoC 的轻量级、生产就绪型辅助库,构建于 Espressif 官方 ESP-IDF 框架之上。它并非替代 ESP-IDF 的核心组件(如 FreeRTOS、driver、hal、soc&am…...

AnimateDiff部署教程:CentOS7+Anaconda环境从零构建稳定运行栈

AnimateDiff部署教程:CentOS7Anaconda环境从零构建稳定运行栈 本文详细讲解如何在CentOS 7系统上,通过Anaconda环境从零开始部署AnimateDiff文生视频模型,构建稳定可靠的AI视频生成环境。 1. 环境准备与系统要求 在开始部署之前,…...

2026年主流VPS线路类型深度解析与选择指南

前言 VPS(虚拟专用服务器)的线路类型直接决定了国内用户的访问体验。本文将从技术角度客观分析目前市面上主流的几种线路类型,帮助大家根据实际需求做出理性选择。声明:本文仅为技术科普,不构成任何购买建议。数据来源…...

Janus-Pro-7B开源生态与社区贡献指南

Janus-Pro-7B开源生态与社区贡献指南 如果你对Janus-Pro-7B这个模型感兴趣,并且想为它做点什么,那这篇文章就是为你准备的。开源项目就像一个热闹的集市,模型本身是集市中央最亮眼的商品,但围绕它搭建的货架、提供的工具、以及来…...

混合信号PCB设计:模拟与数字电路的噪声隔离与电源去耦

1. 模拟与数字电路PCB设计的本质差异 在现代电子系统开发中,混合信号PCB已成为常态。无论是工业传感器节点、医疗设备前端调理电路,还是音频处理模块,工程师都必须同时面对模拟信号链的微伏级精度要求与数字逻辑的纳秒级开关瞬态。这种共存并…...

立知lychee-rerank-mm在智能客服中的落地:用户问题-解决方案匹配

立知lychee-rerank-mm在智能客服中的落地:用户问题-解决方案匹配 1. 引言:智能客服的“最后一公里”难题 想象一下这个场景:一位用户正在电商平台的客服聊天窗口里,焦急地输入:“我买的白色T恤,洗了一次就…...