Tauri
Crie aplicativos de desktop com um frontend web e backend Rust - shells leves, IPC tipado e integração com o SO.
Receita
#[tauri::command]
fn read_text(path: String) -> Result<String, String> {
std::fs::read_to_string(path).map_err(|e| e.to_string())
}
fn main() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![read_text])
.run(tauri::generate_context!())
.expect("erro ao executar tauri");
}Quando usar isso:
- Equipes fortes em React/Svelte/Vue querendo empacotamento nativo
- Aplicativos que precisam de acesso ao sistema de arquivos, área de transferência ou shell a partir do Rust
- Tamanho de download menor em comparação com Electron
- Operações sensíveis à segurança mantidas fora do JavaScript
Exemplo Funcional
use serde::Serialize;
use tauri::State;
use std::sync::Mutex;
#[derive(Default)]
struct AppState {
counter: Mutex<i32>,
}
#[derive(Serialize)]
struct CounterResponse {
value: i32,
}
#[tauri::command]
fn increment(state: State<AppState>) -> CounterResponse {
let mut c = state.counter.lock().unwrap();
*c += 1;
CounterResponse { value: *c }
}
fn main() {
tauri::Builder::default()
.manage(AppState::default())
.invoke_handler(tauri::generate_handler![increment])
.run(tauri::generate_context!())
.expect("falha ao executar tauri");
}O que isso demonstra:
- Estado gerenciado entre invocações de comando
- Respostas JSON Serde para o frontend
- Registro mínimo de comandos no builder
Análise Profunda
Como Funciona
- WebView renderiza ativos de UI da pasta
dist/. - IPC serializa argumentos/respostas de comando com serde.
- Plugins Rust adicionam deep links, atualizador e escopos de shell.
- Capacidades (Tauri 2) substituem listas de permissão gerais.
Tauri vs Electron
| Aspecto | Tauri | Electron |
|---|---|---|
| Tamanho do Runtime | WebView do Sistema | Chromium Empacotado |
| Backend | Rust | Node.js |
| IPC | Comandos/eventos | Integração Node |
Armadilhas
- Expor caminhos brutos do JS - travessia de caminhos se não verificado. Correção: canonicalizar e verificar sob o diretório do aplicativo.
- Bloquear em comandos síncronos - congela a WebView da UI. Correção: comandos
asyncpara trabalho intensivo de IO. - CSP Ausente - XSS na UI se torna RCE via IPC. Correção:
Content-Security-Policyestrita na configuração. unwrapapenas para desenvolvimento em comandos - pânicos matam o aplicativo. Correção: retornarResultpara o frontend.- Diferenças de WebView de plataforma - teste Safari WebView no macOS e WebView2 no Windows separadamente.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Electron | Precisa de APIs específicas do Chromium | Tamanho do binário é crítico |
| egui | UI puramente Rust, sem HTML | UI de site de marketing rica necessária |
| iced | Widgets nativos Rust | Equipe só conhece React |
| Flutter desktop | Sistema de design em Dart | Mandato de backend Rust |
FAQs
Tauri 1 vs 2?
Tauri 2 usa permissões baseadas em capacidades - migre as configurações ao atualizar templates.
Qual frontend?
Qualquer build estático - React, Svelte, Vue ou TS puro. Rust não dita o framework de UI.
Como chamar comandos do JS?
import { invoke } from '@tauri-apps/api/core' então invoke('increment').
Tarefas em segundo plano?
Gerar tarefas Tokio no hook de configuração; emitir eventos para o frontend com app.emit.
Atualização automática?
Plugin de atualizador embutido com artefatos assinados - veja a página de empacotamento.
Mobile?
Existem alvos móveis do Tauri - separados do capítulo de desktop, mas compartilham o modelo de comando.
Testes?
Testar unidades de comandos Rust; Playwright na WebView para E2E onde viável.
Segredos no app?
Nunca incorpore chaves de API no bundle do frontend - busque de um comando Rust lendo o ambiente ou o gerenciador de senhas do SO.
Padrões de estado?
Veja Estado e Arquitetura.
APIs Nativas?
Integração Nativa para diálogos e notificações.
Relacionados
- Noções Básicas de GUI - paisagem
- Estado e Arquitetura - estado compartilhado
- Empacotamento e Distribuição - instaladores
- Integração Nativa - APIs do SO
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.