本文详解如何使用Tauri 2.0构建WordPress桌面应用(跨平台,Windows/macOS/Linux)。

什么是Tauri

Tauri(2021年发布v1.0,2025年v2.0):

  • 使用Rust构建后端(轻量,安全)
  • 使用系统Webview(Windows: Edge WebView2; macOS: WKWebView; Linux: WebKitGTK)
  • 前端:任意框架(React/Vue/Svelte)
  • 打包体积:~5MB(Electron是~150MB)
  • 内存占用:~30MB(Electron是~120MB)

为什么用Tauri + WordPress

架构:

Tauri桌面应用 → WordPress REST API → WordPress后端

优势:

  • 原生桌面体验(系统托盘、菜单、快捷键)
  • 离线缓存(IndexedDB + Tauri Store)
  • 自动更新(Tauri Updater)
  • 极小的安装包(5MB vs Electron 150MB)

实战一:搭建Tauri 2.0项目

环境准备

# Windows: 安装WebView2(系统自带Windows 11)

macOS: 自带WKWebView

Linux: 安装WebKitGTK

Ubuntu/Debian:

sudo apt update

sudo apt install libwebkit2gtk-4.1-dev

安装Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

创建前端(Next.js)

# 创建Next.js项目

npx create-next-app@latest wp-desktop --typescript --tailwind

cd wp-desktop

