阅读导引:本文从架构原理、性能基准、开发体验、生态工具链四个维度,全面对比当前三大主流桌面应用开发框架——Electron、Tauri 和 Wails。无论你是技术选型决策者,还是想学习新框架的开发者,都能从中找到你需要的信息。


目录


一、三大框架速览

维度ElectronTauriWails
诞生年份201320192019
最新稳定版v35.x (2025)v2.x (2024)v2.x / v3 alpha (2025)
后端语言JavaScript/TypeScript (Node.js)RustGo
前端技术任意 Web 框架任意 Web 框架任意 Web 框架
渲染引擎内嵌 Chromium系统 WebView²系统 WebView²
许可证MITMIT/Apache 2.0MIT
支持平台Windows / macOS / LinuxWindows / macOS / Linux / iOS³ / Android³Windows / macOS / Linux
维护方OpenJS Foundation / GitHubTauri Contributors (Daoitsu GmbH)Lea Anthony

² Windows 使用 WebView2(Edge 内核),macOS 使用 WKWebView(Safari 内核),Linux 使用 WebKitGTK
³ Tauri 2.0 新增移动端支持(Beta)


二、架构原理深度解析

理解框架的底层架构,是做出正确技术选型的前提。

2.1 Electron:Chromium + Node.js 的重量级方案

┌──────────────────────────────────────────────────────┐
│                    Electron 应用                       │
│                                                      │
│  ┌──────────────┐     IPC      ┌──────────────────┐  │
│  │  渲染进程      │ ◄──────────► │  主进程            │  │
│  │  (Chromium)   │  ipcMain /  │  (Node.js)       │  │
│  │              │  ipcRenderer │                  │  │
│  │  - HTML/CSS  │              │  - 文件系统       │  │
│  │  - React/Vue │              │  - 原生 API      │  │
│  │  - 用户界面   │              │  - 系统集成       │  │
│  └──────────────┘              └──────────────────┘  │
│         │                              │              │
│    内嵌 Chromium                  内嵌 Node.js        │
│    (~120MB)                     (~50MB)               │
└──────────────────────────────────────────────────────┘

核心特点

  • 自包含运行时:每个 Electron 应用都内嵌了一份完整的 Chromium 和 Node.js,不依赖系统环境
  • 多进程架构:主进程(Node.js)负责原生操作,渲染进程(Chromium)负责 UI,通过 IPC 通信
  • Preload 桥接:通过 contextBridge 在安全隔离的前提下暴露主进程能力给渲染进程

优势

  • 一致性最强:无论在哪个平台,你的应用运行的都是同一个 Chromium 版本
  • Node.js 生态完整:npm 上百万级别的包都可以直接使用
  • 成熟度最高:VS Code、Slack、Discord 等大型应用验证了其稳定性

劣势

  • 体积大:即使一个空应用也要 ~150MB
  • 内存占用高:Chromium 多进程架构本身就很重
  • 启动慢:需要初始化 Chromium 和 Node.js 两个运行时

2.2 Tauri:系统 WebView + Rust 的轻量级方案

┌──────────────────────────────────────────────────────┐
│                    Tauri 应用                          │
│                                                      │
│  ┌──────────────┐   Command    ┌──────────────────┐  │
│  │  前端          │ ◄──────────► │  Rust 后端        │  │
│  │  (系统WebView)│  invoke()   │                  │  │
│  │              │              │  - 文件系统       │  │
│  │  - HTML/CSS  │  Events     │  - SQLite        │  │
│  │  - React/Vue │ ◄──────────► │  - 系统集成       │  │
│  │  - 用户界面   │              │  - 原生操作       │  │
│  └──────────────┘              └──────────────────┘  │
│         │                              │              │
│    系统 WebView                  Rust 编译二进制      │
│    (0MB 额外)                   (~5-15MB)            │
└──────────────────────────────────────────────────────┘

核心特点

  • 借用系统 WebView:Windows 上用 WebView2(基于 Edge/Chromium),macOS 上用 WKWebView(基于 Safari/WebKit),Linux 上用 WebKitGTK
  • Rust 后端:通过 #[tauri::command] 宏将 Rust 函数直接暴露给前端调用,零开销 IPC
  • 安全默认:所有危险操作(文件访问、Shell 执行等)都需要在配置中显式声明权限

