Tauri — Desktop en Rust, interface en Web
Tauri construit des applications desktop cross-platform en utilisant le WebView natif du système d'exploitation pour l'interface et Rust pour le backend système. Résultat : des binaires de 3 à 10 Mo contre 150+ Mo pour Electron.
Définition & concept
Tauri est un framework qui permet de créer des applications desktop légères en utilisant n'importe quel framework frontend web (React, Vue, Svelte, Vanilla JS…) pour l'interface, et Rust pour toute la logique système backend.
La différence clé avec Electron : Tauri n'embarque pas Chromium. Il utilise
le WebView natif déjà présent dans le système d'exploitation :
WebView2 (Edge/Blink) sur Windows, WKWebView (Safari/WebKit)
sur macOS, et WebKitGTK sur Linux. Économie : ~120 Mo par application.
| Critère | HTA | Electron | Tauri |
|---|---|---|---|
| Moteur HTML | MSHTML/IE | Chromium embarqué | WebView natif OS |
| Backend | WScript/VBS | Node.js | Rust |
| Taille bundle | ~0 Ko | ~150 Mo | ~3–10 Mo |
| RAM (démarrage) | ~20 Mo | ~150 Mo | ~30 Mo |
| Plateformes | Windows | Win+Mac+Linux | Win+Mac+Linux+Mobile* |
| Courbe d'apprentissage | Faible | Modérée | Élevée (Rust) |
| Performance | Faible | Bonne | Excellente |
* Support mobile (iOS/Android) disponible en beta avec Tauri 2.x.
Historique & évolution
Daniel Thompson-Yvetot et l'équipe TauriApps créent le projet comme alternative légère à Electron. Le concept : utiliser WebView natif + Rust au lieu d'embarquer Chromium + Node.js.
Le projet rejoint la Linux Foundation. L'API se stabilise. La communauté croît rapidement, attirée par la promesse de binaires ultra-légers.
Première version stable. Support Windows (WebView2), macOS (WKWebView), Linux (WebKitGTK).
L'API de invoke (appel frontend → Rust) et le système de plugins sont figés.
L'entreprise CrabNebula se forme pour soutenir commercialement le projet. Tauri 2.0 introduit le support mobile (iOS/Android), le nouveau système de permissions "Capabilities", et l'ACL (Access Control List) pour les plugins.
Tauri 2.x devient stable. Support iOS et Android en production. Le système de Capabilities remplace les permissions granulaires de la v1. L'écosystème de plugins officiel s'étoffe.
Architecture Frontend / Core
Tauri sépare strictement l'interface (WebView, n'importe quel framework JS) du backend (Rust). La communication est explicite et typée.
WebKitGTK (Linux)
mon-app/ ├── package.json ← frontend (npm) ├── src/ ← frontend (React, Vue, etc.) │ └── App.tsx └── src-tauri/ ├── Cargo.toml ← dépendances Rust ├── tauri.conf.json ← configuration Tauri └── src/ └── main.rs ← backend Rust (commands)
Installation & prérequis
# 1. Installer Rust (si pas déjà installé) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # 2. Créer un projet Tauri (avec Vite + React par exemple) npm create tauri-app@latest # → choix du frontend : Vanilla / Vue / React / Svelte / Solid # 3. Installer les dépendances cd mon-app && npm install # 4. Démarrer en mode développement (hot-reload) npm run tauri dev # 5. Build de production (binaire natif + installeur) npm run tauri build
Commands Rust ↔ Frontend
La communication frontend → Rust se fait via des Commands : des fonctions
Rust annotées avec #[tauri::command] et appelées depuis JS avec invoke().
use tauri::command; use std::fs; // Command simple : retourne une valeur #[command] fn lire_fichier(chemin: String) -> Result<String, String> { fs::read_to_string(&chemin) .map_err(|e| e.to_string()) } // Command async avec accès à l'état Tauri #[command] async fn executer_ffmpeg( args: Vec<String>, app: tauri::AppHandle ) -> Result<String, String> { let output = std::process::Command::new("ffmpeg") .args(&args) .output() .map_err(|e| e.to_string())?; Ok(String::from_utf8_lossy(&output.stdout).to_string()) } fn main() { tauri::Builder::default() .invoke_handler(tauri::generate_handler![ lire_fichier, executer_ffmpeg ]) .run(tauri::generate_context!()) .expect("Erreur Tauri"); }
import { invoke } from '@tauri-apps/api/core' // Appel d'une command Rust — async, typé const contenu = await invoke<string>('lire_fichier', { chemin: '/home/user/doc.txt' }) // Écouter des événements Rust → Frontend import { listen } from '@tauri-apps/api/event' const unlisten = await listen<number>('progress', (event) => { console.log(`Progression: ${event.payload}%`) })
Capabilities & APIs
Tauri 2.x utilise un système de Capabilities (ACL) : chaque permission système doit être explicitement déclarée. Aucun accès implicite.
tauri-plugin-fsLecture/écriture fichiers avec permissions granulaires par chemin et par opération.
tauri-plugin-shellExécuter des processus externes (ffmpeg, git…). Chaque executable doit être déclaré explicitement.
tauri-plugin-dialogBoîtes de dialogue natives : ouverture fichier, sauvegarde, messages, confirmation.
tauri-plugin-notificationNotifications système natives sur toutes les plateformes.
tauri-plugin-httpRequêtes HTTP(S) depuis le backend Rust via reqwest. Permissions par domaine.
tauri-plugin-sqlBase de données SQLite, MySQL ou PostgreSQL directement depuis le backend Rust.
tauri-plugin-storeStockage persistant clé-valeur JSON — équivalent localStorage mais natif.
tauri-plugin-updaterMise à jour automatique de l'application avec vérification de signature cryptographique.
tauri-plugin-clipboardLire et écrire dans le presse-papiers (texte, images).
tauri-plugin-global-shortcutRaccourcis clavier globaux système.
Tous les crates Rustcrates.io donne accès à 100 000+ bibliothèques Rust pour le backend (crypto, DB, réseau…).
tauri-plugin-camera (v2)Accès à la caméra — desktop et mobile (iOS/Android) avec Tauri 2.
Plugins & écosystème
[dependencies]
tauri = { version = "2", features = [] }
tauri-plugin-fs = "2"
tauri-plugin-dialog = "2"
tauri-plugin-shell = "2"
tauri-plugin-http = "2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
{
"capabilities": [{
"identifier": "main-capability",
"windows": ["main"],
"permissions": [
"fs:read-all",
"fs:write-all",
"dialog:open",
"shell:execute",
"http:default"
]
}]
}
Sécurité — Avantages Rust
Tauri a une posture de sécurité nettement supérieure à Electron par défaut :
| Aspect | Electron | Tauri |
|---|---|---|
| Permissions | Implicites (tout Node.js accessible) | ACL explicite par capability |
| Accès filesystem | Toujours disponible (main process) | Doit être déclaré par chemin |
| Processus externes | child_process sans restriction | Chaque exe déclaré dans la config |
| Memory safety | Node.js (GC, pas de buffer overflow) | Rust (garanti à la compilation) |
| Surface d'attaque | Chromium + Node.js + V8 | WebView + Rust (minimal) |
| Mise à jour signée | Optionnel | Vérification signature intégrée |
Compatibilité par plateforme
Poids vs Electron
L'avantage numéro un de Tauri est la taille des binaires distribués. Le WebView natif n'est pas inclus dans le bundle — il est déjà sur l'OS de l'utilisateur.
| Métrique | Tauri | Electron | Facteur |
|---|---|---|---|
| Installateur Windows | ~3–10 Mo | ~80–200 Mo | ×20–30 plus léger |
| Installateur macOS | ~3–8 Mo | ~100–250 Mo | ×25–40 plus léger |
| RAM au démarrage | ~30–80 Mo | ~150–400 Mo | ×3–5 plus léger |
| Temps de démarrage | < 500 ms | 2–5 secondes | ×4–10 plus rapide |
| CPU idle | ~0% | 1–3% | Rust est compilé |
| Temps de build initial | 5–15 min (Rust) | 30–60 sec (npm) | Electron plus rapide |
| Rebuild incrémental | ~30–60 sec | ~5 sec | Electron plus fluide en dev |
Build & distribution
# Build pour la plateforme courante npm run tauri build # → src-tauri/target/release/bundle/ # Windows : .exe (NSIS) + .msi # macOS : .dmg + .app # Linux : .AppImage + .deb + .rpm # Build cross-platform via GitHub Actions (recommandé) # Tauri ne compile pas cross-platform nativement — # il faut un runner macOS pour le .dmg, Windows pour le .exe
Cas d'usage appropriés
| Cas d'usage | Pertinence | Raison |
|---|---|---|
| App desktop légère cross-platform | EXCELLENT | C'est le cas d'usage principal de Tauri. Binaires minuscules. |
| App sensible à la sécurité | EXCELLENT | ACL, Rust memory safety, surface d'attaque minimale. |
| App mobile + desktop (v2) | TRÈS BON | Tauri 2 unifie desktop et mobile avec le même code Rust. |
| Performance critique backend | EXCELLENT | Rust est proche du C en performance. Idéal pour traitement vidéo, crypto, DB. |
| Équipe sans expérience Rust | RISQUÉ | Rust a une courbe d'apprentissage élevée. Electron est plus accessible. |
| Prototypage rapide | CORRECT | dev hot-reload fonctionne, mais les erreurs Rust ralentissent. |
| App distribuée grand public | EXCELLENT | Installateur léger = frein à l'adoption réduit. |