接入前端框架:Vue、React 与 Svelte
Tauri 的前端可以是任何能产出静态页面的技术:Vue、React、Svelte、Solid、甚至纯 HTML。核心原因是 WebView 只需要加载构建产物,框架本身无感知。本篇讲三个主流框架的接入要点、常见坑以及框架选择建议。
一、接入的本质:frontendDist
无论什么框架,接入方式都归结为两点:让构建产物输出到 Tauri 期望的目录,让开发服务器跑在 Tauri 期望的地址。在 tauri.conf.json 中:
{
"build": {
"frontendDist": "../dist",
"devUrl": "http://localhost:1420",
"beforeDevCommand": "npm run dev",
"beforeBuildCommand": "npm run build"
}
}
beforeDevCommand 与 beforeBuildCommand 让 Tauri 自动调起前端的构建或服务。不同框架只需改对应的端口与产物目录,其余完全一致。脚手架 create-tauri-app 已内置常见框架模板,新建项目时选择即可,不用手动改这些。
| 框架 | 默认端口 | 产物目录 |
|---|---|---|
| Vue (Vite) | 1420 | dist |
| React (Vite) | 1420 | dist |
| Svelte (Vite) | 1420 | dist |
| Vue CLI | 8080 | dist |
二、Vue 接入要点
Vue 加 Vite 的组合最省心。调用 Tauri API 的官方包是 @tauri-apps/api,建议在组合式函数里统一封装:
import { invoke } from '@tauri-apps/api/core'
export function useGreeting() {
const greet = async (name) => {
return await invoke('greet', { name })
}
return { greet }
}
Vue 项目里常见的问题是开发服务器与 tauri dev 的启动顺序。Tauri 会执行 beforeDevCommand 并等待 devUrl 可访问,因此 Vite 端口必须与配置一致。改端口时两边一起改,避免窗口打开后一直白屏。
三、React 与 Svelte 接入要点
React 模板默认使用 Vite,调用方式与 Vue 几乎相同。注意 invoke 返回的是 Promise,在组件里配合 useEffect 与状态钩子处理:
import { invoke } from '@tauri-apps/api/core'
import { useEffect, useState } from 'react'
function App() {
const [version, setVersion] = useState('')
useEffect(() => {
invoke('app_version').then(setVersion)
}, [])
return <p>当前版本:{version}</p>
}
Svelte 的接入同样简单,差异主要在前端生态和团队偏好。三个框架在 Tauri 中的待遇完全一致,不存在哪个框架「更支持」Tauri 的说法。更多框架接入的官方模板清单以 Tauri 文档为准。
四、框架选择的实际因素
选框架时,Tauri 维度可以往后排,重点看这些:
| 因素 | 说明 |
|---|---|
| 团队熟悉度 | 会什么用什么,迁移成本最低 |
| 生态需求 | 重度 UI 库依赖时优先 React 或 Vue |
| 包体积敏感 | Svelte 与 Solid 产物更小 |
| 渲染一致性 | 系统 WebView 兼容性需实测 |
唯一需要留意的框架级问题是:某些依赖 Node polyfill 的库(比如访问 Node API 的包)在 WebView 里无法直接运行,需要替换为浏览器兼容版本,想深入排查可以用 浏览器扩展指南 的调度思路参照,里面也讲了 WebView 环境的差异排查。命令系统的完整细节见「前端调用 Rust:invoke 与命令系统」。
五、框架无关的最佳实践
无论选哪个框架,建议遵守三条:第一,把所有 invoke 调用集中到一个模块,便于统一加类型与错误处理;第二,事件监听在组件卸载时取消订阅,避免重复注册;第三,开发时关掉框架的严格模式带来的双重副作用,或至少理解其对 invoke 的影响。
类型安全方面可以在 Rust 端用 ts_rs 或 specta 之类的库从结构体生成 TS 类型,保持两端类型一致,具体库的用法以各自文档为准。也可以用 Claude Code 指南 的方式让 AI 帮忙生成类型桥接代码,Rust 结构体侧的知识见 Rust 入门。
六、框架版本升级策略
前端框架升级节奏比 Tauri 快得多,混版是常见故障源。建议的策略是锁版本加定期升级:package.json 与 Cargo.toml 都锁到确切版本,每隔一个迭代窗口集中升级并跑回归测试。
| 依赖 | 锁定建议 | 升级频率 |
|---|---|---|
| 前端框架 | 主版本号 | 半年左右 |
| @tauri-apps/api | 与 tauri 主版本对齐 | 随 Tauri 升级 |
| Rust crates | 按 minor 锁定 | 需要新特性时 |
| 构建工具 | 跟随框架 LTS | 框架升级时 |
特别强调一遍:@tauri-apps/api 的大版本必须与 Rust 端 tauri crate 的主版本一致,跨大版本混用会出现 invoke 路径、事件 API、权限声明全部对不上的离奇错误。升级 Tauri 时按官方迁移指南一步步来,不要自己猜改法。
框架接入的最后一公里是测试与调试。推荐在 CI 里跑前端单元测试加 Rust 集成测试两层:前端测试照旧,Rust 端可以把命令逻辑抽成纯函数单独测试,不依赖 Tauri 运行时。这种「逻辑与框架解耦」的写法本身也让代码更健康。接入框架只是起点,真正决定应用质量的是后续通信、状态与错误处理三件套,它们都在本站的后续章节里。
最后提一个混合场景:老 Electron 项目想局部迁移到 Tauri。可行的路子是把 Electron 的渲染层整体搬到 Tauri,主进程逻辑先保留为本地 HTTP 服务,Tauri 通过 Rust 的 HTTP 客户端调用,逐步把接口改写为命令。这条路的好处是每步可灰度、风险可控;坏处是过渡期维护两套逻辑,需要明确的收敛计划。无论是否迁移,理解两种架构的差异都让你在技术选型时更有底气,这也是本篇与架构对比章节相互呼应的地方。
框架接入完成后建议立刻补两件事:一套任何人都能一键跑起的构建流程,和一个展示全部典型 IPC 调用的示例页。示例页放一个输入框、一个按钮、一个结果区,串起命令与事件两套调用,看起来朴素却是团队里最实用的活文档。下一章正式讲命令系统,把这个示例页每个调用背后的机制讲透。
关于框架选择最后补充一条容易被忽视的维度:招聘与人才流动。团队最熟悉的框架就是成本最低的框架,这在中小团队里几乎是铁律。框架本身没有优劣,只有适不适合当前阶段:验证想法用最熟的,打磨体验用生态最强的,追求性能用产物最小的。这条判断同样适用于「是否引入 Tauri」本身——技术选型的核心从来不是追随潮流,而是在约束条件下做最合理的交换。带着这个视角重读本系列的架构对比章节,你会有更完整的判断框架。
最后一句忠告给所有框架接入工作:脚手架生成的模板代码值得逐行读懂,它是框架与 Tauri 对接的最佳实践样本,包含了构建配置、API 引入、窗口加载的全部约定。读懂模板的人能少走几个月弯路,直接把社区的集体经验变成自己的起点,这一点对任何技术栈都是通用的。
延伸阅读
- 前端调用 Rust:invoke 与命令系统——框架接入后的第一步
- 事件系统:Rust 主动通知前端——订阅与取消订阅的完整写法
- Claude Code 指南:AI 辅助生成类型桥接代码
