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

Rust写一个wasm入门并在rspack和vite项目中使用(一)

rust打包wasm文档

文档地址

安装cargo-generate

cargo install cargo-generate
安装过程中有问题的话手动安装cargo-generate下载地址
根据自己的系统下载压缩包,然后解压到用户/.cargo/bind目录下,将解压后的文件放到该目录下即可。

创建wasm项目

执行cargo generate --git https://github.com/rustwasm/wasm-pack-template,然后输入项目名即可,然后可以看到本地创建了一个项目,目录如下:

wasm
├── Cargo.toml
├── LICENSE_APACHE
├── LICENSE_MIT
├── README.md
└── src├── lib.rs└── utils.rs

在这里插入图片描述
src/lib.rs是根文件,会被打包编译为wasm

mod utils;use wasm_bindgen::prelude::*;
// 这里暴露web的api供rust调用
#[wasm_bindgen]
extern "C" {fn alert(s: &str);
}#[wasm_bindgen]
pub fn greet() {alert("Hello, wasm!");
}

wasm-bindgen

wasm-bindgen能够让js和rust之间进行交互。
wasm-bindgen文档

下载依赖

cd进项目,然后执行cargo check安装依赖

打包wasm文件

wasm-pack build --target web
wasm-pack文档地址
在这里插入图片描述
这个命令做了以下几件事:
wasm-pack build 将做以下几件事:

  1. 将你的 Rust 代码编译成 WebAssembly。
  2. 在编译好的 WebAssembly 代码基础上运行 wasm-bindgen,生成一个 JavaScript 文件将 WebAssembly 文件包装成一个模块以便 npm 能够识别它。
  3. 创建一个 pkg 文件夹并将 JavaScript 文件和生成的 WebAssembly 代码移到其中。
  4. 读取你的 Cargo.toml 并生成相应的 package.json。
  5. 复制你的 README.md (如果有的话) 到文件夹中。

发布npm

cd pkg
npm publish --access=public
将我们的wasm包发布npm前端直接下载

前端引入wasm

创建项目

vite的项目pnpm create vite vite-wasm --template react-ts
webpack的项目这里我用的rspack,pnpm create rsbuild@latest
然后安装依赖即可

安装wasm依赖

将我们刚刚rust生成的pkg复制到项目中,然后执行pnpm i ./pkg
pnpm i ./pkg安装wasm的依赖

使用方式

1.在rspack项目中

import './App.css';
import wasm from 'wasm'const App = () => {wasm().then(wasm_fn => {wasm_fn.greet()})return (<div className="content">rspack-wasm</div>);
};export default App;

在这里插入图片描述

2.vite中使用,同上一样的使用方式,直接看结果
在这里插入图片描述

总结

  1. 我们先使用cargo generate创建wasm项目模版。
  2. 然后学习了如何使用wasm-pack打包,并介绍了wasm-bindgen,它提供rust和js交互的能力。
  3. 之后介绍了rspack和vite中如何引入使用我们的wasm。
http://www.lryc.cn/news/319636.html

相关文章:

  • HTTP和HTTPS的区别,HTTPS加密原理是?
  • 基于Spring Boot+Vue的校园二手交易平台
  • 什么是软件开发?软件开发阶段划分是什么?并以LabVIEW为例进行说明
  • PTAL1-006 连续因子
  • 【Java】容器|Set、List、Map及常用API
  • Navicat 面试题及答案整理,最新面试题
  • android studio 连接mumu模拟器调试
  • 四连通与八连通的区别 -- 图例讲解
  • 关于分布式微服务数据源加密配置以及取巧方案(含自定义加密配置)
  • 快速了解JavaScript
  • 【安全类书籍-3】XSS跨站脚剖析与防御
  • http postman
  • [数据集][目标检测]螺丝螺母检测数据集VOC+YOLO格式2100张13类别
  • 华为鲲鹏ARM处理器920、916系列
  • AG32VF407 应用开发问答1
  • 一站式解决方案:uni-app条件编译及多环境配置,appid动态修改攻略!
  • 从政府工作报告中的IT热词统计探计算机行业发展(二)人工智能+:3次
  • Selenium库原代码WebDriver及WebElement方法属性总结
  • C# 部署ICE框架以及用例(VS2019)
  • PostgreSQL 数据加密怎么弄,应该用哪种方案
  • 1.通过AD组策略如何做封禁高危端口的策略?AD域控如何给加域的电脑做指定端口号封禁呢?
  • 05.BOM对象
  • 【Golang星辰图】Go语言游戏开发:选择合适的库加速你的开发过程
  • 51单片机-AT24C02(I2C总线)
  • 面试经典-MySQL篇
  • C#控制台贪吃蛇
  • [小程序开发] 构造页面
  • 安装Android Studio遇到Unable to access Android SDK add-on list的错误
  • EXCEL+PYTHON学习3
  • Rabbit MQ详解