1. 三条 Checklist:每一条都对应一个真实的坑
1.1 用 SSG(别走 SSR)
Tauri 的工作方式更像"静态站点宿主":你给它一份静态资源目录(HTML/CSS/JS/WASM),它在 WebView 里加载并运行。官方明确:Tauri 不官方支持基于服务器的方案(SSR) ,因此要用 SSG/SPA/MPA 这类静态路线。 (Tauri)
这对 Leptos 意味着:在 Tauri 里通常跑的是 WASM 前端(客户端渲染),而不是把 Leptos 的服务端渲染端也一起塞进去。
1.2 serve.ws_protocol = "ws":移动端热重载的关键开关
在移动端开发时(Android/iOS 真机或模拟器),热重载 websocket 更容易因为协议/网络环境出现连接问题。官方建议在 Trunk 里显式设置:
ws_protocol = "ws"
确保热重载 websocket 能正常连上。 (Tauri)
1.3 开启 withGlobalTauri:让 window.__TAURI__ 可用,WASM 才好"抓"到 Tauri API
Leptos(WASM)要调用 Tauri API,最常见的桥接方式之一就是通过浏览器全局对象拿到 window.__TAURI__,再用 wasm-bindgen 或 JS interop 访问。官方要求在 Tauri 配置里打开:
app.withGlobalTauri = true
这样 window.__TAURI__ 才会被注入。 (Tauri)
2. 示例配置 1:src-tauri/tauri.conf.json(告诉 Tauri:怎么跑 Trunk、资源在哪)
把下面这段放到 src-tauri/tauri.conf.json(或合并进你的配置):
json
{
"build": {
"beforeDevCommand": "trunk serve",
"devUrl": "http://localhost:1420",
"beforeBuildCommand": "trunk build",
"frontendDist": "../dist"
},
"app": {
"withGlobalTauri": true
}
}
这段配置分别解决什么:
beforeDevCommand: trunk serve
你执行cargo tauri dev时,Tauri 会先帮你启动 Trunk 的开发服务器。devUrl: http://localhost:1420
Tauri 开发模式加载的页面地址就是这个(Trunk 默认端口常用 1420)。beforeBuildCommand: trunk build
你执行cargo tauri build时,先把 Leptos 编译成静态资源。frontendDist: ../dist
Trunk build 的输出目录(注意这是相对src-tauri/的路径,所以通常是../dist)。withGlobalTauri: true
注入window.__TAURI__,方便 WASM/vanilla JS 访问。 (Tauri)
3. 示例配置 2:Trunk.toml(Trunk 怎么 build、怎么 serve、怎么热重载)
在项目根目录创建/修改 Trunk.toml:
ini
[build]
target = "./index.html"
[watch]
ignore = ["./src-tauri"]
[serve]
port = 1420
open = false
ws_protocol = "ws"
这里的重点:
[build].target = "./index.html"
指定构建入口页面(Trunk 以它为入口组织资源与 wasm 输出)。[watch].ignore = ["./src-tauri"]
避免 Trunk 监听 Rust/Tauri 工程目录导致无意义的重编译或文件句柄压力(特别是 Windows/大型工程时会明显)。[serve].ws_protocol = "ws"
移动端热重载稳定性的关键项。 (Tauri)
4. 开发与构建:你实际只需要记住两条命令
开发(桌面):
cargo tauri dev
发布构建:
cargo tauri build
因为你已经在 tauri.conf.json 里配置了 beforeDevCommand/beforeBuildCommand,所以通常不需要你手动先跑 trunk serve/build。
5. WASM 侧怎么用 Tauri API(思路)
开启 withGlobalTauri 后,window.__TAURI__ 会存在。官方 JS API 文档也明确:使用全局对象需要这个开关。 (Tauri)
在 Leptos/WASM 里常见做法是:
- 用
wasm-bindgen/web-sys从window上取__TAURI__ - 再调用你需要的模块(例如 event、window、path、plugin 等)
如果你更偏工程化,也可以在前端用一层 thin wrapper:把需要的 Tauri 能力封装成少量 JS 函数,再让 WASM 调这些函数,边界更清晰、类型更可控。