Symfony : – Webpack

Symfony : – Webpack

Symfony intègre un outil puissant appelé Webpack Encore, qui simplifie la gestion des ressources front-end (JavaScript, CSS, images, etc.). Basé sur Webpack, un module bundler open source, Webpack Encore est spécialement conçu pour faciliter l’intégration avec Symfony. Il permet de regrouper, optimiser, et minifier les fichiers front-end, tout en les rendant facilement accessibles dans vos templates.

Webpack est un outil qui regroupe et optimise les ressources JavaScript, CSS, et bien plus encore. Webpack Encore, quant à lui, est un wrapper simplifié de Webpack, adapté aux besoins de Symfony. Avec Encore, vous pouvez facilement inclure des dépendances front-end, gérer vos assets, et produire des fichiers optimisés pour la production.

Avantages de Webpack Encore :

  • Simplification de la configuration Webpack.
  • Gestion des dépendances CSS et JavaScript via NPM.
  • Optimisation des performances (minification, regroupement).
  • Intégration directe avec Symfony via Twig.

Installation

a) Prérequis

Avant d’installer Webpack Encore, vous devez installer Node.js et son gestionnaire de paquets NPM. Ces outils sont nécessaires pour télécharger et gérer les dépendances front-end.

b) Installation de Webpack Encore

  1. Installez le bundle Webpack Encore :
    composer require symfony/webpack-encore-bundle
    
  2. Initialisez les dépendances front-end avec NPM : npm install
