đ Symfony Reprise 1.0 : Vite et Rsbuild remplacent Webpack Encore

đ Introduction
Webpack Encore a rendu un service Ă©norme Ă lâĂ©cosystĂšme Symfony : pendant prĂšs de dix ans, il a Ă©vitĂ© Ă des gĂ©nĂ©rations de dĂ©veloppeurs PHP de configurer Webpack Ă la main. Mais Webpack lui-mĂȘme a pris de lâĂąge face Ă Vite et aux bundlers basĂ©s sur Rust ou Go, et Encore restait figĂ© sur cette base.
Symfony Reprise, publiĂ© en version 1.0.0 le 26 aoĂ»t 2026, prend le relais. Ce nâest pas un nouveau bundler : câest une fine couche de compatibilitĂ© qui branche Vite ou Rsbuild sur Symfony, exactement au mĂȘme endroit oĂč intervenait Encore. Le composer.json du projet le dit sans dĂ©tour : « a reprise of Webpack Encore Bundle ».
Le passage de lâĂ©tat expĂ©rimental Ă la 1.0 nâest pas anodin non plus : lâAPI publique suit dĂ©sormais le versionnage sĂ©mantique et entre dans la promesse de compatibilitĂ© ascendante de Symfony, ce qui en fait un candidat sĂ©rieux pour un vrai projet, pas seulement pour un essai.
đ Quâest-ce que Symfony Reprise, concrĂštement ?
Reprise ne compile rien lui-mĂȘme. Il ajoute la « glue Symfony » quâun bundler gĂ©nĂ©rique ne fournit pas : gĂ©nĂ©ration de entrypoints.json et manifest.json, intĂ©gritĂ© des sous-ressources (SRI), et des fonctions Twig pour afficher les balises correspondant Ă un point dâentrĂ©e. Le travail de bundling reste entiĂšrement Ă la charge de Vite ou de Rsbuild.
ConcrĂštement, deux paquets Ă installer :
composer require symfony/reprise
npm install @symfony/reprise --save-devPuis le plugin sâenregistre dans la configuration du bundler choisi :
// vite.config.ts
import { defineConfig } from 'vite';
import Symfony from '@symfony/reprise/vite';
export default defineConfig({
build: {
rolldownOptions: {
input: {
app: './assets/app.js'
}
}
},
plugins: [Symfony({})]
});CĂŽtĂ© Rsbuild, la mĂȘme logique avec @symfony/reprise/rsbuild et lâentrĂ©e dĂ©clarĂ©e dans source.entry.
đ§© Rendre les assets en Twig
CÎté Symfony, la configuration par défaut tient dans config/packages/reprise.yaml :
reprise:
output_path: '%kernel.project_dir%/public/build'
builds: {}
strict_mode: true
cache: false
crossorigin: false
preload: truestrict_mode: true par dĂ©faut : Reprise lĂšve une exception si entrypoints.json ou lâentrĂ©e demandĂ©e est manquante, plutĂŽt que de rendre silencieusement une page sans assets. Et le rendu dans base.html.twig reprend presque Ă lâidentique la syntaxe dâEncore :
{% block stylesheets %}
{{ reprise_entry_link_tags('app') }}
{% endblock %}
{% block javascripts %}
{{ reprise_entry_script_tags('app') }}
{% endblock %}| Fonction Twig | Sortie |
|---|---|
reprise_entry_link_tags('app') | balises <link rel="stylesheet"> |
reprise_entry_script_tags('app') | balises <script type="module"> |
reprise_entry_css_files('app') | liste dâURL CSS brutes |
reprise_entry_js_files('app') | liste dâURL JS brutes |
reprise_entry_exists('app') | true/false |
Un point dâentrĂ©e optionnel se protĂšge simplement :
{% if reprise_entry_exists('checkout') %}
{{ reprise_entry_script_tags('checkout') }}
{% endif %}đ IntĂ©gritĂ©, CDN et Stimulus
Trois fonctionnalitĂ©s hĂ©ritĂ©es dâEncore, mais avec une configuration qui passe dĂ©sormais par le bundler plutĂŽt que par des mĂ©thodes enableXxx() :
Subresource Integrity. Symfony({ integrity: { enabled: command === 'build', algorithms: ['sha384'] } }) calcule les hashes sha256, sha384 ou sha512 de chaque fichier généré, exposés ensuite dans entrypoints.json sous la clé integrity et injectés automatiquement dans les balises Twig.
CDN et chemin public. publicPath pointe vers lâURL du CDN en production (https://mon-cdn.fastly.net/build/) et reste local en dev ; manifestKeyPrefix devient alors obligatoire pour que le manifeste garde des clĂ©s cohĂ©rentes.
Pont Stimulus. Symfony({ stimulus: 'assets/controllers.json' }) retrouve la logique du Stimulus Bridge dâEncore : les contrĂŽleurs sous assets/controllers/*_controller.js sâenregistrent automatiquement, hello_controller.js devenant lâidentifiant hello et admin/user_controller.js devenant admin--user. Le chargement paresseux se marque avec un commentaire /* stimulusFetch: 'lazy' */ dans le contrĂŽleur. Si votre projet utilise dĂ©jĂ Symfony UX, rien ne change cĂŽtĂ© Stimulus ou Twig Components : seule la brique de bundling change sous le capot.
đ Migrer depuis Webpack Encore
La documentation officielle fournit une table de correspondance quasi fonction par fonction. Les cas les plus fréquents :
| Webpack Encore | Symfony Reprise |
|---|---|
encore_entry_script_tags('app') | reprise_entry_script_tags('app') |
addEntry() / addEntries() | lâentry natif du bundler |
enableVersioning() | actif par défaut, non désactivable |
enableIntegrityHashes() | integrity: { enabled: true } |
copyFiles() | copy: [ ... ] |
enableStimulusBridge() | stimulus: 'assets/controllers.json' |
enableSassLoader() | installer le prĂ©processeur, lâimporter directement dans le CSS/JS |
enableReactPreset() | @vitejs/plugin-react (Vite) ou @rsbuild/plugin-react (Rsbuild) |
La bascule nâest donc pas un simple changement de nom de fonction : Encore configurait Webpack pour vous (Sass, PostCSS, TypeScript, React, alias, variables globales), alors que Vite et Rsbuild gĂšrent tout ça nativement ou via leurs propres plugins. Migrer un projet Encore existant revient Ă reconstruire sa configuration de build avec les outils natifs du bundler choisi, puis Ă ne garder de Reprise que la partie rendu Twig.
â ïž Quelques prĂ©cautions
PHP 8.4 minimum. Le composer.json de Reprise fixe la barre Ă PHP 8.4 et Symfony 7.4 ou 8.0 : pas question de lâinstaller sur un projet encore en PHP 8.2 ou Symfony 6.x sans monter de version au prĂ©alable.
Le projet vient tout juste dâatteindre sa 1.0. Les huit versions 0.x qui prĂ©cĂšdent (de 0.2.0 Ă 0.8.0) montrent une API qui a bougĂ© pendant la phase expĂ©rimentale. La 1.0.0 fige le contrat public, mais lâhistorique de production reste court comparĂ© aux dix ans dâEncore.
Ce nâest pas un remplacement automatique. Reprise ne migre rien pour vous : il faut réécrire la configuration de build (entrĂ©es, prĂ©processeurs CSS, TypeScript, alias) dans la syntaxe de Vite ou de Rsbuild. Sur un projet Encore avec beaucoup de enableXxx() custom, prĂ©voir un vrai chantier plutĂŽt quâun remplacement de dĂ©pendance.
đ Conclusion
Symfony Reprise fait exactement ce que son nom promet : une reprise, pas une rĂ©invention. La syntaxe Twig reste familiĂšre pour qui a utilisĂ© Encore, la configuration se dĂ©place simplement du PHP vers le fichier du bundler. Le vrai changement est en dessous : Vite et Rsbuild dĂ©marrent en une fraction du temps quâEncore mettait sur un projet volumineux, avec un vrai hot module replacement.
Pour un nouveau projet Symfony, Reprise avec Vite est aujourdâhui le choix par dĂ©faut raisonnable. Pour un projet existant sous Encore, la 1.0 donne enfin la stabilitĂ© dâAPI nĂ©cessaire pour planifier la migration sereinement, sans craindre de reconfigurer une deuxiĂšme fois dans les mois qui suivent.
đ Liens utiles
/faq
Questions fréquentes
Qu'est-ce que Symfony Reprise ?
+
Symfony Reprise est une fine couche d'intégration entre Symfony et les bundlers JavaScript modernes (Vite, Rsbuild). Elle génÚre entrypoints.json et manifest.json, et fournit des fonctions Twig pour rendre les balises