Tauri是什么?

一、Tauri 核心定位(先明确它是什么/不是什么)

Tauri 是由 Rust 驱动、安全优先、轻量级的跨平台桌面应用框架,核心目标是让开发者用「纯Web技术栈(HTML/CSS/JS/TS)」开发 Windows/macOS/Linux 原生桌面应用,同时解决传统Web跨平台方案(如Electron)体积大、性能差、安全性低的问题。

你的场景来说,Tauri的核心价值是:

  • 完全复用你的Next.js/Nuxt.js/SvelteKit代码,无需重构前端;
  • 打包后的Windows/macOS应用体积仅3-10MB(Electron通常50MB+);
  • 前端运行在系统原生WebView(Windows用WebView2、macOS用WebKit),内存占用比Electron低60%以上;
  • 无需深入学Rust,基础功能开箱即用,仅需少量配置。

二、Tauri 核心架构(看懂它的工作原理)

Tauri的架构分为三层,各层解耦且职责清晰,这也是它能兼容任意Web栈的核心原因:

graph TD
    A[前端层(Web)] --> B[Tauri核心层(Rust)]
    B --> C[原生系统层(Windows/macOS)]

    subgraph 前端层
    A1[HTML/CSS/JS/TS]
    A2[任意Web框架:Next.js/Nuxt.js/SvelteKit/React/Vue]
    A3[Tauri前端API:@tauri-apps/api]
    end

    subgraph Tauri核心层
    B1[IPC通信(安全通道)]
    B2[权限管理(沙箱)]
    B3[窗口管理/系统托盘/自动更新等核心模块]
    B4[Rust原生能力封装]
    end

    subgraph 原生系统层
    C1[Windows:Win32 API/WebView2]
    C2[macOS:AppKit/WebKit]
    end

各层详解:

  1. 前端层:就是你熟悉的Web项目(Next.js/Nuxt.js等),唯一的区别是:

    • 开发时:Tauri会代理你的Web开发服务器(如Next.js的3000端口),实现热重载;
    • 打包后:Tauri加载你Web项目构建后的静态文件(如Next.js的out目录、Nuxt.js的dist目录)。
    • 你无需修改任何前端业务逻辑,仅需通过@tauri-apps/api调用桌面端原生功能(如文件读写)。
  2. Tauri核心层(Rust):这是Tauri的“大脑”,但你无需深入掌握Rust:

    • IPC通信:前端和Rust的唯一安全通道,所有原生功能调用必须通过预定义的Command(显式声明),杜绝前端随意访问系统资源;
    • 权限管理:默认沙箱隔离,比如你可以限制前端只能读写Documents目录,无法访问系统盘;
    • 原生能力封装:Tauri已封装好Windows/macOS的窗口、托盘、文件系统等核心功能,你只需调用API,无需自己写Rust。
  3. 原生系统层:Tauri直接调用Windows/macOS的原生API,比如:

    • Windows:用WebView2渲染前端(Edge内核,系统预装或自动打包),调用Win32 API实现窗口管理;
    • macOS:用WebKit渲染前端(Safari内核,系统自带),调用AppKit实现程序坞、菜单栏等特性。

三、Tauri 完整开发流程(Windows+macOS通用)

以你熟悉的「Next.js + Tauri」为例,一步步讲透从环境搭建到打包的全流程,其他Web框架(Nuxt.js/SvelteKit)流程完全一致,仅需修改产物目录配置。

步骤1:安装基础环境(Windows/macOS差异标注)

Tauri依赖「Rust环境」+「系统依赖」,安装流程如下:

1.1 安装Rust(跨平台通用)

1. Windows(用PowerShell,以管理员身份运行)
winget install Rustlang.Rustup
1. 安装后执行,配置Rust环境
rustup default stable

1. macOS(用终端)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
1. 配置环境变量(生效终端)
source $HOME/.cargo/env

1.2 安装系统依赖

