【初接触】【学习】编译 Rust 为 WebAssembly

前言

需要先了解以下知识:

  • WebAssembly
  • Rust
  • wasm_bindgen
  • wasm-pack
  • js-sys
  • web-sys
  • JavaScript
  • HTML
  • CSS
  • webpack

假设您已经了解所有知识点,并且您的环境中已安装了 Node.js和npm 以及 Rust 的完整开发工具链(包括 rustc、cargo 和 rustup),我们现在可以进行下一步。

1. 创建项目

1.1 初始化项目
wasm-pack new demo
cd .\demo\
npm init -y

在这里插入图片描述

1.2 demo目录下创建index.js文件和index.html文件
<!-- path demo/index.html -->
<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title>hello-wasm example</title></head><body></body>
</html>
// path demo/index.js
// empty

2. 配置webpack

2.1 安装依赖包
npm install html-webpack-plugin webpack webpack-cli webpack-dev-server -D
2.2 新建webpack.config.js文件
// path demo/webpack.config.js
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
/*** @type {import ("webpack").Configuration}*/
module.exports = {mode: "development",entry: path.resolve(__dirname, "./index.js"),output: {path: path.resolve(__dirname, "dist"),filename: "index.bundle.js",},experiments: { asyncWebAssembly: true },plugins: [new HtmlWebpackPlugin({template: path.resolve(__dirname, "./index.html"),}),],
};
2.3 在package.json文件中新增指令
// path demo/package.json
//...
"scripts": {"dev": "webpack server --progress --open","test": "echo \"Error: no test specified\" && exit 1"}
//...

3. 运行默认输出

3.1 wasm-pack build
wasm-pack build

在这里插入图片描述

3.2 修改index.js内容
// path demo/index.js
async function main() {try {const { greet } = await import("./pkg/demo.js");greet();} catch (error) {console.log(error);}
}
main();
3.3 npm run dev
npm run dev

浏览器打开http://localhost:8080/:
在这里插入图片描述

小结

我们已经成功地从 JavaScript 调用了 Rust,并从 Rust 调用了 JavaScript。

4. 初尝试

在 Rust 中定义一个 Transform 结构体,并通过 WebAssembly 技术,在 JavaScript 中实例化和操作这个 Transform 结构体。

4.1 修改lib.rs文件
// path demo/src/lib.rs
use wasm_bindgen::prelude::*;#[wasm_bindgen]
#[derive(Debug, Clone)]
pub struct Transform {x: f32,y: f32,width: f32,height: f32,
}#[wasm_bindgen]
impl Transform {#[wasm_bindgen(constructor)]pub fn new(x: f32, y: f32, width: f32, height: f32) -> Transform {Transform {x,y,width,height,}}#[wasm_bindgen(getter)]pub fn x(&self) -> f32 {self.x}#[wasm_bindgen(setter)]pub fn set_x(&mut self, value: f32) {self.x = value;}#[wasm_bindgen(getter)]pub fn y(&self) -> f32 {self.y}#[wasm_bindgen(setter)]pub fn set_y(&mut self, value: f32) {self.y = value;}#[wasm_bindgen(getter)]pub fn width(&self) -> f32 {self.width}#[wasm_bindgen(setter)]pub fn set_width(&mut self, value: f32) {self.width = value;}#[wasm_bindgen(getter)]pub fn height(&self) -> f32 {self.height}#[wasm_bindgen(setter)]pub fn set_height(&mut self, value: f32) {self.height = value;}
}
4.2 wasm-pack build
wasm-pack build
4.3 修改index.js文件
// path demo/index.js
async function main() {try {const { Transform } = await import("./pkg/demo.js");const transform = new Transform(0, 0, 100, 100);transform.x = 10;transform.y = 10;console.log(transform);} catch (error) {console.log(error);}
}
main();

在这里插入图片描述

总结

