Leptos + Tauri 2 前端配置Trunk + SSG + 移动端热重载一次打通(Leptos 0.6 口径)

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-syswindow 上取 __TAURI__
  • 再调用你需要的模块(例如 event、window、path、plugin 等)

如果你更偏工程化,也可以在前端用一层 thin wrapper:把需要的 Tauri 能力封装成少量 JS 函数,再让 WASM 调这些函数,边界更清晰、类型更可控。

6. 常见问题速查

  • 启动后白屏,但浏览器访问 http://localhost:1420 正常
    优先检查 tauri.conf.json 里的 devUrl 端口是否与 Trunk 一致,以及是否启动了 trunk serve(看终端输出)。
  • 热重载在移动端不工作
    先确认 Trunk.tomlws_protocol = "ws" 已设置。 (Tauri)
  • WASM 里拿不到 window.__TAURI__
    检查 app.withGlobalTauri 是否为 true,并确认你是在 Tauri 窗口里运行(不是纯浏览器环境)。 (Tauri)
相关推荐
kgduu6 分钟前
js之错误处理
开发语言·前端·javascript
德莱厄斯7 分钟前
Milkup 技术内幕:一个 Typora 风格的即时渲染 Markdown 编辑器是怎样炼成的
前端·javascript·markdown
Mintopia17 分钟前
架构师的心胸:把分歧装进系统,把人放在方案前
前端·架构
亿元程序员17 分钟前
不是说现在AI很牛吗,怎么连个高光Shader效果都写不好?
前端
孟祥_成都21 分钟前
金三银四,一个面试官连连夸赞的个人网页技术分享
前端·面试·three.js
兆子龙28 分钟前
Vite 插件系统与构建流水线源码解析:从 Rollup 插件到 HMR
前端
代码老中医33 分钟前
Node_modules 比黑洞还重,我们的硬盘到底做错了什么?
前端
兆子龙34 分钟前
Vue 3 响应式系统 Reactivity 源码深度解析:从 ref 到 effect 的完整链路
前端
Smoothcloud_润云37 分钟前
GORM 事务管理与 Repository 模式完整指南
前端·数据库·代码规范
兆子龙37 分钟前
Turborepo 与 Monorepo 任务调度源码解析:从 DAG 到增量构建
前端·架构