系统依赖项安装命令
WindowsWebView2 + C++构建工具1. 安装Visual Studio 2022(勾选“桌面开发C++”);2. WebView2会自动安装
macOSXcode命令行工具xcode-select –install(终端执行,按提示安装)

1.3 安装Tauri CLI(开发工具)

1. npm(推荐,和你的Web栈包管理一致)
npm install -g @tauri-apps/cli
1. 验证安装
tauri --version

步骤2:创建项目(复用你的Web项目)

有两种方式,推荐「先有Web项目,再接入Tauri」(贴合你已有Next.js/Nuxt.js的场景):

方式1:给已有Web项目添加Tauri(推荐)

假设你已有一个Next.js项目(目录名my-next-app):

1. 进入你的Web项目根目录
cd my-next-app
1. 初始化Tauri(会自动创建src-tauri目录,包含Rust配置)
npx tauri init

执行tauri init时会弹出交互提问,按你的需求回答(关键配置如下):

? What is your app name? → 你的应用名(如MyApp)
? What should the window title be? → 窗口标题(如My App)
? Where are your web assets (HTML/CSS/JS) located, relative to the "<current dir>/src-tauri/tauri.conf.json" file? → 填../out(Next.js静态导出目录)
? What is the URL of your dev server? → 填http://localhost:3000(Next.js开发服务器地址)
? What is your frontend dev command? → 填npm run dev(启动Next.js的命令)
? What is your frontend build command? → 填npm run build(构建Next.js的命令)

方式2:从零创建Tauri+Web项目(新手)

1. 创建空目录
mkdir tauri-app && cd tauri-app
1. 初始化Tauri(会自动创建基础Web模板)
npx create-tauri-app

步骤3:核心配置(tauri.conf.json)

Tauri的所有核心配置都在src-tauri/tauri.conf.json,重点关注和你相关的配置(Windows+macOS):

{
  "build": {
    "distDir": "../out", // 你的Web项目构建后目录(Next.js是out,Nuxt.js是dist)
    "devPath": "http://localhost:3000", // 开发时的Web服务器地址
    "beforeDevCommand": "npm run dev", // 启动Tauri dev前先启动Web开发服务器
    "beforeBuildCommand": "npm run build" // 打包Tauri前先构建Web项目
  },
  "package": {
    "productName": "MyApp", // 应用名(macOS程序坞/Windows开始菜单显示)
    "version": "0.1.0" // 版本号
  },
  "tauri": {
    "allowlist": { // 权限白名单:只开启你需要的功能,默认关闭所有,安全优先
      "all": false, // 禁止所有权限
      "window": { "all": true }, // 允许窗口操作
      "fs": { // 允许文件系统访问
        "all": false,
        "readFile": true,
        "writeFile": true,
        "readDir": true,
        "allowedPaths": ["$HOME", "$DOCUMENTS"] // 仅允许访问用户目录/文档目录
      },
      "shell": { "all": false } // 禁止执行系统命令(安全)
    },
    "windows": [ // 窗口配置(支持多窗口)
      {
        "title": "My App",
        "width": 1200, // 窗口宽度
        "height": 800, // 窗口高度
        "resizable": true, // 是否可调整大小
        "fullscreen": false, // 是否全屏
        "titleBarStyle": "overlay", // macOS:沉浸式标题栏;Windows:原生标题栏
        "decorations": true // 是否显示窗口边框/标题栏
      }
    ],
    "bundle": { // 打包配置(Windows/macOS)
      "active": true,
      "targets": "all", // 打包所有平台(本地开发时只打当前系统包)
      "identifier": "com.yourname.myapp", // macOS必须,格式:反向域名
      "icon": [ // 应用图标(支持png/ico/icns)
        "icons/32x32.png",
        "icons/128x128.png",
        "icons/128x128@2x.png",
        "icons/icon.icns", // macOS图标
        "icons/icon.ico" // Windows图标
      ],
      "windows": { // Windows打包配置
        "certificateThumbprint": null, // 可选:代码签名证书
        "digestAlgorithm": "sha256",
        "timestampUrl": ""
      },
      "macOS": { // macOS打包配置
        "entitlements": null,
        "exceptionDomain": "",
        "frameworks": [],
        "minimumSystemVersion": "10.13" // 最低支持的macOS版本
      }
    }
  }
}

