Passe de compilation PRISM
Lorsque le runtime JSX d'un fichier source est @bext-stack/framework, bext-turbopack exécute prism_compile::optimize sur la source AVANT que tsc-rs ne la traite. Les sous-arbres JSX résolubles statiquement sont réduits à des littéraux de chaîne JS ; le JSX dynamique (enfants fonctionnels, ternaires avec branches non-chaîne, invocations de composants dont le corps n'est pas réductible statiquement) passe au helper h() du runtime.
Astuce
Désactivez la passe avec BEXT_PRISM_COMPILE=0 dans /etc/default/nginx pour comparer la sortie brute tsc-rs à la sortie réduite — utile pour déboguer pourquoi un sous-arbre ne se replie pas. La passe est idempotente : appliquer deux fois produit le même résultat.
Paires avant / après sélectionnées
| Motif | Source (TSX) | Après passe de compilation |
|---|---|---|
| static element with text | <h1>Hello</h1> | "<h1>Hello</h1>" |
| interpolated text | <h1>Hello, {name}!</h1> | "<h1>Hello, " + (name) + "!</h1>" |
| attribute | <a href={url}>{text}</a> | '<a href="' + __bextEsc(url) + '">' + (text) + "</a>" |
| ternary class (folded with __bextEsc) | <div className={cond ? "a" : "b"}>{kid}</div> | '<div class="' + __bextEsc(cond ? "a" : "b") + '">' + (kid) + "</div>" |
| list .map (folded inline) | <ul>{items.map(i => <li>{i}</li>)}</ul> | "<ul>" + (items).map((i) => "<li>" + (i) + "</li>").join("") + "</ul>" |
| fully static subtree | <div><h1>Hi</h1><p>fixed text</p></div> | "<div><h1>Hi</h1><p>fixed text</p></div>" |
| dynamic root component (bails) | <Header title="x"><Page /></Header> | (falls through to runtime jsx() — components are only inlined when their body is a static-foldable JSX expression) |
Pourquoi c'est important
- Les textes et éléments statiques évitent entièrement le coût de formatage des balises du runtime — ils sont des littéraux de chaîne au niveau du bundle.
- L'interpolation des attributs passe par
__bextEscà la compilation, ce qui intègre la protection XSS même quand le helperh()du runtime n'est pas appelé. - Les formes dynamiques peuvent être réduites si chaque feuille est un littéral de chaîne ou si le motif de forme est reconnu. Le recours à
h()est correct, juste plus lent par élément.
Désactivez avec BEXT_PRISM_COMPILE=0 à la compilation pour observer la forme non réduite (utile pour comparer les sorties de build).