Après l’installation, plusieurs modifications seront apportées à votre projet : Un dossier assets/ sera créé pour contenir les fichiers front-end. Un fichier webpack.config.js sera généré à la racine pour configurer Webpack. Un fichier package.json sera créé pour référencer les dépendances JavaScript. Un répertoire node_modules/ sera ajouté pour stocker les packages front-end téléchargés. Structure des Fichiers Après Installation Contenu du dossier assets/ : app.js : Le fichier principal les dépendances JavaScript et CSS sont importées. styles/app.css : Le fichier principal pour vos styles CSS. bootstrap.js : Initialise l’application Stimulus (utilisée pour les interactions dynamiques). controllers.json et controllers/hello_controller.js : Liés à Stimulus pour des contrôleurs JavaScript modulaires. Utilisation de Webpack Encore a) Importer des ressources dans app.js Le fichier app.js sert de point d’entrée pour regrouper toutes les ressources front-end : // Importer les styles CSS import './styles/app.css'; // Démarrer l'application Stimulus import './bootstrap'; Toutes les dépendances CSS et JavaScript doivent être référencées ici pour être incluses dans les fichiers regroupés. b) Référencer les fichiers dans les templates Twig Après la compilation des fichiers, les assets sont accessibles via les fonctions Twig encore_entry_link_tags et encore_entry_script_tags . Ces fonctions injectent automatiquement les balises nécessaires pour inclure les fichiers CSS et JS dans vos pages. Exemple dans base.html.twig : <!DOCTYPE html> <html> <head> <title>{% block title %}Bienvenue{% endblock %}</title> {% block stylesheets %} {{ encore_entry_link_tags('app') }} {% endblock %} </head> <body> {% block body %}Contenu de la page{% endblock %} {% block javascripts %} {{ encore_entry_script_tags('app') }} {% endblock %} </body> </html> c) Construire les fichiers front-end Mode développement avec surveillance : Pendant le développement, utilisez la commande suivante pour surveiller les modifications des fichiers et les recompiler automatiquement : npm run watch Mode production (optimisé) : Avant de déployer l’application, exécutez une construction optimisée : npm run build Les fichiers générés se trouveront dans public/build/ : app.js : Regroupe tout le JavaScript. app.css : Regroupe tout le CSS. runtime.js : Contient le code utilitaire nécessaire à Webpack. Configuration de Webpack Encore Le fichier webpack.config.js à la racine du projet permet de personnaliser la configuration de Webpack Encore. Par défaut, il inclut les réglages nécessaires pour gérer JavaScript, CSS, images, et polices. Exemple de configuration de base : const Encore = require('@symfony/webpack-encore'); Encore .setOutputPath('public/build/') .setPublicPath('/build') .addEntry('app', './assets/app.js') .enableSingleRuntimeChunk() .cleanupOutputBeforeBuild() .enableSourceMaps(!Encore.isProduction()) .enableVersioning(Encore.isProduction()) .enablePostCssLoader(); module.exports = Encore.getWebpackConfig(); Ajouter des Dépendances Front-End Vous pouvez installer et inclure des bibliothèques CSS et JavaScript avec NPM. Par exemple : a) Installer Bootstrap : npm install bootstrap b) Ajouter Bootstrap dans app.js : // Importer les styles Bootstrap import 'bootstrap/dist/css/bootstrap.min.css'; // Importer les scripts Bootstrap import 'bootstrap'; c) Référencer dans les templates : Les balises Twig injecteront automatiquement les fichiers Bootstrap grâce à encore_entry_* . Bonnes Pratiques Minimiser les dépendances : Installez uniquement les packages nécessaires pour éviter de surcharger node_modules . Versioning : Utilisez l’option enableVersioning() pour invalider le cache en production. Nettoyer les fichiers : La commande cleanupOutputBeforeBuild() supprime les anciens fichiers générés avant chaque nouvelle construction. Documentation Symfony - Webpack Encore Webpack Official Documentation Node.js Official Download Webpack Encore est un outil puissant et flexible pour gérer le frontend dans une application Symfony. Il simplifie la gestion des assets tout en offrant des fonctionnalités avancées comme la minification, le versioning, et la prise en charge des dépendances front-end. En l’adoptant, vous pouvez améliorer la performance, la maintenabilité, et l’apparence de vos applications web.
par admin4460
Symfony
DéveloppementSystèmes & Réseaux Tests, Sécurité et CI/CDTests, Sécurité et CI/CDCet article présente une stratégie pour assurer la qualité, la sécurité et le déploiement continu d'une application basée sur Laravel 11 et React 18. La stratégie s'articule autour de quatre piliers fondamentaux : Tests complets et modernes : Une approche... 📍 Voir Plus ... DéveloppementSystèmes & Réseaux Déploiement étape par étape d’une application web sur O2SwitchDéploiement étape par étape d’une application web sur O2SwitchJe vais vous expliquer de façon détaillée comment déployer votre application développée localement (Laravel 11 + React 19 + Axios + MySQL + Bootstrap) sur un hébergement O2Switch. Suivez ces étapes dans l'ordre pour un déploiement réussi. Étape 1: Préparation de... 📍 Voir Plus ... DéveloppementSystèmes & Réseaux Déploiement et Maintenance d’Application WebDéploiement et Maintenance d’Application WebLe processus de mise en production et les mesures de suivi/maintenance pour notre application web (Laravel 11 en backend / React 19 en frontend, avec Axios, Bootstrap, base MySQL, hébergement O2Switch). L’objectif est de garantir un déploiement fluide, sécurisé et... 📍 Voir Plus ... 📍 VOIR PLUS ... 📍 Apple Bureautique CMS Cybersécurité Data Design Développement Angular HTML et CSS Java JavaScript Laravel Bug PHP React JS SQL Symfony E-commerce Gestion de projet L’intelligence artificielle Linux LMS Management Référencement Optimisation Marketing & Communication News et actualité DIGI Pédagogie & Formation Systèmes & Réseaux Windows
© MyCreaNet 2025 Mentions légales Plan du site Gestion des cookies Accessibilité Nom d'utilisateur Mot de passe Mot de passe oublié? Se connecter SuivreSuivreSuivreSuivreSuivre window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-L58BSN4YKD');
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/Divi\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-snippets-library-btns-wrap:before, .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-buttons-wrapper:before { content: "\45"; font-size: 27px; color: #ccffcc; font-family: ETModules; cursor: pointer; width: 28px; height: 27px; border-radius: 3px; padding-top: 1px; background-color: rgb(255, 255, 255, 0.2) !important; } .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-fb-form__group:nth-of-type(4) { display: none; } jQuery(document).ready(function($) { $(document).on('click', '.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-snippets-library-btns-wrap, .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-buttons-wrapper', function(event) { if (event.target !== event.currentTarget) { return; // Exit the function if the click is on a child element } var firstEditor = $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .CodeMirror').get(0)?.CodeMirror; if (!firstEditor) { return; } $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] textarea[name="code_to_render"]').click(); // Enable hidden codemirror var secondEditor = $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .CodeMirror').get(1)?.CodeMirror; if (!secondEditor) { return; } var content = firstEditor.getValue(); // Add a random nonce as the first line of content to prevent caching var nonce = Math.random().toString(36).substring(2, 15); content = '/* nonce:' + nonce + ' */\n' + content; secondEditor.setValue(content); }); }); (function() { var file = ["https:\/\/mycreanet.fr\/wp-content\/et-cache\/4964\/et-divi-dynamic-tb-6374-tb-469-tb-6415-4964-late.css"]; var handle = document.getElementById('divi-style-inline-inline-css'); var location = handle.parentNode; if (0===document.querySelectorAll('link[href="' + file + '"]').length) { var link = document.createElement('link'); link.rel = 'stylesheet'; link.id = 'et-dynamic-late-css'; link.href = file; location.insertBefore(link, handle.nextSibling); } })(); var et_link_options_data = [{"class":"et_pb_row_0_tb_body","url":"https:\/\/mycreanet.fr\/contact\/","target":"_self"}]; /* <![CDATA[ */ var tocplus = {"smooth_scroll":"1","visibility_show":"Afficher","visibility_hide":"Masquer","width":"Auto"}; /* ]]> */ /* <![CDATA[ */ var DIVI = {"item_count":"%d Item","items_count":"%d Items"}; var et_builder_utils_params = {"condition":{"diviTheme":true,"extraTheme":false},"scrollLocations":["app","top"],"builderScrollLocations":{"desktop":"app","tablet":"app","phone":"app"},"onloadScrollLocation":"app","builderType":"fe"}; var et_frontend_scripts = {"builderCssContainerPrefix":"#et-boc","builderCssLayoutPrefix":"#et-boc .et-l"}; var et_pb_custom = {"ajaxurl":"https:\/\/mycreanet.fr\/wp-admin\/admin-ajax.php","images_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/images","builder_images_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/includes\/builder\/images","et_frontend_nonce":"db7481e162","subscription_failed":"Veuillez v\u00e9rifier les champs ci-dessous pour vous assurer que vous avez entr\u00e9 les informations correctes.","et_ab_log_nonce":"f80146b76c","fill_message":"S'il vous pla\u00eet, remplissez les champs suivants:","contact_error_message":"Veuillez corriger les erreurs suivantes :","invalid":"E-mail non valide","captcha":"Captcha","prev":"Pr\u00e9c\u00e9dent","previous":"Pr\u00e9c\u00e9dente","next":"Prochaine","wrong_captcha":"Vous avez entr\u00e9 le mauvais num\u00e9ro dans le captcha.","wrong_checkbox":"Case \u00e0 cocher","ignore_waypoints":"no","is_divi_theme_used":"1","widget_search_selector":".widget_search","ab_tests":[],"is_ab_testing_active":"","page_id":"4964","unique_test_id":"","ab_bounce_rate":"5","is_cache_plugin_active":"no","is_shortcode_tracking":"","tinymce_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/includes\/builder\/frontend-builder\/assets\/vendors","accent_color":"#006666","waypoints_options":[]}; var et_pb_box_shadow_elements = []; /* ]]> */ /* <![CDATA[ */ var DiviBlogExtrasFrontendData = {"ajaxurl":"https:\/\/mycreanet.fr\/wp-admin\/admin-ajax.php","ajax_nonce":"e33712ddee","et_theme_accent_color":"#006666"}; /* ]]> */ /* <![CDATA[ */ var mejsL10n = {"language":"fr","strings":{"mejs.download-file":"T\u00e9l\u00e9charger le fichier","mejs.install-flash":"Vous utilisez un navigateur qui n\u2019a pas le lecteur Flash activ\u00e9 ou install\u00e9. Veuillez activer votre extension Flash ou t\u00e9l\u00e9charger la derni\u00e8re version \u00e0 partir de cette adresse\u00a0: https:\/\/get.adobe.com\/flashplayer\/","mejs.fullscreen":"Plein \u00e9cran","mejs.play":"Lecture","mejs.pause":"Pause","mejs.time-slider":"Curseur de temps","mejs.time-help-text":"Utilisez les fl\u00e8ches droite\/gauche pour avancer d\u2019une seconde, haut\/bas pour avancer de dix secondes.","mejs.live-broadcast":"\u00c9mission en direct","mejs.volume-help-text":"Utilisez les fl\u00e8ches haut\/bas pour augmenter ou diminuer le volume.","mejs.unmute":"R\u00e9activer le son","mejs.mute":"Muet","mejs.volume-slider":"Curseur de volume","mejs.video-player":"Lecteur vid\u00e9o","mejs.audio-player":"Lecteur audio","mejs.captions-subtitles":"L\u00e9gendes\/Sous-titres","mejs.captions-chapters":"Chapitres","mejs.none":"Aucun","mejs.afrikaans":"Afrikaans","mejs.albanian":"Albanais","mejs.arabic":"Arabe","mejs.belarusian":"Bi\u00e9lorusse","mejs.bulgarian":"Bulgare","mejs.catalan":"Catalan","mejs.chinese":"Chinois","mejs.chinese-simplified":"Chinois (simplifi\u00e9)","mejs.chinese-traditional":"Chinois (traditionnel)","mejs.croatian":"Croate","mejs.czech":"Tch\u00e8que","mejs.danish":"Danois","mejs.dutch":"N\u00e9erlandais","mejs.english":"Anglais","mejs.estonian":"Estonien","mejs.filipino":"Filipino","mejs.finnish":"Finnois","mejs.french":"Fran\u00e7ais","mejs.galician":"Galicien","mejs.german":"Allemand","mejs.greek":"Grec","mejs.haitian-creole":"Cr\u00e9ole ha\u00eftien","mejs.hebrew":"H\u00e9breu","mejs.hindi":"Hindi","mejs.hungarian":"Hongrois","mejs.icelandic":"Islandais","mejs.indonesian":"Indon\u00e9sien","mejs.irish":"Irlandais","mejs.italian":"Italien","mejs.japanese":"Japonais","mejs.korean":"Cor\u00e9en","mejs.latvian":"Letton","mejs.lithuanian":"Lituanien","mejs.macedonian":"Mac\u00e9donien","mejs.malay":"Malais","mejs.maltese":"Maltais","mejs.norwegian":"Norv\u00e9gien","mejs.persian":"Perse","mejs.polish":"Polonais","mejs.portuguese":"Portugais","mejs.romanian":"Roumain","mejs.russian":"Russe","mejs.serbian":"Serbe","mejs.slovak":"Slovaque","mejs.slovenian":"Slov\u00e9nien","mejs.spanish":"Espagnol","mejs.swahili":"Swahili","mejs.swedish":"Su\u00e9dois","mejs.tagalog":"Tagalog","mejs.thai":"Thai","mejs.turkish":"Turc","mejs.ukrainian":"Ukrainien","mejs.vietnamese":"Vietnamien","mejs.welsh":"Ga\u00e9lique","mejs.yiddish":"Yiddish"}}; /* ]]> */ /* <![CDATA[ */ var _wpmejsSettings = {"pluginPath":"\/wp-includes\/js\/mediaelement\/","classPrefix":"mejs-","stretching":"responsive","audioShortcodeLibrary":"mediaelement","videoShortcodeLibrary":"mediaelement"}; /* ]]> */ .wptpa_song_infrmtn, .wptpa_currenttime, .wptpa_duration, .wptpa_song, .wptpa_dwn_cnt, .wptpa_play_cnt, .wptpa_num, .wptpa_h2, .wptpa_ads{ font-family: 'Roboto', sans-serif; } .wptpa_player { background: #FFFFFF !important; } .wptpa_heading:before, .wptpa_heading:after { background: #000000 !important; } .wptpa_song_infrmtn { color: #000000 !important; } .wptpa_btn .wptpa_icon { fill: #555555; } .wptpa_btn.actv .wptpa_icon, .wptpa_btn:hover .wptpa_icon{ fill: #00D084; } .wptpa_btn:before{ background: #555555 !important; } .wptpa_player .wptpa_seek, .wptpa_player .wptpa_loader { background: #FFDA48 !important; } .wptpa_player .wptpa_seek span, .wptpa_progress { background: #CF2E2E !important; } .wptpa_ads, .wptpa_currenttime, .wptpa_duration { color: #FFFFFF !important; } .wptpa_volume_seek:before { background: #FFDA48 !important; } .wptpa_volume_value { background: #CF2E2E !important; } .wptpa_pllst_itm { border-bottom: 1px solid rgba(255, 255, 255, 0.25) !important; background: #23C5A3 !important; color: #000000 !important; } .wptpa_pllst_itm.crrnt, .wptpa_pllst_itm:hover { background: #FFDA48 !important; color: #000000 !important; } .wptpa_pllst_itm:last-child { border-bottom: 0px solid rgba(255, 255, 255, 0.25) !important; } .wptpa_bars, .wptpa_bars:before, .wptpa_bars:after{ background: #000000 !important; } .wptpa_line { border-color: #000000 !important; } .wptpa_pllst_itm .wptpa_icon { fill: #000000; } .wptpa_dwn_cnt, .wptpa_play_cnt { color: #000000 !important; } .wptpa_scroll_bar { background: #000000 !important; }