Ce qui se passe
Reprise, la couche qui relie Symfony à Vite ou Rsbuild et qui a pris le relais de Webpack Encore en 1.0 fin août, publie sa 1.3.0. C'est le premier billet depuis la 1.0 : il reprend aussi trois changements des 1.1.0, 1.1.3 et 1.2.0 qui n'avaient eu droit qu'à une ligne de changelog.
Le correctif qui compte : CSP à nonce
Avec une Content Security Policy à base de nonce (script-src 'nonce-...',
celle que met en place NelmioSecurityBundle), les balises
<link rel="modulepreload"> produites par Reprise, et les en-têtes HTTP
Link: équivalents, ne portaient pas de nonce. Le navigateur les bloquait ;
un module dont le préchargement est bloqué ne se charge pas ; l'application
restait sans JavaScript.
Depuis la 1.3.0 (PR #134 et #149, Hugo Alliaume) :
- le
noncepassé àreprise_entry_script_tags()viaattributes, ou posé globalement dansscript_attributes, atteint les liensmodulepreloadet leur en-tête ; les autres attributs restent sur la balise<script>; RenderAssetTagEventest aussi émis pour ces liens, avec un typemodulepreload($event->isModulepreload()) ;- l'en-tête
Link:recopienonce,integrityetcrossorigindepuis la balise finale, après les listeners. Avant, il les recalculait depuisentrypoints.json: un listener qui les modifiait désynchronisait l'en-tête, et le navigateur écarte un préchargement qui ne correspond pas.
Une course en production
Après chaque compilation, Reprise réécrit entrypoints.json et manifest.json.
L'écriture directe vide d'abord le fichier : une requête PHP tombant à ce
moment lisait un fichier vide et levait une JsonException. Les deux fichiers
sont désormais écrits à côté puis renommés sur la cible, avec repli sur
l'écriture directe si le renommage échoue (Windows peut le refuser quand un
autre processus tient le fichier).
Le confort en développement
- Stimulus : le module
virtual:symfony/controllersétait généré une fois au démarrage. Ajouter un contrôleur, basculerstimulusFetch: 'lazy'ou uncomposer require symfony/ux-*qui modifiecontrollers.jsonimposait de relancer le serveur. Vite et Rsbuild régénèrent maintenant le module, par un rechargement complet de la page, pas du remplacement à chaud. Les contrôleurs en.jsxet.tsxsont reconnus. - Rsbuild + Tailwind 4 :
@rsbuild/plugin-tailwindcsssurveille le dossier de sortie, que Reprise réécrit à chaque build, d'où une recompilation sans fin.outputPathet les fichiers de métadonnées sont ajoutés àwatchOptions.ignored, en fusionnant avec vos propres exclusions.
Rattrapé des versions précédentes
- 1.2.0 : l'option
metadataPathsortentrypoints.jsonetmanifest.jsondu dossier des assets, pour ne plus les pousser sur un CDN. Siasset()s'appuie sur le manifeste, mettre à jourframework.assets.json_manifest_path. AssetMapper reçoit l'équivalent en Symfony 8.2 (metadata_dir). - 1.1.3 : une entrée qui pointe sur une feuille de style ne produit plus de
JavaScript vide (qui donnait un
<script>en 404 et cassait le build avecintegrity). - 1.1.0 : l'option
inputde premier niveau de Vite 8.2 est lue aussi en développement.
Source : Symfony Reprise 1.3.0 released, Symfony, 28 septembre 2026.