优势

  • 体积极小:空应用打包后仅 ~3-8MB
  • 内存占用低:无 Chromium 多进程开销
  • 安全性强:默认最小权限原则,CSP 白名单机制
  • Tauri 2.0 新增移动端支持:一套代码可以同时构建桌面和移动应用

劣势

  • WebView 一致性问题:不同操作系统的 WebView 内核不同,可能存在渲染差异
  • Rust 学习曲线陡峭:所有权、生命周期等概念对初学者不友好
  • 部分 Node.js 包无法直接使用:需要 Rust 等价替代或通过 sidecar 方案

2.3 Wails:系统 WebView + Go 的简洁方案

┌──────────────────────────────────────────────────────┐
│                    Wails 应用                         │
│                                                      │
│  ┌──────────────┐   Binding    ┌──────────────────┐  │
│  │  前端          │ ◄──────────► │  Go 后端          │  │
│  │  (系统WebView)│  自动生成     │                  │  │
│  │              │  JS Binding │  - 文件系统       │  │
│  │  - HTML/CSS  │              │  - 数据库         │  │
│  │  - React/Vue │  Events     │  - 系统集成       │  │
│  │  - 用户界面   │ ◄──────────► │  - 原生操作       │  │
│  └──────────────┘              └──────────────────┘  │
│         │                              │              │
│    系统 WebView                  Go 编译二进制        │
│    (0MB 额外)                   (~8-20MB)            │
└──────────────────────────────────────────────────────┘

核心特点

  • Go 后端:通过自动生成的 JS Binding 将 Go 结构体和方法暴露给前端,开发体验流畅
  • 内存 IPC:前后端通信不经过网络端口,直接通过内存进行,性能极高
  • 简洁设计:API 设计直观,学习成本低于 Tauri

优势

  • Go 语言上手快:相比 Rust,Go 的学习曲线更平缓
  • 并发模型简单:goroutine + channel 比 tokio 异步更容易理解
  • 自动绑定生成:Go 的结构体和方法自动生成对应的 JS/TS 类型定义
  • Wails v3 新增多窗口支持、原生菜单、系统托盘等能力

劣势

  • Go 二进制体积略大于 Rust(GC 运行时开销)
  • 生态不如 Tauri 成熟:插件数量较少
  • v3 仍处于 Alpha 阶段:API 可能变动
  • 无移动端支持:仅支持桌面平台

三、性能基准测试对比

以下数据基于开源基准测试项目 web-to-desktop-framework-comparison 以及社区实测数据,测试环境为相同硬件配置。

3.1 安装包体积

应用类型ElectronTauriWails
Hello World 空应用~150MB~3-5MB~8-12MB
含基础功能的应用~200MB~10-20MB~15-25MB
含复杂依赖的应用~300MB+~30-50MB~30-50MB
macOS (系统 WebView 免安装)~250MB~5-10MB~10-15MB

结论:Tauri 和 Wails 的安装包体积仅为 Electron 的 2%-8%

3.2 运行时内存占用

状态ElectronTauriWails
空闲(最小化)~100-150MB~20-40MB~25-45MB
空闲(窗口可见)~200-350MB~40-80MB~50-90MB
中等负载~400-600MB~100-200MB~120-220MB
重度负载~600MB-1GB+~200-400MB~250-450MB

结论:Tauri 和 Wails 的内存占用约为 Electron 的 30-40%

3.3 启动速度

指标ElectronTauriWails
冷启动(到窗口可见)2-5s0.3-1s0.5-1.5s
热启动(二次打开)1-3s0.2-0.5s0.3-0.8s
首帧渲染时间300-500ms80-150ms100-200ms

结论:Tauri 启动速度最快,约为 Electron 的 3-5 倍

3.4 CPU 与 IPC 效率

操作ElectronTauriWails
IPC 调用延迟~0.5-2ms~0.01-0.05ms~0.01-0.1ms
文件读取 (10MB)~15ms~5ms~8ms
SQLite 查询 (1000 条)~50ms (sql.js/WASM)~5ms (rusqlite)~8ms (go-sqlite3)
JSON 序列化/反序列化~2ms~0.5ms~0.8ms

