前端项目迁移 Tauri 完整实践总结

0 阅读7分钟

在桌面应用开发中,Electron 虽成熟易用,但打包体积大、内存占用高的问题一直困扰着开发者。Tauri 作为轻量替代方案,凭借 Rust 底层的优势,能实现更小的打包体积和更低的资源占用,因此我将现有前端项目迁移至 Tauri,过程中踩了一些坑,也积累了完整的实操经验,特此整理成博客,供有类似需求的开发者参考。

本文将详细记录项目从基础配置、依赖安装,到配置修改、前端构建的全流程,同时梳理迁移过程中遇到的问题及解决方案,确保每一步都可复制、可落地,帮助大家快速完成 Tauri 项目改造。

一、迁移背景与目标

原有项目为前端可视化工具(基于 Vue/TypeScript + Vite),需打包为桌面应用,核心需求:

  • 降低打包体积(Electron 打包后通常100MB+,目标控制在10MB以内)
  • 减少内存占用,提升应用运行流畅度
  • 保留前端原有业务逻辑,最小化改造成本
  • 支持基础的桌面端能力(窗口管理、文件操作、HTTP请求、弹窗交互)

二、迁移全流程实操(可直接复制执行)

2.1 环境准备

迁移前需准备好基础环境,确保 Rust 和 Tauri 工具链正常运行,步骤如下:

  1. 安装 Rust 工具链:访问 Rust 官方安装包,按提示完成安装,安装完成后验证: rustc --version # 查看 Rust 版本 ``cargo --version # 查看 Cargo 版本(本文使用 1.95.0)
  2. 配置 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 前端构建与运行

配置完成后,即可启动开发模式和构建生产包,步骤如下:

  1. 开发模式:启动前端和 Tauri 开发服务器,实时调试: # 先设置 PATH(首次启动需执行,后续可配置永久环境变量) `` $env:Path = "$env:USERPROFILE.cargo\bin;$env:Path" ```` # 启动开发模式 ``pnpm run tauri:dev启动成功后,会自动打开 Tauri 窗口,前端修改后会实时热更新,联动 Rust 底层。

  2. 生产构建:打包桌面应用(支持 EXE、MSI 等格式): # 设置 PATH `` $env:Path = "$env:USERPROFILE.cargo\bin;$env:Path" ```` # 执行构建 ``pnpm run tauri:build构建完成后,产物位置:

    1. 可执行文件:src-tauri/target/release/
    2. 安装包: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_lotserde_coreicu_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 迁移心得

  1. Tauri 迁移的核心是配置文件的修改,只要严格按照官方规范配置,大部分问题都能避免;

  2. 对前端开发者而言,无需深入学习 Rust,只需掌握 Tauri 前端 API 的调用(类似调用接口),即可实现桌面端能力;

  3. Tauri 虽轻量,但环境配置和依赖编译比 Electron 复杂,尤其是 Windows 系统,需耐心排查环境问题;

  4. 若项目追求体积和性能,Tauri 是最优选择;若追求快速交付、少踩坑,Electron 更适合。

5.2 后续优化建议

  • 将 Rust PATH 配置添加到系统环境变量,避免每次启动终端手动执行;
  • 添加启动脚本(如 .bat 文件),自动化 PATH 配置和开发/构建命令;
  • 配置 CI/CD 流程,实现自动化构建和打包;
  • 根据项目需求,补充 Rust 自定义命令,实现更复杂的桌面端能力(如串口通信);
  • 优化打包配置,减小安装包体积,关闭不必要的权限和插件。

六、总结

本次前端项目迁移 Tauri 整体顺利,核心配置已全部完成,只需解决 Rust 依赖编译问题,即可实现正常打包和运行。Tauri 凭借轻量、高效的优势,能有效解决 Electron 体积大、内存高的问题,适合对性能和体积有要求的桌面应用。

本文所有配置和步骤均经过实际测试,可直接复制使用,若在迁移过程中遇到其他问题,可参考 Tauri 官方文档或留言交流。后续将持续优化项目,补充更多桌面端特性,为大家提供更完整的 Tauri 实践经验。