04.2 - Symfony : Installation du module Webpack Encore
Objectifs
- ✅ Gérer et installer un gestionnaire de dépendances avec Node
- ✅ Configurer Webpack Encore
Introduction
Cette quête t'es utile si tu travailles avec une version de Symfony inférieure à 6.3. Pour les versions supérieures, nous te recommandons d'utiliser la quête suivante :
Dans les quêtes précédentes, tu as installé un nouveau projet Symfony. Les dépendances PHP du framework ont été installées avec composer, mais il te manque encore quelques outils côté front.
Tu vas y remédier à l’aide de Webpack.
Webpack est un outil apportant beaucoup de fonctionnalités pour charger et traiter automatiquement les assets. Il permet, entre autres, de :
- compiler tous les fichiers JS (les tiens ou les librairies externes) en un seul fichier, en optimisant les éventuelles duplications de code
- automatiser la compilation du SCSS vers le CSS
- minifier automatiquement les fichiers pour la production (gain de performance)
...et plein d’autres choses !
Webpack est extrêmement utilisé dans la communauté JavaScript, mais la gestion des assets est également une problématique au niveau de PHP, notamment sur de gros projets. S'il existe d’autres outils permettant d’améliorer le workflow de traitement des assets (grunt, gulp, bower…), Webpack est actuellement le plus populaire.
Webpack c’est bien, mais c’est tout de même assez complexe, surtout pour des développeurs n’ayant pas l’habitude de travailler en JS. C’est pour cela que Symfony propose Webpack Encore, une librairie permettant de faciliter la configuration de Webpack et son intégration au sein de Symfony.
Sommaire
Installation du module Symfony Encore
Pour installer Webpack encore, lance simplement via composer :
bashcomposer require symfony/webpack-encore-bundle
Un fichier webpack.config.js a été créé, ainsi qu'un répertoire assets/ à la racine du projet (où tu placeras maintenant tous tes assets (CSS, JS, fonts, images statiques…). Mais avant d'aller plus loin, il faut équiper ta machine.
Installation des outils Javascript
Remarque : dans cette quête, tu utiliseras Yarn, qui est un gestionnaire de paquet pour les librairies Javascript (le pendant de Composer dans le monde JS !). Il se base sur le fichier package.json dans lequel seront listées les dépendances JS et CSS du projet tel qu'on le trouve dans le fichier composer.json avec les dépendances PHP. Cependant en JS, il existe plusieurs gestionnaires de paquets, dont NPM (le plus connu) et Yarn. Ce dernier, Yarn, est l’outil recommandé par Symfony dans la documentation officielle. Les deux sont équivalents (et compatibles avec Symfony) mais si tu commences un projet avec l’un, il ne faut plus que tu changes en cours de route, au risque d’avoir des conflits. De même, si tu travailles sur un projet à plusieurs, il faut que tout le monde utilise bien le même gestionnaire. C'est pour cela que tu vas utiliser exclusivement Yarn pour la suite.
À propos de Node
Node est un environnement d’exécution JavaScript qui s'installe côté serveur et non dans le navigateur. Orienté événements, il permet d'éxecuter des tâches asynchrones, lancer un serveur HTTP, parcourir et manipuler des fichiers, etc. Node est assez "bas niveau" et il existe tout un écosystème d'outils, librairies et frameworks venant se greffer dessus. Il sert principalement aux développeurs JS à faire du back.
Avant d'aller plus loin, vérifie que tu ne possèdes pas déjà une version de node en tapant dans ton terminal node -v. Cette action te renverra quelque chose comme v18.12.1 ou alors un message d'erreur. Dans le premier cas, pour savoir si tu as une version récente, compares le résultat obtenu avec les versions actives et/ou courantes du logiciel présentées ici : Node Releases. Si tu utilises des versions d'outils obsolètes, tu risques fortement d'avoir soit une experience dégradée, soit des erreurs à l'utilisation !
Rappel important : l'acronyme LTS signifie Long Term Strategy. C'est la version de Node qu'il est conseillé d'installer.
À toi de jouer !
Les étapes d'installation vont être les suivantes. 1/ Installation de NVM (Node Version Manager) 2/ Installation de Node et NPM avec NVM 3/ Installation de Yarn avec NPM
Sélectionne l'onglet correspondant à ton OS ci-dessous et suis les instructions indiquées.
1. NVM (Node Version Manager)
À la page https://github.com/coreybutler/nvm-windows/releases, tu trouveras l'accès pour télécharger la dernière version de l'installeur nvm-setup.zip.
Télécharge et décompresse le fichier zip et lance le programme nvm-setup.exe qui va s'occuper d'installer nvm.
2. Installation de Node et NPM
Comme tu l'as vu en début de cette quête, il est fortement recommandé d'utiliser la version Active LTS de Node. Vérifie quelle est la version actuellement en cours à la page https://nodejs.org/en puis, dans un PowerShell (avec accès admin - touches [Windows + X]), sers-toi de nvm pour l'installer avec la commande nvm install <version> en remplaçant
Exemple pour la version 20 :
nvm install 20
À la fin de l'installation, tu es invité à saisir la commande nvm use <version_installée> (exemple : nvm use 20.9.0) pour l'activer.
Tu peux vérifier que tu as bien Node et NPM avec node -v et npm -v.
3. Installation de Yarn
Dernière étape, installe Yarn avec NPM.
La commande à exécuter avec npm est disponible sur la documentation https://classic.yarnpkg.com/en/docs/install/. Tu dois y trouver quelque chose comme ceci
sh npm install --global yarn
Vérifie avec yarn -v.
Note Essaie d'accéder à Yarn avec Gitbash (que tu utilises régulièrement maintenant). Si aux retours des commandes
node -v,npm -vouyarn -vtu obtiens command not found, c'est qu'il te faut ajouter le chemin vers le répertoire /nodejs à tes variables d'environnement. Ajoute à la variable PATH l'entréeC:\Program Files\nodejset cela devrait suffire. Il se peut cependant que tu aies à adapter le chemin en fonction de la configuration de ta machine.
Et voilà ! 🎉
Voici un petit tuto récapitulatif pour NVM, Node et NPM si tu as rencontré des problèmes à l'installation https://docs.microsoft.com/fr-fr/windows/dev-environment/javascript/nodejs-on-windows.
1. NVM (Node Version Manager)
Suis cette ressource qui te guidera pour télécharger la dernière version de nvm.
(Tu trouveras la commande curl à la section Install & Update Script.)
https://github.com/nvm-sh/nvm#installing-and-updating
Lorsque l'installation de nvm est terminée, pense à ⚠️ ouvrir un nouveau terminal, puis lance la commande nvm -v pour vérifier que tout s'est bien passé. La version de nvm s'affiche, tu peux passer à l'étape suivante.
2. Installation de Node et NPM
Comme tu l'as vu au début de cette quête, il fortement recommandé d'utiliser la version Active LTS de Node. Vérifie quelle est la version actuellement en cours à la page https://nodejs.org/en puis sers-toi de nvm pour l'installer avec la commande nvm install <version> en remplaçant
Exemple pour la version 20 :
nvm install 20
À la fin de l'installation, nvm t'indique quelles versions majeures et mineures de Node et NPM ont été téléchargées. Tu peux vérifier que tout est ok avec node -v et npm -v.
Note Il est parfois nécessaire d'ouvrir un nouveau terminal à chaque étape pour prendre en compte les installations. De plus, si tu avais déjà une version de Node, tu dois peut-être lancer la commande
nvm use <version_installée>(exemple :nvm use 20.9.0) pour activer cette dernière.
3. Installation de Yarn
Dernière étape, installe Yarn avec NPM.
La commande à exécuter avec npm est disponible sur la documentation https://classic.yarnpkg.com/en/docs/install/. Tu dois y trouver quelque chose comme ceci
sh npm install --global yarn
Vérifie avec yarn -v.
Et voilà ! 🎉
Installation des dépendances du projet
💻 Ça y est, tu as tous tes outils, alors c'est parti ! Avec un terminal, déplace-toi à la racine de ton projet Wild Series et lance la commande :
yarn install
Cette commande (équivalente d'un composer install) va télécharger Encore et ses propres dépendances dans le dossier node_modules/ à la racine de ton projet. Ce répertoire est l'équivalent de vendor/ pour Composer. Par conséquent, tu l'auras compris, il ne faudra jamais versionner node_modules ni le modifier. Heureusement pour toi, à l’installation via composer (et donc via flex), le .gitignore de ton projet a déjà été mis à jour en conséquence.
Le fichier webpack.config.js généré à la racine du projet contient toute la configuration de Webpack. Par défaut, un certain nombre d’options sont déjà activées. Tu seras ensuite amené à le modifier légèrement pour personnaliser ton projet en fonction de tes besoins. Ouvre le fichier, voici quelques explications rapides des options disponibles par défaut :
-
setOutputPath() définit le chemin de sortie de tes fichiers. Ici, ce sera dans un dossier public/build/. Webpack va en effet compiler tes assets et les déplacer ici ; Ils seront donc bien accessibles par le navigateur puisque situés dans le dossier public/. Le dossier build/ ne doit cependant pas être versionné, mais rassure-toi, Symfony l'a déjà ajouté dans son .gitignore.
-
addEntry() définit le ou les points d'entrée de ton application. Les frameworks Javascript comme React, Vue ou Angular, favorisent la création de sites à un seul point d'entrée (Single Page Application ou S.P.A.), qui n'auront qu'un unique fichier JS en entrée. Les sites créés via des frameworks, comme Symfony, favorisent quant à eux les M.P.A (Multiple Pages Application), qui pourront avoir un fichier JS par page (car il serait inutile de charger du code JS non utilisé sur la page). Dans tes projets, tu vas sans doute être amené à créer plusieurs entrées (avec
.addEntry()), une par fichier JS/CSS, que tu vas vouloir utiliser. -
cleanupOutputBeforeBuild() supprime les précédents fichiers générés par Webpack avant de builder. En d'autres termes, à chaque fois que Encore va être appelé pour générer les assets, il va au préalable vider public/build/ avant de réécrire les nouveaux fichiers à cet endroit. C'est pour cela que tu ne dois jamais modifier les fichiers compilés se trouvant dans le dossier build/, car tes modifications seraient écrasées dès le prochain appel à Encore.
-
enableBuildNotifications() active des notifications système quand Webpack a réussi à compiler ou quand 'il y a des erreurs; tu verras donc un petit message apparaître sur ton écran.
-
enableVersioning permet d’activer certaines fonctionnalités quand le projet se trouve en production (minification des assets, versionning des fichiers, etc).
Retrouve toutes ces informations et bien d'autres concernant la configuration de Webpack Encore sur la documentation officielle de Symfony.
Pour rappel, "Webpack Encore" n'est qu'une surcouche dédiée à Symfony d'un outil déjà existant et très utilisé dans de nombreux projets Web nécessitant du javascript : "Webpack". N'hésites pas à te renseigner sur cet outil en général si la sphère JS t'intéresse.
Utilisation de Webpack Encore
💻 Rends-toi dans le dossier assets/.
Tu verras qu’il contient déjà des dossiers et fichiers, dont un fichier app.js, et un sous dossier styles/ avec un app.css.
💻 Modifie le fichier app.css pour ajouter par exemple un fond rouge au body (tu remettras bien entendu de la couleur de ton choix par la suite). Note que la modification ne sera visible qu'après avoir lancé Webpack, à partir du moment où tu reviendras sur ce que tu as fait lors de la quête précédente ;-)
Remarque
Tu verras aussi un fichier bootstrap.js dans ce dossier assets (également importer dans app.js). Attention celui-ci n'a rien à voir avec le framework CSS Bootstrap que tu connais déjà. En effet "bootstrap" qui signifie "amorçage" en français, est un terme fréquemment utilisé pour des fichiers d'initialisation. Ici il sert à initialiser Stimulus qui est une dépendance JS utile aux composants optionnels de Symfony (Symfony UX). Tu peux l'ignorer pour le moment.
💻 Ajoute dans ce fichier app.js, un message de test (que tu effaceras pas la suite)
console.log('Hello Webpack Encore !')
Lancer Webpack
Pour lancer Webpack, utilise une de ces lignes de commandes selon tes besoins (à lancer à la racine du projet) :
yarn watch
Compile et observe les changements. En d'autres termes, Webpack surveille en continu le dossier assets/ et recompile à la volée les assets dès qu'il y détecte la moindre modification sur les fichiers css, scss et js.
yarn dev-server
Ici, un serveur virtuel est utilisé pour compiler et servir les fichiers directement depuis la mémoire plutôt que depuis un dossier build. Cela permet l'utilisation du HMR (Hot Module Reload), qui recharge automatiquement ton navigateur quand tu modifies tes assets (fichier CSS ou JS). Pratique lors du développement !
yarn build
Compile les assets pour un environnement de production (les fichiers sont notamment minifiés pour en limiter la taille).
Quelle que soit la commande choisie, cela a pour effet de compiler les fichiers contenus dans assets/ et générer les fichiers finaux, utilisés par ton projet. Le dossier assets/ n’étant pas directement accessible par le navigateur, les fichiers sont générés par Webpack dans le dossier public/build/. Par exemple, tu travailleras sur un fichier app.scss dans assets/ et celui-ci sera compilé en un fichier app.css dans le répertoire /public/build.
Pour intégrer ces fichiers générés par Encore dans Symfony, il faudrait ajouter les chemins dans le HTML du fichier base.html.twig comme ceci par exemple (☝️ mais ne le fais pas) :
<link rel="stylesheet" href="/build/app.css">
<script src="/build/app.js"></script>
Eh oui, si tu choisis de modifier par exemple le setOutputPath de ton fichier webpack.config.js, tu devras ensuite reprendre à la main tous les chemins vers tes assets qui ne seraient plus dans le dossier build/. Pour pallier ce problème (et gérer également d’autres cas plus complexes, automatiquement), un helper Twig est disponible pour charger tes CSS et JS, respectivement {{ encore_entry_link_tags('app') }} et {{ encore_entry_script_tags('app') }} ou le app est le nom donné à ton fichier, sans l’extension .css ou .js
Voilà pourquoi tu trouves les blocs ci-dessous dans le fichier base.html.twig.
{% block stylesheets %}
{{ encore_entry_link_tags('app') }}
{% endblock %}
{% block javascripts %}
{{ encore_entry_script_tags('app') }}
{% endblock %}
[OPTIONNEL] Si tu souhaites que le HMR s'exécute également quand tu modifies un fichier Twig, ajoute les quelques lignes ci-dessous à ton fichier webpack.config.js en prenant soin de retirer au préalable la toute dernière ligne ~module.exports = Encore.getWebpackConfig();~
//supprime la dernière ligne
// module.exports = Encore.getWebpackConfig();
// et remplace par ceci
const fullConfig = Encore.getWebpackConfig();
fullConfig.devServer = {
watchFiles: {
paths: ['templates/**/*.html.twig'],
},
};
module.exports = fullConfig;
Tu trouveras encore plus d'explications et d'options sur la documentation de Webpack.
Retour sur la quête précédente
Avant d'aller plus loin, tu vas maintenant pouvoir mettre à jour ce que tu as fait sur la quête précédente avec ces nouveaux équipements et disposer ainsi de tes assets. Ouvre ton fichier templates/program/index.html.twig et modifie-le pour ceci :
{% extends 'base.html.twig' %}
{% block title %}Wild Series{% endblock %}
{% block body %}
<h1>{{ website }} index</h1>
{% endblock %}
Profites-en pour modifier aussi ta page d'accueil sur le même principe. L'idée ici, tu l'auras compris, est de faire hériter tes templates du fichier base.html.twig qui fait appel à ces fameux assets.
Dans ta console navigateur, tu devrais voir apparaître un message 'Hello Webpack Encore!'. Sur ton navigateur, les pages doivent toutes avoir un fond rouge.
Bravo ! Webpack avec Symfony fonctionne correctement !
Gestion des images
Les images font également partie des assets (on parle bien ici des images "décoratives" de ton site et non les fichiers uploadés par l'utilisateur). Ainsi, tu peux créer un sous-dossier images/ dans assets/. Pour que ces images soient buildées par webpack, il faut rajouter quelques lignes de configuration, que tu trouveras dans cette partie de la documentation : https://symfony.com/doc/current/frontend/encore/copy-files.html.
Ensuite, pour faire référence à ces images depuis Twig, utilise le helper :
<img src="{{ asset('build/path_to_image.png') }}" alt=""/>
Installation de librairies tierces avec Webpack Encore
Tu vas avoir besoin de charger un certain nombre de librairies dans tes projets, par exemple Bootstrap (cette fois-ci, on parle bien du framework CSS 🤪) et pourquoi pas un compilateur SCSS. Cela tombe bien, Encore possède des documentations ou des options par défaut pour ces différentes librairies.
Par exemple, pour utiliser SCSS dans ton projet, il te suffit de décommenter l’option .enableSassLoader() dans le fichier webpack.config.js.
Si tu lances Webpack juste après, tu vas avoir un message d’erreur t’invitant à installer les dépendances requises. Il faudra donc taper dans ton terminal :
yarn add sass-loader@latest sass --dev
Pour tester, renomme le fichier assets/styles/app.css en assets/styles/app.scss, puis modifie le fichier assets/app.js pour qu’il charge le fichier app.scss et non plus app.css:
Relance le build de Webpack, par exemple avec la commande
yarn watch
afin de voir si cela fonctionne. Normalement, un fichier app.css a dû se créer dans le dossier build/. Oui, rappelle-toi, la compilation du SCSS donne un fichier CSS qui, lui, va être interprétable par ton navigateur.
Tu peux aussi utiliser la commande
yarn dev-server
mais ne sois pas surpris si tu ne vois pas tes fichiers dans le dossier /build car ils vont être enregistrés ailleurs, dans un dossier temporaire utile au rafraîchissement du navigateur.
Modifie la couleur de fond en bleu dans le fichier SCSS. Puisque tu es en mode dev-server, la modification est détectée et la compilation se fait à la volée (en quelques secondes). Ton navigateur est mis à jour automatiquement, le fond doit maintenant être bleu ! Tu pourras ensuite enlever ce style douteux et mettre le tien à la place ;-)
Tu ne vois pas tes modifications ? Essaie de vider le cache de ton navigateur : CTRL + SHIFT + R afin qu'il télécharge à nouveau ton CSS ou désactive la mise en cache dans l'inspecteur à l'onglet Réseau > Désactiver le cache.
💪 Challenge
C’est le moment de donner de la couleur et de la vie à ton Wild Series ! Grâce à Webpack et Bootstrap (on parle bien du Framework web ce coup-ci !).
- Installe et configure Webpack Encore pour ton projet Wild Series.
- Charge SASS loader.
- Intègre le framework Bootstrap (en suivant la ressource).
Attention cependant, Boostrap 5, qui est installé par cette commande, est très récent. La ressource n'est pas très claire et il ne faut pas installer JQuery ni y faire référence pour faire fonctionner une version de Bootstrap > 5. Tu devras par contre sans doute installer la librairie popperjs (yarn add @popperjs/core).
- Crée une navbar dans un fichier _navbar.html.twig et inclus ce fichier dans une balise
<header>de ton fichier base.html.twig, afin que celle-ci s’affiche sur toutes les pages. Ajoute un simple lien permettant de revenir sur la page d’accueil (Utilise une navbar Bootstrap) - Surcharge les variables de couleurs primaires et secondaires en te basant sur ton styleguide.
- Modifie le projet pour que tous tes assets (JS, CSS) soient dans le dossier assets/, et lance le build de Webpack Encore.
- Modifie tes appels aux assets pour que ton site utilise ceux générés dans ton dossier build/.
- Héberge le projet sur Github avec tous les fichiers non suivis dans le .gitignore.
- Bonus : ajoute une favicon de ton choix dans le dossier images et appelle là. Hint : https://alsacreations.com/astuce/lire/59-icon-link-rel-favicon-ico-navigateur.html
Critères de validation
Symfony Encore est bien intégré dans le projet.
- Bootstrap est bien chargé dans tes pages (regarde les sources HTML et vérifie que tu n'as pas de 404 sur tes fichiers dans l'inspecteur > "Réseau").
- La navbar de Bootstrap s'affiche correctement sur tes pages
Ressources partagées sur cette quête
- si yarn install renvoie un "no such file or directory"https://stackoverflow.com/questions/46013544/yarn-install-command-error-no-such-file-or-directory-install
- Une vidéo avec un pas à pas pour installer bootstrap avec webpack de Symfonyhttps://yoandev.co/bootstrap-5-avec-symfony-5-et-webpack-encore
- Doc Ubuntu to install NodeJS properlyhttps://doc.ubuntu-fr.org/nodejs
- Pour changer les variables de couleurs de Bootstrap, il faut bien importer Bootstrap APRES l'appel de ses variables sur le fichier scss globalhttps://webdevdesigner.com/q/how-to-change-the-bootstrap-primary-color-38005/