以上是对我近期探索将 Rust 编译为 WebAssembly 的总结,若有任何不准确之处,欢迎指正。

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

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

相关文章

探秘仓颉编程语言:使用体验与功能剖析

目录 一、引言&#xff1a;仓颉登场&#xff0c;编程新纪元开启 二、初体验&#xff1a;搭建环境与 “Hello World” &#xff08;一&#xff09;环境搭建指南 &#xff08;二&#xff09;Hello World 初印象 三、核心特性剖析&#xff1a;智能、高效、安全多维解读 &…

[Java]合理封装第三方工具包(附视频)

-1.视频链接 视频版: 视频版会对本文章内容进行详细解释 [Java]合理封装第三方工具包_哔哩哔哩_bilibili 0.核心思想 对第三方工具方法进行封装,使其本地化,降低记忆和使用成本 1.背景 在我们的项目中,通常会引用一些第三方工具包,或者是使用jdk自带的一些工具类 例如: c…

Ubuntu环境 nginx.conf详解(三)

1、nginx.conf 结构详解&#xff1a; http 块&#xff1a;用于配置 HTTP 服务器的相关设置&#xff0c;包括处理 HTTP 和 HTTPS。 stream 块&#xff1a;用于配置 TCP/UDP 代理服务器&#xff0c;适用于需要进行四层负载均衡的情况。 ... # 全局块 events {...} …

AI真的可以“陪伴”吗?

人们普遍渴求陪伴&#xff0c;仅有4.6%的人认为自己的陪伴需求都被满足了&#xff0c;剩下大部分人群都面临着各种各样的社交困境。 “陪伴”有多个层次。最狭义的“陪伴”是在人与人之间发生的&#xff1b;但稍微放宽一些&#xff0c;宠物甚至植物、家具也会让…

Golang 的并发优势

在如今的编程领域&#xff0c;一个程序能够同时处理多个任务的能力非常重要&#xff0c;这就是所谓的并发处理。而 Golang 在并发编程方面表现十分出色&#xff0c;具有很多独特的优势&#xff0c;简直不要太简单。 一、轻量级的协程&#xff08;Goroutine&#xff09; 在传统…

基于cobra开发的k8s命令行管理工具k8s-manager

基于cobra开发的k8s命令行管理工具k8s-manager 如果觉得好用&#xff0c;麻烦给个Star!通用配置1 node 分析所有node的资源情况2 analysis 分析Node节点上的资源使用构成3 image 获取指定namespace的所有镜像地址4 resource 获取指定namespace的所有limit 与 Requests大小5 top…

从零开始C++游戏开发之第七篇:游戏状态机与回合管理

在游戏开发的道路上&#xff0c;状态管理是一个无法绕开的重要课题。尤其是在棋牌类游戏中&#xff0c;游戏的进行需要有条不紊地按照回合推进&#xff0c;同时管理多个游戏状态&#xff0c;如“等待玩家加入”、“游戏进行中”、“结算阶段”等。如何优雅且高效地实现这些逻辑…

USB Hub 检测设备

系列文章目录 xHCI 简单分析 USB Root Hub 分析 USB Hub 检测设备 文章目录 系列文章目录一、引言二、hub_eventshub_port_connect_changeusb_alloc_devusb_set_device_statehub_port_initusb_new_device 一、引言 USB Hub 检测设备 一文中讲到&#xff0c;当有 USB 插入时&…

MySQL从入门到入土---MySQL表的约束 (内含实践)---详细版

目录 引入&#xff1a; null 与not null default&#xff1a; comment列描述 &#xff1a; not null 和 default&#xff1a; zerofill &#xff1a; 主键&#xff1a;primary key 复合主键&#xff1a; 自增长:auto_increment 唯一键&#xff1a;unique key 外键&a…

Redis大Key问题全解析

