Vue 3 用 Tauri 打包桌面应用:把 Web 工程装进原生窗口并调用系统能力

test12026-11-030 次阅读

为什么是 Tauri 而不是 Electron

Electron 把整个 Chromium 打进包里,体积动辄上百兆。Tauri 复用系统自带的 WebView,后端用 Rust 写,安装包往往只有几兆。前端可以照常用 Vue 3,需要访问文件、通知、系统托盘时,通过 Tauri 的命令机制调用 Rust,而不必引入 Node 运行时。

初始化一个 Tauri + Vue 工程

用官方脚手架先把 Vue 工程建起来,再追加 Tauri 集成。前端和桌面壳是两套配置,但开发时 Tauri 会启动一个 WebView 指向 Vite 的 dev server。

npm create vue@latest my-app
cd my-app
npm install
npm install -D @tauri-apps/cli
npx tauri init

配置 tauri.conf.json

这个文件决定窗口尺寸、标题,以及开发期前端跑在哪个地址。生产构建时 Tauri 会把 Vite 的产物打包进二进制。

{
  "build": {
    "devUrl": "http://localhost:5173",
    "frontendDist": "../dist",
    "beforeDevCommand": "npm run dev",
    "beforeBuildCommand": "npm run build"
  },
  "tauri": {
    "windows": [
      {
        "title": "我的工具箱",
        "width": 1000,
        "height": 700,
        "resizable": true
      }
    ],
    "bundle": {
      "identifier": "com.example.myapp",
      "targets": "all"
    }
  }
}

从 Vue 调用 Rust 命令

Rust 侧用 #[tauri::command] 标注一个函数,前端就能通过 invoke 调用它。参数和返回都会自动做 JSON 序列化。

// src-tauri/src/main.rs
#[tauri::command]
fn greet(name: String) -> String {
    format!("你好,{}!", name)
}

fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![greet])
        .run(tauri::generate_context!())
        .expect("启动失败");
}
// Vue 组件
import { invoke } from '@tauri-apps/api/core';

async function sayHi() {
  const msg = await invoke('greet', { name: '张三' });
  console.log(msg); // 你好,张三!
}

调用系统能力:读文件

文件、对话框、通知等走 Tauri 的 API 插件。下面用 @tauri-apps/plugin-fs 读取用户选中的文件内容,不经过前端任意路径访问,安全边界由 Rust 守住。

import { open } from '@tauri-apps/plugin-dialog';
import { readTextFile } from '@tauri-apps/plugin-fs';

async function pickAndRead() {
  const path = await open({ multiple: false });
  if (!path) return;
  const text = await readTextFile(path as string);
  console.log('文件内容长度:', text.length);
}

构建与体积对比

开发完用 build 命令产出平台安装包。一个只做本地笔记的 Vue 应用,Tauri 包通常在 5 到 10 兆,同等功能的 Electron 包往往超过 80 兆。

npx tauri build

小结

Tauri 让前端工程师用熟悉的 Vue 3 写界面,把系统级能力交给少量 Rust 代码。它适合工具类、内部系统、轻量桌面客户端这类对体积和启动速度敏感的场景。代价是要写一点 Rust,但命令接口很薄,上手成本比维护一整套 Electron 主进程逻辑低得多。

T

test1

文章作者

为什么是 Tauri 而不是 Electron Electron 把整个 Chromium 打进包里,体积动辄上百兆。...

分类
技术
发布时间
2026-11-03
字数
约 2056 字
阅读
0 次