DEV Community

Cover image for 【04】Tauri 入门篇 - 集成 WebAssembly
lencx
lencx

Posted on

【04】Tauri 入门篇 - 集成 WebAssembly

仓库:lencx/OhMyBox
如果文章对你有所帮助,可以 star 此项目,或转发给更多有需要的人。大家的支持也会给我更大的写作动力,感恩。


安装依赖

vite-plugin-rsw - 基于 vite 实现的 webAssembly 插件,支持热更新,友好的报错提示

yarn add -D vite-plugin-rsw
Enter fullscreen mode Exit fullscreen mode

rsw-rs - 一个 CLI 工具,用于增强 wasm-pack 的功能,如支持 watch 模式,多 crate 同时 build,watch,自动执行 npm link

cargo install rsw
Enter fullscreen mode Exit fullscreen mode

使用说明

1. 编辑 vite.config.js

import { defineConfig } from 'vite'
import ViteRsw from 'vite-plugin-rsw'; // ✅ 新增

export default defineConfig({
  plugins: [
    ViteRsw(), // ✅ 新增
  ],
})
Enter fullscreen mode Exit fullscreen mode

2. 编辑 package.json

{
  "scripts": {
    "dev": "vite",
    "build": "rsw build && tsc && vite build",
    "preview": "vite preview",
    "tauri": "tauri",
    "rsw": "rsw"
  }
}
Enter fullscreen mode Exit fullscreen mode

3. 运行 rsw

1). 初始化 rsw 配置

生成 rsw.toml,了解更多 rsw.toml 配置信息

yarn rsw init
Enter fullscreen mode Exit fullscreen mode

rsw-init

2). 新建 wasm 项目

内置三种模式,可以通过编辑 rsw.toml > [new] > using 来切换

yarn rsw new @mywasm/foo
Enter fullscreen mode Exit fullscreen mode

rsw-new

rsw.toml > [[crates]] 中新增 @mywasm/foo

#! link 类型: `npm` | `yarn` | `pnpm`, 默认是 `npm`
cli = "npm"

[new]
#! 使用: `wasm-pack` | `rsw` | `user`, 默认 `wasm-pack`
#! 1. wasm-pack: `rsw new <name> --template <template> --mode <normal|noinstall|force>`
#! 2. rsw: `rsw new <name>`, 内置模板
#! 3. user: `rsw new <name>`,如果 `dir`未配置, 则使用 `wasm-pack new <name>`初始化 wasm 项目
using = "rsw"
#! 当 `using = "user"` 时,`dir` 才会生效
#! 如果 `using = "wasm-pack"` 或 `using = "rsw"`,则忽略
#! 复制此目录下的所有文件到初始化的 wasm 项目中
dir = "my-template"

[[crates]]
#! npm 包,@mywasm 为 npm 组织,foo 是该组织下的包名
name = "@mywasm/foo"
#! 是否执行 link, link 类型通过 `cli` 配置
link = true

[[crates]]
#! npm 包,@mywasm 为 npm 组织,bar 是该组织下的包名
name = "@mywasm/bar"
#! 是否执行 link, link 类型通过 `cli` 配置
link = true
Enter fullscreen mode Exit fullscreen mode

开发模式

监听 rust 文件变更,自动执行构建,并通知到浏览器(热更新)

  1. 执行以下命令,不要退出:

    yarn rsw watch
    
  2. 新开一个命令行窗口,执行 a 或 b:

    # a. 在浏览器环境
    yarn dev
    
    # b. 在 tauri 环境
    yarn tauri dev
    

004-rsw-watch

使用

在项目中使用 wasm

// App.jsx
import { useEffect } from 'react'
import init, { greet } from '@mywasm/foo'

function App() {
  useEffect(() => {
    // ✅  初始化,加载 wasm 文件
    init();
  }, [])

  return (
    <div className="App">
        {/* ✅ 调用 greet 方法,必须保证 init 方法执行完成之后,才可以调用,否则会报错 */}
        <button onClick={() => greet()}>click me</button>
    </div>
  )
}

export default App
Enter fullscreen mode Exit fullscreen mode

构建

编译生产环境下的 wasm 文件(代码优化)

  1. 构建 wasm

    yarn rsw build
    
  2. 构建项目

    yarn build
    

004-rsw-build

项目结构

rsw 对项目结构并无特别要求,但是为了保持统一及维护性,推荐以下结构。

  • @mywasm: wasm 包的组织名称(推荐使用,但非必需),rust 编译为 wasm,会以 npm 包的形式提供给前端使用。使用组织的好处就是方便管理,防止包名冲突
  • .rsw - rsw 运行时生成的临时文件夹
  • rsw.toml - rsw 配置文件
  • .watchignore - rsw watch 监听文件变更时需要忽略的文件,忽略规则与 .gitignore 类似
[tauri-app] # 项目名称# 新增结构
├─ [@mywasm] # ✅ 组织名称(npm org)
│    ├─ [foo] # ✅ @mywasm/foo - wasm 包名
│    └─ [bar] # ✅ @mywasm/bar - wasm 包名
├─ [.rsw] # ✅ rsw 临时文件夹
├─ rsw.toml # ✅ rsw 配置文件
├─ .watchignore # ✅ rsw watch 忽略文件
│┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
│ # 原结构
├─ [node_modules] # 前端依赖
├─ [src] # 前端程序源
├─ [src-tauri] # Tauri 程序源
│    ├─ [icons] # 应用程序图标
│    ├─ [src] # Tauri App 程序源,例如系统菜单,托盘,插件配置等
│    ├─ [target] # 构建的产物会被放入此文件夹中,target 目录的结构取决于是否使用 --target 标志为特定的平台构建
│    ├─ build.rs # Tauri 构建应用
│    ├─ Cargo.lock # 包含了依赖的精确描述信息,类似于 yarn.lock 或 package-lock.json
│    ├─ Cargo.toml # Tauri (Rust) 项目清单
│    └─ tauri.conf.json # 自定义 Tauri 应用程序的配置文件,例如应用程序窗口尺寸,应用名称,权限等
├─ index.html # 项目主界面
├─ package.json # 前端项目清单
├─ tsconfig.json # typescript 配置文件
├─ vite.config.ts # vite 配置文件
├─ yarn.lock # 前端依赖的精确描述信息
└─ ... # 其他
Enter fullscreen mode Exit fullscreen mode

Top comments (0)