结论:Rust 后端的 IPC 和数据操作效率最高,Go 次之,Node.js 相对较慢。特别是 SQLite 操作,原生驱动比 WASM 模拟快 5-10 倍


四、开发体验对比

4.1 项目初始化与脚手架

Electron

# 使用 electron-vite 脚手架(推荐)
npm create @quick-start/electron my-app
cd my-app
npm install
npm run dev

# 或使用 electron-forge
npm init electron-app@latest my-app

Tauri

# 使用 create-tauri-app
npm create tauri-app@latest my-app
# 选择前端框架(React/Vue/Svelte/vanilla)
# 选择包管理器(npm/pnpm/yarn/bun)
cd my-app
npm install
npm run tauri dev

Wails

# 安装 Wails CLI
go install github.com/wailsapp/wails/v2/cmd/wails@latest

# 创建项目
wails init -n my-app -t react   # 或 -t vue, -t svelte
cd my-app
wails dev
维度ElectronTauriWails
脚手架模板数量丰富(社区)官方提供主流框架官方提供主流框架
初始化耗时~30s~60s(需编译 Rust)~30s
前端框架支持任意任意任意
TypeScript 支持✅ 原生✅ 原生✅ 自动生成类型

4.2 前后端通信机制

这是三个框架差异最大的地方,直接影响开发模式。

Electron — IPC 通道模式

// 主进程 main.js
const { ipcMain } = require('electron');

ipcMain.handle('greet', async (event, name) => {
  return `Hello, ${name}!`;
});

// 预加载脚本 preload.js
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('api', {
  greet: (name) => ipcRenderer.invoke('greet', name)
});

// 渲染进程 App.jsx
const greeting = await window.api.greet('World');
console.log(greeting); // "Hello, World!"

Tauri — Command 宏模式

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

fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![greet])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
// 前端 App.tsx
import { invoke } from '@tauri-apps/api/core';

const greeting = await invoke<string>('greet', { name: 'World' });
console.log(greeting); // "Hello, World!"

Wails — 自动绑定模式

// app.go
type App struct {
    ctx context.Context
}

func (a *App) Greet(name string) string {
    return fmt.Sprintf("Hello, %s!", name)
}

func main() {
    app := &App{}
    wails.Run(&options.App{
        Bind: []interface{}{app},
    })
}
// 前端自动生成的绑定
import { Greet } from '../wailsjs/go/main/App';

const greeting = await Greet('World');
console.log(greeting); // "Hello, World!"
通信特性ElectronTauriWails
通信方式序列化 IPCFFI + 序列化内存直接调用
类型安全需手动维护命令宏自动推导自动生成 TS 类型
性能开销中等极低极低
双向事件✅ ipcMain/ipcRenderer✅ Events 系统✅ Events 系统
流式数据✅ 通过 IPC✅ 通过 Channel✅ 通过 Events

4.3 调试与热重载

功能ElectronTauriWails
前端热重载✅ Vite/Webpack HMR✅ Vite HMR✅ 内置
后端断点调试✅ VS Code + Node.js✅ VS Code + rust-analyzer✅ VS Code + Delve
DevTools✅ Chrome DevTools✅ 系统 WebView DevTools✅ 系统 WebView DevTools
日志系统console + electron-logprintln + log cratefmt.Println + 内置日志
性能分析✅ Chrome Performance✅ Instruments/tracy⚠️ Go pprof

4.4 构建与打包

维度ElectronTauriWails
打包工具electron-builder / electron-forge内置 tauri build内置 wails build
输出格式 (Win).exe / NSIS / MSI.msi / NSIS.exe / NSIS
输出格式 (Mac).dmg / .app.dmg / .app.dmg / .app
输出格式 (Linux).AppImage / .deb / .rpm.deb / .AppImage.deb / .rpm
自动更新✅ electron-updater✅ tauri-plugin-updater⚠️ 需自行实现
代码签名✅ 成熟方案✅ 内置支持✅ 内置支持
交叉编译⚠️ 有限支持✅ GitHub Actions⚠️ 有限支持

五、生态与工具链

5.1 插件/扩展系统

Electron — 无官方插件系统,但 npm 生态极其丰富:

  • electron-builder — 打包分发
  • electron-updater — 自动更新
  • electron-store — 简单 KV 存储
  • electron-log — 日志管理
  • 几乎所有 Node.js 包都可以直接使用