构建静态导出(Tauri需要file://协议)

npm run build

输出:out/ 目录

初始化Tauri

# 安装Tauri CLI

cargo install tauri-cli

初始化Tauri(在Next.js项目中)

npm install @tauri-apps/cli @tauri-apps/api

npx tauri init

配置:

- 前端路径:../out

- 开发服务器:http://localhost:3000

- 产品名:WordPress Desktop

实战二:连接WordPress REST API

Tauri后端(Rust)代理API请求

// src/main.rs

use tauri::Manager;

use reqwest::header;

#[tauri::command]

async fn get_posts() -> Result {

let client = reqwest::Client::new();

let wp_url = "https://www.shenma98.com/wp-json/wp/v2/posts";

let response = client

.get(wp_url)

.header(header::AUTHORIZATION, "Basic ...") // 使用应用密码

.send()

.await

.map_err(|e| e.to_string())?;

let body = response.text().await.map_err(|e| e.to_string())?;

Ok(body)

}

#[tauri::command]

async fn get_post(id: i32) -> Result {

let client = reqwest::Client::new();

let wp_url = format!("https://www.shenma98.com/wp-json/wp/v2/posts/{}", id);

let response = client

.get(&wp_url)

.send()

.await

.map_err(|e| e.to_string())?;

let body = response.text().await.map_err(|e| e.to_string())?;

Ok(body)

}

fn main() {

tauri::Builder::default()

.invoke_handler(tauri::generate_handler![get_posts, get_post])

.run(tauri::generate_context!())

.expect("error while running tauri application");

}

前端调用Tauri命令

// app/api/wordpress.ts

import { invoke } from '@tauri-apps/api/core';

export async function getPosts() {

const response = await invoke('get_posts');

return JSON.parse(response as string);

}

export async function getPost(id: number) {

const response = await invoke('get_post', { id });

return JSON.parse(response as string);

}

// app/posts/page.tsx

'use client';

import { useEffect, useState } from 'react';

import { getPosts } from '@/api/wordpress';

export default function PostsPage() {

const [posts, setPosts] = useState([]);

useEffect(() => {

getPosts().then(setPosts);

}, []);

return (

WordPress文章

);

}

实战三:添加桌面特性

系统托盘(System Tray)

// src/main.rs

use tauri::{CustomMenuItem, SystemTray, SystemTrayMenu, SystemTrayEvent};

fn main() {

let tray_menu = SystemTrayMenu::new()

.add_item(CustomMenuItem::new("open", "打开主窗口"))

.add_item(CustomMenuItem::new("quit", "退出"));

tauri::Builder::default()

.system_tray(SystemTray::new().with_menu(tray_menu))

.on_system_tray_event(|app, event| match event {

SystemTrayEvent::MenuItemClick { id, .. } => {

match id.as_str() {

"open" => {

let window = app.get_window("main").unwrap();

window.show().unwrap();

}

"quit" => {

std::process::exit(0);

}

_ => {}

}

}

_ => {}

})

.run(tauri::generate_context!())

.expect("error while running tauri application");

}

全局快捷键

// src/main.rs

use tauri::GlobalShortcutManager;

fn main() {

tauri::Builder::default()

.setup(|app| {

let shortcut_manager = app.global_shortcut_manager();

// 注册快捷键:Ctrl+Shift+P(打开快速搜索)

shortcut_manager

.register("CmdOrCtrl+Shift+P", || {

println!("Quick search opened!");

// 打开快速搜索窗口

})

.unwrap();

Ok(())

})

.run(tauri::generate_context!())

.expect("error while running tauri application");

}

离线缓存(IndexedDB + Tauri Store)

// app/utils/cache.ts

import { Store } from '@tauri-apps/plugin-store';

const store = new Store('cache.json');

export async function getCachedPosts() {

return await store.get('posts');

}

export async function cachePosts(posts: any[]) {

await store.set('posts', posts);

await store.save();

}

实战四:自动更新(Tauri Updater)

配置Updater

// tauri.conf.json

{

"tauri": {

"updater": {

"active": true,

"endpoints": [

"https://www.shenma98.com/releases/latest.json"

],

"dialog": true,

"pubkey": "YOUR_PUBLIC_KEY"

}

}

}

生成密钥对

# 安装Tauri Updater CLI

cargo install tauri-updater

生成密钥对

tauri-updater keypair

输出:

Public key: YOUR_PUBLIC_KEY

Secret key: YOUR_PRIVATE_KEY (保密!)

发布更新

// https://www.shenma98.com/releases/latest.json

{

"version": "0.2.0",

"notes": "新增离线缓存功能",

"pub_date": "2026-05-21T00:00:00Z",

"platforms": {

"windows-x86_64": {

"signature": "SIGNATURE_HERE",

"url": "https://www.shenma98.com/releases/wp-desktop_0.2.0_x64_en-US.msi"

},

"darwin-x86_64": {

"signature": "SIGNATURE_HERE",

"url": "https://www.shenma98.com/releases/wp-desktop_0.2.0_x64.dmg"

}

}

}

构建与打包

开发模式

# 启动前端开发服务器

npm run dev

启动Tauri开发模式(另一个终端)

npx tauri dev

生产构建

# 1. 构建前端(静态导出)

npm run build

输出:out/ 目录

2. 构建Tauri应用

npx tauri build

输出:

- Windows: src-tauri/target/release/bundle/msi/wp-desktop_0.1.0_x64_en-US.msi

- macOS: src-tauri/target/release/bundle/dmg/wp-desktop_0.1.0_x64.dmg

- Linux: src-tauri/target/release/bundle/deb/wp-desktop_0.1.0_amd64.deb

性能对比(Tauri vs Electron)

| 指标 | Tauri 2.0 | Electron 28 | 优势 |

|------|-------------|--------------|------|

| 打包体积 | ~5MB | ~150MB | 30x 小 |

| 内存占用(空闲) | ~30MB | ~120MB | 4x 低 |

| 启动时间 | ~0.3s | ~1.2s | 4x 快 |

| 安全性 | ⭐⭐⭐⭐⭐ (Rust) | ⭐⭐⭐ (Node.js) | Rust更安全 |

决策建议

| 场景 | 是否使用Tauri | 理由 |

|------|----------------|------|

| WordPress桌面客户端 | ✅ 强烈推荐 | 体积小,体验好 |

| 内部工具(企业) | ✅ 推荐 | 安全,跨平台 |

| 简单工具(单功能) | ✅ 推荐 | 打包小,分发易 |

| 复杂应用(VS Code类) | ⚠️ 考虑Electron | 生态更成熟 |

总结

Tauri 2.0是2026年最值得关注的桌面应用框架。结合WordPress REST API,可以快速构建轻量级桌面客户端。

立即行动:用Tauri创建一个WordPress桌面客户端原型!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。