Introduction
En tant que développeurs front-end, nous sommes amenés à réaliser nos projets web en ayant à l’esprit un certain nombre de bonnes pratiques telles que :
- La compression des feuilles de styles CSS et la minification des scripts Javascript pour qu’ils soient le plus léger possible en production
- L’optimisation des images en réduisant leur poids sans altérer leur qualité
- Auto-générer des sprites d’images
- S’assurer que les scripts Javascript ne contiennent pas d’erreurs de syntaxe
- Retirer les alertes/console log en production
- etc …
Si nous voulons avoir une webapp optimisée, nous devons réaliser absolument toutes ces tâches. Des tâches répétitives, quelque soit le projet, et fastidieuses car elles ne se limitent pas seulement aux 4 citées en exemple plus haut.
Automatiser ce genre de tâches est donc devenu quasi-vital dans le but, d’une part, de gagner un temps considérable à ne plus tout faire manuellement et d’autre part, d’être sûr de l’optimisation du code livré en production (minification, obfusquation etc…). Tout cela en moins de temps qu’il ne faut pour préparer votre café préféré !
Si votre quotidien est synonyme de tâches à répétition et que vous avez cherché à un moment donné à les automatiser, vous avez forcément entendu parler de Grunt ou encore de Gulp qui s’imposent comme des références en la matière d’outils d’automatisation Javascript.
Outils Javascript d’automatisation
Les outils js d’automatisation des tâches s’appuient sur Node.js, une plateforme software écrite en Javascript orientée serveur qui fut créé il y a quelques années. Elle utilise le moteur V8 de Google Chrome qui va analyser/exécuter ultra-rapidement du code js et qui fonctionne suivant un modèle non bloquant (programmation asynchrone). Node.js a ouvert la voie, entre autres, à de nouveaux outils d’automatisation tel que Grunt et c’est une vraie chance pour nous autres développeurs front-end que d’avoir à notre disposition ce genre d’outils pour :
- déployer rapidement un serveur de développement
- rafraîchir sa page lorsque l’on modifie un fichier
- compiler les templates
- bouchonner les données renvoyées par un web service,
- supprimer tous les commentaires dans le code
- minifier les feuilles de styles
- obfusquer les scripts JS
- etc…
Il n’y a pratiquement pas de limites à ce que l’on peut faire !
Grunt
Grunt est un outil basé sur des tâches exécutées en ligne de commande qui va grandement accélérer nos workflows classiques de développement en réduisant notre effort lors de la préparation des sources pour les mises en production.
Dans la plupart des cas, sachez que lorsque vous effectuez manuellement une tâche, son équivalent automatique existe sous forme de plugin Grunt comme par exemple la minification et la concaténation de scripts.
Grunt est également capable de gérer des tâches qui ne sont pas forcément liées à Javascript comme la compilation CSS depuis SASS ou LESS.
Enfin sachez qu’il dispose d’une incroyable communauté de développeurs et d’une énorme base de plugins mise à jour très régulièrement. Vous n’êtes donc pas seul à vous lancer dans l’aventure !
Installation
Comme évoqué précédemment, Grunt est basé sur Node.js. De ce fait il doit être installé sur votre machine pour que Grunt puisse fonctionner. L’installation de Grunt se fait via le npm (Node Packet Manager), il suffit d’ouvrir votre invité de commandes et d’exécuter cette instruction pour installer Grunt :
$ npm install -g grunt-cli
Package.json
Package.json est un fichier à créer à la racine de votre projet, il va vous permettre de tracker et d’installer toutes les dépendances liées au développement. Ainsi, tous les membres de votre team disposeront des toutes dernières versions des dépendances. Ce qui en fin de compte permet de garder un environnement de développement constamment synchronisé.
{ "name": "Example", "description": "Un package de test", "version": "0.0.1", "private": "true", "author": "Prenom Nom ", "devDependencies": { "grunt": "^0.4.5" } }
$ npm install
La commande ci-dessus va dire à npm d’aller récupérer toutes les dépendances qui sont listées dans devDependencies puis de les installer dans le dossier node_modules. Dans cet exemple, si la commande réussie, Grunt version 0.4.5 ou supérieure sera installée localement dans le projet.
Gruntfile.js
Comme le fichier package.json, le fichier Gruntfile.js doit être placé à la racine du projet. Il contient toute la configuration des tâches automatiques à exécuter lorsque l’on exécute grunt depuis l’invité de commandes.
module.exports = function(grunt) { /* 1. Toute la configuration. * L'ordre n'a pas d'importance. */ grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), /* 2. La configuration du plugin cssmin pour la minification de css. * Une sous tâche build qui va minifier index.css dans style.css */ cssmin: { build: { src: 'app/css/index.css', dest:'build/css/style.css' } } }); /* Chargement du plugin * 3. On dit à Grunt que l'on compte utiliser le plugin grunt-contrib-cssmin. */ grunt.loadNpmTasks('grunt-contrib-cssmin'); /* Déclaration des tâches * On dit à grunt ce qu'il faut faire lorsque l'on execute "grunt" dans l'invité de commandes. */ grunt.registerTask('default', ['cssmin']); };
À partir de maintenant il n’y a plus qu’à exécuter la ligne de commande suivante dans notre invité de commandes pour minifier notre feuille de style :
$ grunt
Et voila ! Notre feuille de style a été minifiée en une fraction de seconde.
Imaginez maintenant toutes les tâches que l’on peut automatiser exactement avec la même simplicité!
Pour vous en rendre compte, je vous invite à jeter un œil à l’impressionnant listing de plugins disponible pour Grunt. Pas moins de 3000 plugins pour faciliter notre quotidien.
Grunt est donc un outil très simple d’usage, qui consiste en un fichier de configuration js facilement lisible, dans lequel on paramètre les plugins que l’on souhaite utiliser pour automatiser nos tâches.
Sachez qu’il n’est pas le seul sur le marché…
La suite, dans la deuxième partie de ce dossier qui sera consacrée au petit nouveau, Gulp !