Tauri — 官方插件体系,覆盖常用场景:

插件功能
tauri-plugin-sqlSQLite / MySQL / PostgreSQL
tauri-plugin-fs文件系统操作
tauri-plugin-dialog原生文件对话框
tauri-plugin-shellShell 命令执行 + Sidecar
tauri-plugin-notification系统通知
tauri-plugin-autostart开机自启
tauri-plugin-storeKV 持久化存储
tauri-plugin-httpHTTP 客户端
tauri-plugin-process进程管理
tauri-plugin-updater自动更新
tauri-plugin-os操作系统信息
tauri-plugin-clipboard剪贴板

Wails — 插件系统在 v3 中引入,目前仍在完善:

  • 内置:文件对话框、系统托盘、原生菜单、窗口管理
  • 第三方:Go 生态库直接使用(如 gormgo-sqlite3

5.2 原生能力支持

能力ElectronTauriWails
系统托盘✅ Tray API✅ tauri-plugin-tray✅ 内置
原生菜单✅ Menu API✅ tauri-plugin-menu✅ v3 内置
文件对话框✅ dialog API✅ tauri-plugin-dialog✅ 内置
系统通知✅ Notification API✅ tauri-plugin-notification⚠️ 需第三方
全局快捷键✅ globalShortcut✅ tauri-plugin-global-shortcut✅ 内置
剪贴板✅ clipboard API✅ tauri-plugin-clipboard⚠️ 需第三方
窗口管理✅ BrowserWindow✅ 多窗口✅ v3 多窗口
摄像头/麦克风✅ getUserMedia✅ getUserMedia✅ getUserMedia
蓝牙/USB✅ Web Bluetooth/USB✅ Web Bluetooth/USB✅ Web Bluetooth/USB
深色模式✅ nativeTheme✅ tauri-plugin-os✅ 系统检测
Sidecar 进程⚠️ child_process✅ 原生支持⚠️ 需手动管理

5.3 社区活跃度与 GitHub 数据

指标ElectronTauriWails
GitHub Stars~116k~92k~27k
贡献者数量~1200+~500+~200+
npm 下载量 (周)~4M+~200k+N/A
Stack Overflow 问答~25k+~1.5k+~500+
知名应用VS Code, Slack, DiscordClash Verge, 1Password, Zed多个内部工具
企业采用广泛增长中中等

六、典型应用场景与选型建议

场景一:内容消费类应用(笔记、阅读器、音乐播放器)

推荐:Tauri > Wails > Electron

这类应用对性能要求不高,但用户对安装包体积和启动速度敏感。Tauri 的轻量特性最适合。

场景二:开发工具(IDE、编辑器、终端)

推荐:Electron > Tauri > Wails

开发工具需要复杂的 DOM 操作(代码高亮、diff 渲染、虚拟滚动),Chromium 的渲染一致性是关键优势。VS Code、Atom 都是 Electron 的成功案例。Tauri 也可以胜任,但需要注意 WebView 兼容性。

场景三:企业内部工具(管理后台、数据看板)

推荐:Electron 或 Wails > Tauri

企业工具通常需要快速交付,团队技术栈是决定因素。如果团队熟悉 Go,Wails 是最佳选择;如果团队是前端出身,Electron 上手最快。

场景四:IM / 社交应用(聊天、会议)

推荐:Electron > Tauri > Wails

IM 应用需要大量 WebSocket 连接、媒体处理、系统级通知,Electron 的 Node.js 生态在这方面最成熟。Tauri 也可以通过 Rust 异步运行时实现,但开发效率较低。

场景五:跨平台 + 移动端应用

推荐:Tauri(唯一支持移动端的选项)

如果你的应用需要同时覆盖桌面和移动端,Tauri 2.0 是目前唯一的选择(支持 iOS 和 Android)。

选型决策树

你的项目需要桌面 + 移动端?
├── 是 → Tauri 2.0
└── 否
    ├── 团队熟悉 Rust 或愿意学习?
    │   ├── 是 → 追求极致性能和安全? → Tauri
    │   └── 否
    │       ├── 团队熟悉 Go? → Wails
    │       └── 团队是纯前端? → Electron
    └── 需要大量 Node.js 生态包?
        ├── 是 → Electron
        └── 否 → Tauri 或 Wails

七、实战:三个框架的 Hello World

7.1 Electron Hello World

项目结构

my-electron-app/
├── package.json
├── main.js
├── preload.js
└── index.html

package.json

{
  "name": "my-electron-app",
  "version": "1.0.0",
  "main": "main.js",
  "scripts": {
    "start": "electron .",
    "build": "electron-builder"
  },
  "devDependencies": {
    "electron": "^35.0.0",
    "electron-builder": "^24.0.0"
  }
}

main.js

const { app, BrowserWindow, ipcMain } = require('electron');
const path = require('path');

function createWindow() {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      contextIsolation: true,
      nodeIntegration: false,
    },
  });
  win.loadFile('index.html');
}

