Présentation du stack Dioxus

SeggWat et infra.page utilisent Dioxus 0.7 dans un workspace Cargo unique. Le projet regroupe un crate backend, un crate d’authentification et une dizaine de crates UI, soit douze crates qui dépendent de Dioxus. Le code Rust gère la requête SQL, la logique métier, les fonctions serveur et la génération du client WebAssembly. La base de données est PostgreSQL. Le même modèle de données est partagé entre serveur et client, ce qui élimine la génération d’OpenAPI ou d’interfaces TypeScript.

Performances de compilation et contraintes CI

Le double ciblage (serveur + wasm32) multiplie les temps de compilation. Sur un runner GitHub à 2 cœurs, la construction d’une image en mode release dure environ 90 minutes. Sur un runner auto‑hébergé, le même processus tombe à 40 minutes. Le seul artefact WebAssembly nécessite 22 minutes sur 6 cœurs. Le processus cargo clippy --workspace --all-targets a échoué par OOM sur un runner de 7 Go, résolu uniquement avec un fichier d’échange de 10 Go et la variable CARGO_BUILD_JOBS=1 pour limiter la concurrence.

Le cache Rust (Swatinem/rust-cache) réduit le temps de compilation, mais GitHub ne restaure les caches que depuis la branche par défaut ou le même ref, et les caches expirent après 7 jours d’inactivité. L’auteur a donc déclenché des builds manuels sur la branche principale après chaque mise à jour de dépendance pour « réchauffer » le cache.

Le linker mold a été testé, mais le goulot d’étranglement reste la phase de compilation, pas de liaison. La solution la plus efficace a été le runner auto‑hébergé, qui impose toutefois la maintenance d’un serveur de build.

Gestion du code partagé et limites du modèle

Le partage de structures Rust entre backend et UI évite les dérives de type. Un renommage de champ déclenche immédiatement des erreurs de compilation dans toutes les crates concernées, grâce à cargo check. Cette cohérence simplifie les refactorisations nocturnes sans revue de code.

Le modèle fullstack introduit toutefois une dépendance résiduelle au JavaScript. Les graphiques sont rendus avec Chart.js, intégré via dioxus-use-js et environ 340 lignes de script. Le pipeline CI installe également Bun et exécute Tailwind CLI avant la compilation Rust. Ainsi, même si le cœur du produit est en Rust, le projet nécessite un outilchain JavaScript pour le rendu visuel.

Perspectives avec Topcoat

Topcoat, framework expérimental de l’organisation tokio‑rs, propose de rendre les composants asynchrones côté serveur et de générer automatiquement le JavaScript correspondant. Le modèle supprime le second artefact WebAssembly et, en théorie, élimine les 22 minutes de compilation WASM. Le code reste en Rust, les types sont partagés et aucune couche API n’est requise. Cependant, Topcoat est encore en phase early‑stage, avec des changements de rupture attendus. L’auteur prévoit de mesurer les temps de build et les éventuelles pertes fonctionnelles avant de l’adopter.