←Tous les articles
Ven. 28 août 2026·5 min de lecture

🔁 Symfony Reprise 1.0 : Vite et Rsbuild remplacent Webpack Encore

Schéma Symfony Reprise : Vite ou Rsbuild en entrée, le plugin @symfony/reprise génÚre entrypoints.json et manifest.json, rendus ensuite par des fonctions Twig

📚 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-dev

Puis 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: true

strict_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 TwigSortie
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 EncoreSymfony 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