app.whenReady().then(createWindow);

ipcMain.handle('greet', async (_event, name) => {
  return `Hello, ${name}! Welcome to Electron.`;
});

preload.js

const { contextBridge, ipcRenderer } = require('electron');

contextBridge.exposeInMainWorld('electronAPI', {
  greet: (name) => ipcRenderer.invoke('greet', name),
});

index.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Electron App</title>
</head>
<body>
  <h1>Electron Hello World</h1>
  <input id="name" placeholder="输入你的名字" />
  <button onclick="greet()">打招呼</button>
  <p id="result"></p>
  <script>
    async function greet() {
      const name = document.getElementById('name').value;
      const result = await window.electronAPI.greet(name);
      document.getElementById('result').textContent = result;
    }
  </script>
</body>
</html>

7.2 Tauri Hello World

项目结构

my-tauri-app/
├── src/                  # 前端代码
│   ├── App.tsx
│   └── main.tsx
├── src-tauri/            # Rust 后端
│   ├── src/
│   │   └── main.rs
│   ├── Cargo.toml
│   └── tauri.conf.json
└── package.json

src-tauri/src/main.rs

#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]

#[tauri::command]
fn greet(name: &str) -> String {
    format!("Hello, {}! Welcome to Tauri.", name)
}

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

src-tauri/tauri.conf.json(关键部分)

{
  "build": {
    "devUrl": "http://localhost:5173",
    "frontendDist": "../dist"
  },
  "app": {
    "windows": [
      {
        "title": "Tauri App",
        "width": 800,
        "height": 600
      }
    ]
  }
}

src/App.tsx

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

function App() {
  const [name, setName] = useState('');
  const [result, setResult] = useState('');

  const greet = async () => {
    const res = await invoke<string>('greet', { name });
    setResult(res);
  };

  return (
    <div>
      <h1>Tauri Hello World</h1>
      <input value={name} onChange={(e) => setName(e.target.value)} placeholder="输入你的名字" />
      <button onClick={greet}>打招呼</button>
      <p>{result}</p>
    </div>
  );
}

export default App;

7.3 Wails Hello World

项目结构

my-wails-app/
├── app.go                # Go 后端
├── main.go               # 入口
├── frontend/             # 前端代码
│   ├── src/
│   │   └── App.jsx
│   └── index.html
└── wails.json

app.go

package main

import "context"

type App struct {
	ctx context.Context
}

func (a *App) startup(ctx context.Context) {
	a.ctx = ctx
}

func (a *App) Greet(name string) string {
	return "Hello, " + name + "! Welcome to Wails."
}

main.go

package main

import (
	"embed"

	"github.com/wailsapp/wails/v2"
	"github.com/wailsapp/wails/v2/pkg/options"
	"github.com/wailsapp/wails/v2/pkg/options/assetserver"
)

//go:embed all:frontend/dist
var assets embed.FS

func main() {
	app := &App{}

	err := wails.Run(&options.App{
		Title:  "Wails App",
		Width:  800,
		Height: 600,
		AssetServer: &assetserver.Options{
			Assets: assets,
		},
		OnStartup:  app.startup,
		Bind: []interface{}{
			app,
		},
	})

	if err != nil {
		println("Error:", err.Error())
	}
}

frontend/src/App.jsx

import { useState } from 'react';
import { Greet } from '../wailsjs/go/main/App';

