Présentation du framework
Proa est un framework web écrit en Rust qui propose un rendu serveur (SSR) à la fois rapide et capable de générer plusieurs cibles de sortie, notamment HTML et Markdown, à partir d’un même composant typé. Chaque composant hérite d’un WebContext générique L: DataLoader, ce qui garantit que les données de requête, le cache du chargeur et les métadonnées de réponse sont accessibles de façon typée lors du rendu.
Architecture et rendu multi‑cible
Le système repose sur des macros spécifiques, html_sync! et md_sync!, qui encapsulent le code de rendu dans des blocs littéraux. Par exemple, le composant ProductCard implémente MdRenderSync et WebRenderSync :
impl<L: DataLoader> MdRenderSync<L> for ProductCard {
fn render_md(self, cx: &mut WebContext<L>) -> Result<(), WriteError> {
md_sync! { r###"
# {self.product.name}
{Link::new("Buy now", self.product.url)}
"### }
.render_md(cx)
}
}
impl<L: DataLoader> WebRenderSync<L> for ProductCard {
fn render(self, cx: &mut WebContext<L>) -> Result<(), WriteError> {
html_sync! {
<article data-product-card>
<h2>{self.product.name}</h2>
{Link::new("Buy now", self.product.url)}
</article>
}
.render(cx)
}
}Ces macros permettent de générer du HTML ou du Markdown sans passer par un moteur de templates séparé ; le code Rust reste la source unique de vérité. Le framework supporte le streaming SSR en ordre ou hors‑ordre, grâce à des frontières de suspense qui peuvent libérer des fragments prêts pendant que d’autres attendent des données lentes.
Performances et comparaison
Les mesures publiées indiquent un temps de rendu p50 de 5.56 ms pour Proa sur un serveur VPS 8‑vCPU AMD EPYC‑Milan, contre 237 fois plus lent pour le rendu React.renderToString. Un rendu de démonstration montre un temps serveur de 41 µs avec 0 kB de JavaScript envoyé au client, ce qui illustre la capacité du framework à éviter le « render tax » habituel des SPA. Chaque île interactive (RSJS) ne génère qu’environ 1.3 KB gzippé, car seul le code nécessaire est compilé en JavaScript vanilla.
Sécurité, accessibilité et interopérabilité
Proa intègre par défaut l’échappement automatique des sorties, la protection contre les requêtes cross‑origin, ainsi que des en‑têtes de sécurité. Les vérifications WCAG et WAI‑ARIA sont exécutées pendant la compilation cargo build, ce qui empêche le déploiement de balises non conformes. Le framework peut être utilisé avec le routeur Axum natif ou appelé via FFI depuis Node, Go, Python, Ruby ou Java, permettant une migration progressive : il suffit de proxyer une route vers Proa tout en conservant le reste de l’application sur Next.js ou Rails. Le site de démonstration indique 36.2 k requêtes hebdomadaires, attestant d’une utilisation réelle en production.