Illustration vectorielle plate montrant un espace de travail numérique avec un ordinateur portable affichant une application web structurée.

Topcoat : un framework Rust full-stack sans WebAssembly

Le framework Topcoat, développé par l’équipe Tokio, sort de sa phase de développement privé pour devenir une solution full-stack en Rust. Il repose sur le principe du rendu entièrement côté serveur, mais il y parvient en introduisant une méthode de réactivité qui évite le WebAssembly et un processus de compilation client séparé.

Le cœur de cette approche réside dans l’expression $(...). Ce sont des fragments Rust dont le compilateur vérifie le type. Topcoat les évalue sur le serveur pour le chargement initial, mais ils sont ensuite traduits en JavaScript. Ce mécanisme permet à l’interface de réagir instantanément dans le navigateur, offrant une sensation de fluidité comparable à celle de HTMX ou Phoenix LiveView, selon InfoQ.

Ce qui distingue Topcoat, c’est sa philosophie : simplifier la productivité en intégrant tout. Le framework utilise une macro view! qui permet de mélanger du HTML pur avec le contrôle de flux typique de Rust. On peut ainsi utiliser des boucles ou des conditions directement dans les templates, ce qui, selon les développeurs, réduit le code répétitif habituellement nécessaire pour construire une API séparée.

Photographie candidée de personnes collaborant autour d'une table de réunion devant des écrans affichant du code.

Pour gérer les mises à jour dynamiques, l’outil emploie le concept de #[shard]. Si une donnée change, Topcoat ne recharge pas toute la page ; il réexécute uniquement le composant marqué comme shard sur le serveur et remplace l’ancienne section HTML par la nouvelle. Cela fonctionne, par exemple, pour un tableau de bord de recherche où les résultats sont mis à jour en temps réel sans solliciter le serveur à chaque frappe.

Le système d’adressage est également intelligent. Il peut inférer l’arborescence des routes directement à partir de la structure des fichiers du projet, éliminant ainsi une étape de configuration manuelle lourde. De plus, le projet inclut Topcoat UI, une bibliothèque de composants inspirée de shadcn/ui. Ces composants sont intégrés dans le dépôt via une commande CLI, permettant aux équipes de modifier leur design et leur fonctionnalité sans emprisonnement dans un paquet fixe.

Lorsqu’un rafraîchissement serveur est nécessaire, comme pour afficher des données fraîches issues d’une base de données, le composant doit être marqué comme #[shard]. Dans ce cas, Topcoat exécute le code serveur, tel qu’une requête SQL, et injecte le résultat HTML à l’endroit précis de la page. Les capacités de runtime évoluent ; les expressions peuvent désormais gérer des types entiers de 128 bits et composer des états sans perdre la réactivité.

La version 0,9.0 a apporté des fonctionnalités notables, notamment le server push via live! et connected. Cela permet de maintenir les mises à jour même après que la page initiale ait fini de charger, en utilisant des WebSockets. Ceci est utile pour une application de chat, par exemple, où l’état des messages peut être poussé à tous les clients connectés simultanément. L’identité stable des régions de vie (#[key(...)]) assure que les composants réagissent correctement lors des rerendus, même si leur ordre change.

Le framework intègre également des outils pour la gestion des requêtes côté serveur. Il permet, par exemple, de récupérer l’adresse IP du client via client_ip(cx), en prenant en compte les proxys de confiance. Étant un projet open source en évolution rapide, sa stabilité à long terme n’est pas garantie. Néanmoins, l’équipe publie une feuille de route sur GitHub détaillant les prochaines étapes, notamment l’authentification et une intégration plus poussée avec Toasty.

Sources