function App() {
  const [name, setName] = useState('');
  const [result, setResult] = useState('');

  const greet = async () => {
    const res = await Greet(name);
    setResult(res);
  };

  return (
    <div>
      <h1>Wails Hello World</h1>
      <input value={name} onChange={(e) => setName(e.target.value)} placeholder="输入你的名字" />
      <button onClick={greet}>打招呼</button>
      <p>{result}</p>
    </div>
  );
}

export default App;

八、迁移指南:从 Electron 到 Tauri/Wails

8.1 前端代码迁移

前端代码的迁移是最简单的部分,主要工作是替换 IPC 调用方式:

ElectronTauriWails
window.electronAPI.xxx()invoke('xxx', args)Xxx(args) (自动生成)
ipcRenderer.on('event', cb)listen('event', cb)EventsOn('event', cb)
ipcRenderer.invoke('cmd')invoke('cmd', args)GoFunc(args)
contextBridge.exposeInMainWorld不需要不需要
window.electron.store.get()Store.get()自定义 Go 方法

8.2 数据层迁移

Electron (Node.js)Tauri (Rust)Wails (Go)
sql.js (WASM)rusqlitego-sqlite3 / modernc.org/sqlite
electron-storetauri-plugin-store自定义 JSON 文件或 SQLite
fs.readFile/writeFiletauri-plugin-fsos.ReadFile/WriteFile
lowdbserde_json + 文件encoding/json + 文件
better-sqlite3rusqlitego-sqlite3

8.3 原生 API 迁移

ElectronTauriWails
BrowserWindowtauri::Windowruntime.Window*
Traytauri-plugin-traysystemtray.New()
dialog.showOpenDialogtauri-plugin-dialogruntime.OpenDirectoryDialog
shell.openExternaltauri-plugin-shellbrowser.OpenURL()
app.setLoginItemSettingstauri-plugin-autostart写注册表 / LaunchAgent
nativeImageimage crateimage Go 包
Menutauri-plugin-menuv3 原生菜单

8.4 迁移风险评估清单

在迁移前,需要评估以下风险:

  • Node.js 原生模块依赖:如果项目使用了 C++ addon(如 better-sqlite3node-nim),必须找到替代方案
  • WebView 兼容性:Tauri/Wails 依赖系统 WebView,需要测试不同 Windows 版本(WebView2 需要手动安装)
  • Sidecar 策略:如果某些 Node.js 包没有 Rust/Go 替代品,需要规划 sidecar 方案
  • IPC 通道数量:Electron 项目通常有大量 IPC 通道,每个都需要重新实现
  • 调试工具链:Rust 的调试体验与 Node.js 不同,团队需要适应
  • 打包流程:CI/CD 需要更新为 Tauri/Wails 的构建流程

九、总结与展望

最终对比一览

维度⭐ 胜出者说明
安装包体积Tauri3-5MB vs Electron 150MB+
运行内存Tauri40-80MB vs Electron 200-350MB
启动速度Tauri0.3-1s vs Electron 2-5s
后端性能Tauri (Rust)无 GC、零开销抽象
开发效率Electronnpm 生态无敌,前端开发者零门槛
学习曲线Electron > Wails > TauriRust 的学习成本最高
安全性Tauri默认最小权限原则
跨平台一致性Electron内嵌 Chromium,表现完全一致
移动端支持Tauri唯一支持 iOS/Android
生态成熟度Electron十年积累,百万级 npm 包
Sidecar 支持Tauri原生一等公民支持
自动类型生成WailsGo 结构体自动生成 TS 类型

各框架的未来方向

Electron

  • 持续优化 Chromium 集成,减少内存占用
  • 探索 ES Modules 原生支持
  • 强化安全模型(sandbox by default)

Tauri

  • Tauri 2.0 移动端正式发布
  • 社区讨论引入 Deno 作为后端层(三层架构)
  • 插件生态快速扩展

Wails

  • v3 正式版发布在即(多窗口、原生菜单、系统托盘)
  • 性能优化(UPX 压缩集成,体积再减 35%)
  • 改进插件系统

一句话总结

Electron 是当下最稳妥的选择,Tauri 是未来最具潜力的选择,Wails 是 Go 开发者最顺手的选择。 技术选型没有银弹,选择最适合你团队和项目的那一个就好。


本文撰写于 2026 年 4 月,数据基于各框架最新稳定版本。如有疏漏,欢迎指正。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