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

MotifSource (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 helper h() 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).