步骤4:开发与调试(热重载)

1. 进入你的Web项目根目录
cd my-next-app
1. 启动开发模式(自动启动Next.js开发服务器 + Tauri应用,支持热重载)
npm run tauri dev

此时会弹出Tauri窗口,加载你的Next.js页面,修改前端代码后窗口会自动刷新,和Web开发体验完全一致。

步骤5:调用原生功能(示例:文件读写)

Tauri的原生功能需通过「前端API + Rust Command」实现(安全优先),但基础功能无需手写Rust:

5.1 前端调用(Next.js组件中)

先安装前端API包:

npm install @tauri-apps/api

在Next.js组件中调用文件读写:

// pages/index.tsx
import { useState } from 'react';
import { writeTextFile, readTextFile, BaseDirectory } from '@tauri-apps/api/fs';

export default function Home() {
  const [content, setContent] = useState('');

  // 写入文件到用户文档目录
  const writeFile = async () => {
    await writeTextFile(
      'test.txt', // 文件名
      'Hello Tauri! 来自Next.js', // 内容
      { dir: BaseDirectory.Documents } // 目录(仅允许tauri.conf.json中配置的路径)
    );
    alert('文件写入成功!');
  };

  // 读取文件
  const readFile = async () => {
    const res = await readTextFile('test.txt', { dir: BaseDirectory.Documents });
    setContent(res);
  };

  return (
    <div style={{ padding: 20 }}>
      <button onClick={writeFile} style={{ padding: 10 }}>写入文件</button>
      <button onClick={readFile} style={{ padding: 10, marginLeft: 10 }}>读取文件</button>
      <div style={{ marginTop: 20 }}>文件内容:{content}</div>
    </div>
  );
}

5.2 自定义Rust Command(进阶,可选)

如果需要实现复杂原生功能(如调用系统API),只需在src-tauri/src/main.rs中定义Command:

// src-tauri/src/main.rs
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // Windows隐藏控制台窗口

use tauri::{Command};

// 自定义Command:获取系统信息
#[tauri::command]
fn get_system_info() -> String {
  #[cfg(target_os = "windows")]
  let os = "Windows".to_string();
  #[cfg(target_os = "macos")]
  let os = "macOS".to_string();
  format!("当前系统:{}", os)
}

fn main() {
  tauri::Builder::default()
    .invoke_handler(tauri::generate_handler![get_system_info]) // 注册Command
    .run(tauri::generate_context!())
    .expect("error while running tauri application");
}

前端调用这个自定义Command:

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

const getSysInfo = async () => {
  const res = await invoke('get_system_info');
  alert(res); // Windows显示“当前系统:Windows”,macOS显示“当前系统:macOS”
};

步骤6:打包成原生应用

1. 进入Web项目根目录
npm run tauri build

打包完成后,产物会出现在src-tauri/target/release/bundle

  • Windows:生成.exe安装包(或绿色版),路径src-tauri/target/release/bundle/msi/
  • macOS:生成.app应用包和.dmg安装包,路径src-tauri/target/release/bundle/dmg/

四、Tauri 核心功能(桌面端必备)

针对Windows+macOS场景,Tauri提供了桌面应用所需的所有核心功能,且调用方式简单:

功能用途前端API示例(关键代码)
窗口管理新建/关闭/最小化/最大化/调整大小import { Window } from '@tauri-apps/api/window'; const win = new Window('new-win', { url: '/new' }); win.show();
系统托盘Windows托盘/ macOS菜单栏图标import { Tray } from '@tauri-apps/api/tray'; const tray = new Tray('icons/tray.png'); tray.setTooltip('My App');
文件系统读写文件/目录见步骤5.1的writeTextFile/readTextFile
剪贴板复制/粘贴import { writeText, readText } from '@tauri-apps/api/clipboard'; await writeText('Hello');
自动更新应用版本更新(支持Windows/macOS)需配置tauri.conf.jsonupdater,配合Tauri Update Server使用
深度链接外部链接唤起应用(如myapp://open)配置tauri.conf.jsondeepLink,监听tauri://deep-link事件
通知Windows通知/ macOS通知中心import { Notification } from '@tauri-apps/api/notification'; new Notification({ title: '提示', body: '操作成功' }).show();

五、Tauri vs Electron(针对你的场景对比)

维度TauriElectron对你的价值
包体积3-10MB(Windows/macOS)50-100MB用户下载/安装更快,尤其适合工具类应用
内存占用低(比Electron少60%+)高(Chromium内核+Node.js)应用运行更流畅,尤其macOS对内存敏感
开发体验与Web一致,热重载流畅与Web一致,但启动稍慢对你来说无差异,都能复用Web代码
生态成熟度较成熟(基础功能全覆盖)极成熟(插件多)你的场景(Windows+macOS基础桌面功能)完全够用,小众需求可查Tauri官方文档
安全性沙箱隔离+显式权限+Rust内存安全Node.js权限过高,易有安全漏洞若应用涉及用户数据,Tauri更安全
系统适配原生WebView,贴合系统UIChromium内核,UI与系统有差异macOS下Tauri应用更像原生App,Windows下WebView2体验和Chrome一致
Rust依赖需安装Rust环境(无需深入学)无需额外环境仅需10分钟安装Rust,后续无需手写Rust代码

六、适配你的Web栈(Next.js/Nuxt.js/SvelteKit)

你已有的Web项目接入Tauri的核心是「配置静态导出+指定产物目录」,不同框架的关键配置如下:

Web框架静态导出配置Tauri distDir配置开发服务器地址
Next.jsnext.config.js中加output: 'export'../outhttp://localhost:3000
Nuxt.jsnuxt.config.ts中加ssr: false+nitro: { preset: 'static' }../.output/publichttp://localhost:3000
SvelteKitsvelte.config.js中加kit: { adapter: adapter-static() }../buildhttp://localhost:5173

关键注意点

  • Next.js/Nuxt.js若开启SSR,需先改为静态导出(因为Tauri加载的是静态文件,无法运行服务端代码);
  • 所有框架的路由需改为「哈希路由」(如/#/about),避免Tauri加载静态文件时路由404:
    • Next.js:next.config.js中加basePath: '/', assetPrefix: './'
    • Nuxt.js:nuxt.config.ts中加app: { baseURL: '/', router: { options: { hashMode: true } } }
    • SvelteKit:svelte.config.js中加kit: { paths: { base: '/' }, router: { mode: 'hash' } }

七、避坑指南(新手常见问题)

  1. Windows打包提示WebView2缺失:Tauri会自动打包WebView2运行时,无需担心,用户安装时会自动安装;
  2. macOS打包提示签名错误:需在tauri.conf.json中配置bundle.identifier(反向域名),或用tauri build --unsigned跳过签名(仅测试用);
  3. 前端路由404:按第六部分配置哈希路由即可解决;
  4. 文件读写权限报错:检查tauri.conf.jsonallowlist.fs.allowedPaths是否包含目标目录;
  5. macOS窗口标题栏样式异常:调整tauri.conf.jsonwindows[0].titleBarStylenativeoverlay

总结

  1. Tauri核心价值:Web栈无缝复用+轻量高性能+安全优先,完全适配你Windows+macOS的桌面端开发场景,且无需重构已有Next.js/Nuxt.js/SvelteKit代码;
  2. 开发关键:只需配置tauri.conf.jsondistDir(指向Web产物目录),前端通过@tauri-apps/api调用原生功能,基础场景无需手写Rust;
  3. 落地建议:先复用你的Web项目接入Tauri,实现基础功能(窗口+文件读写),再逐步扩展系统托盘、自动更新等进阶功能,开发体验和Web一致,学习成本极低。
暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