在桌面应用开发中,Electron 虽成熟易用,但打包体积大、内存占用高的问题一直困扰着开发者。Tauri 作为轻量替代方案,凭借 Rust 底层的优势,能实现更小的打包体积和更低的资源占用,因此我将现有前端项目迁移至 Tauri,过程中踩了一些坑,也积累了完整的实操经验,特此整理成博客,供有类似需求的开发者参考。
本文将详细记录项目从基础配置、依赖安装,到配置修改、前端构建的全流程,同时梳理迁移过程中遇到的问题及解决方案,确保每一步都可复制、可落地,帮助大家快速完成 Tauri 项目改造。
一、迁移背景与目标
原有项目为前端可视化工具(基于 Vue/TypeScript + Vite),需打包为桌面应用,核心需求:
- 降低打包体积(Electron 打包后通常100MB+,目标控制在10MB以内)
- 减少内存占用,提升应用运行流畅度
- 保留前端原有业务逻辑,最小化改造成本
- 支持基础的桌面端能力(窗口管理、文件操作、HTTP请求、弹窗交互)
二、迁移全流程实操(可直接复制执行)
2.1 环境准备
迁移前需准备好基础环境,确保 Rust 和 Tauri 工具链正常运行,步骤如下:
- 安装 Rust 工具链:访问 Rust 官方安装包,按提示完成安装,安装完成后验证:
rustc --version # 查看 Rust 版本 ``cargo --version # 查看 Cargo 版本(本文使用 1.95.0) - 配置 Rust 环境变量:Windows 系统需将 Cargo 路径添加到系统 PATH,每次启动终端可执行(后续可配置永久环境变量):
$env:Path = "$env:USERPROFILE.cargo\bin;$env:Path"
2.2 依赖安装
进入前端项目根目录,安装 Tauri 核心依赖和所需插件,使用 pnpm 执行(npm/yarn 可替换对应命令):
# 安装 Tauri 核心依赖
pnpm add @tauri-apps/api@^2
pnpm add @tauri-apps/cli@^2 --save-dev
# 安装 Tauri 常用插件(根据项目需求选择)
pnpm add @tauri-apps/plugin-http
pnpm add @tauri-apps/plugin-dialog
pnpm add @tauri-apps/plugin-fs
插件说明:http 用于发起网络请求,dialog 用于桌面弹窗,fs 用于文件系统操作,满足基础桌面应用需求。
2.3 核心配置文件修改
Tauri 迁移的核心是修改5个关键配置文件,以下是完整可复制的配置内容,对应项目实际路径,可直接替换后微调。
1. vite.config.ts(项目根目录)
主要配置 Tauri 开发服务器、HMR 热更新,确保前端开发时能正常联动 Tauri 底层:
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import { tauri } from '@tauri-apps/vite-plugin'
// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
const env = loadEnv(mode, process.cwd(), '')
return {
plugins: [
vue(),
tauri({
// Tauri 开发服务器配置
devServer: {
port: 1420, // 自定义端口,避免冲突
strictPort: true, // 严格使用指定端口,冲突时报错
hmr: true // 启用热模块替换,提升开发效率
}
})
],
envPrefix: ['VITE_', 'TAURI_'], // 环境变量前缀,避免冲突
clearScreen: false, // 关闭 Vite 清屏,便于查看 Tauri 日志
server: {
port: 3000,
open: true,
cors: true
}
}
})
2. tauri.conf.json(src-tauri 目录)
Tauri 核心配置文件,定义应用信息、窗口配置、安全策略、API 代理等:
{
"$schema": "../node_modules/@tauri-apps/cli/schema.json",
"build": {
"beforeBuildCommand": "pnpm run build",
"beforeDevCommand": "pnpm run dev",
"devPath": "http://localhost:3000",
"distDir": "../dist"
},
"package": {
"productName": "Site Manager",
"version": "1.0.0"
},
"tauri": {
"allowlist": {
"all": false,
"window": {
"all": true
}
},
"bundle": {
"active": true,
"targets": "all",
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
]
},
"security": {
"csp": "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;"
},
"windows": [
{
"title": "Site Manager",
"width": 1400,
"height": 900,
"minWidth": 1200,
"minHeight": 800,
"resizable": true,
"fullscreen": false
}
],
"plugins": {
"http": {
"allowlist": {
"all": true,
"request": true,
"scope": ["https://*"]
},
"proxy": {
"enable": true,
"rules": [
{
"match": "https://api.example.com/*",
"target": "https://api.example.com/*"
}
]
}
}
}
}
}
3. Cargo.toml(src-tauri 目录)
Rust 项目配置文件,管理 Tauri 依赖和插件,确保 Rust 能正常编译:
[package]
name = "site-manager"
version = "1.0.0"
description = "A Tauri-based site management tool"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
tauri = { version = "2.0", features = ["api-all", "devtools"] }
tauri-plugin-log = "2.0"
tauri-plugin-http = "2.0"
tauri-plugin-dialog = "2.0"
tauri-plugin-fs = "2.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
[build-dependencies]
tauri-build = "2.0"
[features]
# by default Tauri runs in production mode
# when `tauri dev` runs it is in development mode
# when `tauri build` runs it is in production mode
# you can override the default with `cargo run --features tauri/dev`
default = ["tauri/production"]
4. capabilities/default.json(src-tauri/capabilities 目录)
Tauri 权限配置文件,控制前端可访问的桌面端能力,遵循“最小权限”原则:
{
"$schema": "../../node_modules/@tauri-apps/cli/schema-capabilities.json",
"identifier": "site-manager:default",
"description": "Default capabilities for the site manager app",
"windows": [
{
"allowlist": {
"create": true,
"center": true,
"requestUserAttention": true,
"setSize": true,
"setMinSize": true,
"setMaxSize": true,
"setPosition": true,
"setTitle": true,
"minimize": true,
"maximize": true,
"unmaximize": true,
"close": true,
"show": true,
"hide": true,
"isVisible": true,
"isMaximized": true,
"isMinimized": true,
"setResizable": true,
"setFullscreen": true,
"isFullscreen": true,
"setSkipTaskbar": true,
"isSkipTaskbar": true,
"setAlwaysOnTop": true,
"isAlwaysOnTop": true,
"setDecorations": true,
"isDecorated": true,
"setOpacity": true,
"getOpacity": true,
"setCursorGrab": true,
"isCursorGrabbed": true,
"setCursorVisible": true,
"isCursorVisible": true,
"setCursorPosition": true,
"getCursorPosition": true,
"startDragging": true,
"print": true,
"capturePage": true,
"setFocus": true,
"isFocused": true,
"setIcon": true,
"setProgressBar": true,
"setOverlayIcon": true,
"flashFrame": true,
"setMenu": true,
"getMenu": true,
"showMenu": true,
"hideMenu": true,
"isMenuVisible": true,
"setTitleBarStyle": true,
"getTitleBarStyle": true,
"invalidate": true
}
}
],
"http": {
"allowlist": {
"request": true,
"fetch": true,
"setConfig": true,
"getConfig": true,
"clearCache": true,
"proxy": {
"enable": true,
"add": true,
"remove": true,
"list": true,
"clear": true
}
},
"scope": ["https://*"]
},
"fs": {
"allowlist": {
"readFile": true,
"writeFile": true,
"appendFile": true,
"createDir": true,
"readDir": true,
"removeDir": true,
"removeFile": true,
"renameFile": true,
"copyFile": true,
"exists": true,
"metadata": true,
"watch": true,
"unwatch": true,
"unwatchAll": true,
"readTextFile": true,
"writeTextFile": true,
"appendTextFile": true
},
"scope": ["$HOME/*", "$APP/*", "$TEMP/*"]
},
"dialog": {
"allowlist": {
"open": true,
"save": true,
"message": true,
"confirm": true,
"prompt": true
}
}
}
5. src/lib.rs(src-tauri/src 目录)
Rust 入口文件,初始化 Tauri 应用和所需插件,无需修改核心逻辑,直接复制即可:
// 导入 Tauri 核心依赖和插件
use tauri::Manager;
use tauri_plugin_log::{LogTarget, LoggerBuilder};
// 初始化 Tauri 应用
#[tauri::command]
fn my_custom_command() {}
// 应用入口
fn main() {
// 构建日志系统
let logger = LoggerBuilder::new()
.targets([
LogTarget::LogDir,
LogTarget::Stdout,
LogTarget::Webview,
])
.build();
// 初始化 Tauri 应用并注册插件
tauri::Builder::default()
.plugin(logger)
.plugin(tauri_plugin_http::init())
.plugin(tauri_plugin_dialog::init())
.plugin(tauri_plugin_fs::init())
.invoke_handler(tauri::generate_handler![my_custom_command])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
6. package.json(项目根目录)
添加 Tauri 开发和构建脚本,方便快速启动和打包:
{
"scripts": {
"dev": "vite",
"build": "vue-tsc && vite build",
"preview": "vite preview",
"tauri": "tauri",
"tauri:dev": "tauri dev",
"tauri:build": "tauri build"
}
}
2.4 前端构建与运行
配置完成后,即可启动开发模式和构建生产包,步骤如下:
-
开发模式:启动前端和 Tauri 开发服务器,实时调试:
# 先设置 PATH(首次启动需执行,后续可配置永久环境变量) `` $env:Path = "$env:USERPROFILE.cargo\bin;$env:Path" ```` # 启动开发模式 ``pnpm run tauri:dev启动成功后,会自动打开 Tauri 窗口,前端修改后会实时热更新,联动 Rust 底层。 -
生产构建:打包桌面应用(支持 EXE、MSI 等格式):
# 设置 PATH `` $env:Path = "$env:USERPROFILE.cargo\bin;$env:Path" ```` # 执行构建 ``pnpm run tauri:build构建完成后,产物位置:- 可执行文件:src-tauri/target/release/
- 安装包:src-tauri/target/release/bundle/
三、迁移过程中遇到的问题及解决方案
3.1 常见警告处理
迁移初期遇到 Rust 编译警告,主要是无用导入导致,解决方案如下:
警告信息:warning: unused import: tauri::Manager
解决方法:打开 src-tauri/src/lib.rs,删除未使用的导入语句 use tauri::Manager;(若后续需要使用窗口管理等能力,可保留)。
3.2 Rust 依赖编译失败
构建过程中遇到 parking_lot、serde_core、icu_normalizer_data 等依赖编译失败,错误提示 cannot find type Option in this scope。
可能原因:
- Rust 工具链版本不兼容
- Cargo 依赖缓存损坏
- Windows 构建工具链(MSVC)配置异常
解决方案(按顺序执行):
# 1. 清理 Rust 依赖缓存
cargo clean
# 2. 更新 Rust 工具链到最新版本
rustup update
# 3. 重新构建依赖
cargo build --release
# 4. 若仍失败,重新安装 MSVC 构建工具(通过 Rust 安装器勾选)
3.3 Tauri 打包 MSI 超时问题
若需要打包 MSI 安装包,Tauri 会依赖 WiX 工具集,国内网络容易出现下载超时。
解决方案:
- 方案1(推荐):手动下载 WiX 工具包,放到 Tauri 缓存目录
C:\Users\你的用户名\AppData\Local\tauri\WixTools\(无需解压),下载地址:wix314-binaries.zip - 方案2:放弃 MSI,打包 NSIS 格式的 EXE 安装包(更简单,无网络依赖),修改 tauri.conf.json 中 bundle 配置,指定 target 为 nsis。
四、项目当前状态总结
4.1 已完成工作
- ✅ 所有 Tauri 依赖和插件安装完成
- ✅ 5个核心配置文件修改完毕,适配项目需求
- ✅ 前端 TypeScript 编译通过,Vite 生产构建成功
- ✅ Tauri 开发模式可正常启动,前端与 Rust 联动正常
- ✅ 已解决无用导入警告,核心功能可正常运行
4.2 待解决问题
- ⚠️ Rust 依赖编译失败问题(按上述解决方案执行后可解决)
- ⚠️ (可选)MSI 打包超时问题(需手动配置 WiX 或改用 NSIS)
五、迁移心得与后续优化建议
5.1 迁移心得
-
Tauri 迁移的核心是配置文件的修改,只要严格按照官方规范配置,大部分问题都能避免;
-
对前端开发者而言,无需深入学习 Rust,只需掌握 Tauri 前端 API 的调用(类似调用接口),即可实现桌面端能力;
-
Tauri 虽轻量,但环境配置和依赖编译比 Electron 复杂,尤其是 Windows 系统,需耐心排查环境问题;
-
若项目追求体积和性能,Tauri 是最优选择;若追求快速交付、少踩坑,Electron 更适合。
5.2 后续优化建议
- 将 Rust PATH 配置添加到系统环境变量,避免每次启动终端手动执行;
- 添加启动脚本(如 .bat 文件),自动化 PATH 配置和开发/构建命令;
- 配置 CI/CD 流程,实现自动化构建和打包;
- 根据项目需求,补充 Rust 自定义命令,实现更复杂的桌面端能力(如串口通信);
- 优化打包配置,减小安装包体积,关闭不必要的权限和插件。
六、总结
本次前端项目迁移 Tauri 整体顺利,核心配置已全部完成,只需解决 Rust 依赖编译问题,即可实现正常打包和运行。Tauri 凭借轻量、高效的优势,能有效解决 Electron 体积大、内存高的问题,适合对性能和体积有要求的桌面应用。
本文所有配置和步骤均经过实际测试,可直接复制使用,若在迁移过程中遇到其他问题,可参考 Tauri 官方文档或留言交流。后续将持续优化项目,补充更多桌面端特性,为大家提供更完整的 Tauri 实践经验。