1. 引言 1.1 什么是Redis大Key&#xff1f; Redis大Key是指单个Key对应的数据量过大&#xff0c;占用过多的内存或导致操作耗时较长的现象。大Key可以是以下几种常见数据类型中的任意一种&#xff1a; String类型&#xff1a;单个字符串的长度过大。List类型&#xff1a;包含…

VIVO Android面试题及参考答案

请重写算法题:求数组的全排列。 思路: 要获取一个数组的全排列,我们可以利用回溯算法。具体来说,回溯算法通过递归的方式逐步生成排列,在每一步都将一个元素加入排列中,然后在下一步递归中排除已选元素,回溯的时候撤销选择,尝试其他可能。 步骤: 递归生成排列: 使…

易语言 OCR 文字识别

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

postgreSql对分钟级的降雨数据进行插值为整小时

postgreSql对分钟级的降雨数据进行插值为整小时 1.SQL语句实现&#xff1a;对分钟级的降雨数据进行插值为整小时2.SQL语句实现&#xff1a;将水库、水文站、水闸按照分钟时间插值到小时 1.SQL语句实现&#xff1a;对分钟级的降雨数据进行插值为整小时 --核查某个小流域的降雨量…

docker如何打包部署springboot的项目

一、将项目打包成jar包&#xff0c;或者war包。 首先&#xff0c;确保已经使用 Maven 或 Gradle 等工具将项目打包成 JAR 文件。如果使用的是 Maven&#xff0c;可以通过以下命令打包&#xff1a; #gradle 构建的项目 gradle build #mvn 构建项目、 mvn clean packege …

【JS】for-in 和 for-of遍历对象的区别

【介绍】 for-in 和 for-of 都是 JavaScript 中用于遍历数据结构的循环语句&#xff0c;但它们的工作原理和适用场景有所不同。特别是它们在遍历对象时的行为是不同的。 【区别】 for-in 遍历对象 for-in 是用于遍历对象的 可枚举属性的键名&#xff08;属性名&#xff09;…

GraalVM完全指南:云原生时代下使用GraalVM将Spring Boot 3应用转换为高效Linux可执行文件

一、前言 在现代软件开发中,启动速度和资源利用率常常是衡量应用性能的关键指标。对于基于Spring Boot的应用来说,虽然它们易于开发和部署,但JVM的启动时间有时会成为一个瓶颈。本文介绍如何使用GraalVM将Spring Boot 3应用编译成原生Linux可执行文件,从而显著提高启动速度…

Word批量更改题注

文章目录 批量更改批量去除空格 在写文章的时候&#xff0c;往往对图片题注有着统一的编码要求&#xff0c;例如以【图 1- xx】。一般会点击【引用】->【插入题注】来插入题注&#xff0c;并且在引用的时候&#xff0c;点击【引用】->【交叉引用】&#xff0c;并且在交叉…

基于SpringBoot的蜗牛兼职网的设计与实现

一、项目背景 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。人们生活水平的不断提高&#xff0c;日常生活中人们对蜗牛兼职网方面的要求也在不断提高&#xff0c;需要兼职工作的人数更是不断增加&#xff0c;使得蜗牛兼职网的开发成为必需而且紧迫的事情。蜗牛…

shardingsphere分库分表项目实践5-自己用java写一个sql解析器+完整项目源码

前1节我们介绍了 shardingsphere 分表分库的sql解析与重写&#xff1a; shardingsphere分库分表项目实践4-sql解析&重写-CSDN博客 那么shardingsphere sql 解析底层究竟是怎么实现的呢&#xff0c;其实它直接用了著名的开源软件 antlr . antlr 介绍&#xff1a; ANTLR&a…

光谱相机与普通相机的区别

一、成像目的 普通相机&#xff1a;主要目的是记录物体的外观形态&#xff0c;生成人眼可见的、直观的二维图像&#xff0c;重点在于还原物体的形状、颜色和纹理等视觉特征&#xff0c;以供人们进行观赏、记录场景或人物等用途。例如&#xff0c;拍摄旅游风景照片、人物肖像等…