Minification est le processus de suppression de tous les caractères non essentiels du code source : espaces, tabulations, sauts de ligne et commentaires. La minification réduit la taille des fichiers JavaScript, CSS et HTML sans modifier la logique d'exécution du programme. Selon MDN Web Docs, la minification peut réduire la taille du fichier de 50 à 70 %, ce qui affecte directement la vitesse de chargement des applications et le First Contentful Paint (FCP).
Points clés
Minification est une transformation automatique du code source qui supprime tous les caractères n'affectant pas l'exécution du programme. Les espaces, tabulations, caractères de nouvelle ligne, commentaires et parenthèses redondantes sont supprimés ou raccourcis. La minification est appliquée aux fichiers JavaScript, CSS, HTML et, plus rarement, aux configurations JSON avant le déploiement en production.
L'objectif principal de la minification est de réduire la taille des fichiers transmis sur le réseau. Un fichier JavaScript de 300 Ko après minification peut occuper 120 à 150 Ko, ce qui réduit le temps de chargement de 200 à 400 ms sur une connexion 3G lente. Google PageSpeed Insights et Lighthouse recommandent directement de minifier le code : c'est l'un des critères d'évaluation des performances et des Core Web Vitals.
La minification fait partie intégrante du pipeline de build. Après la transpilation avec TypeScript ou Babel, le code passe par Tree Shaking (suppression des fonctions inutilisées), puis par un minificateur, et seulement ensuite est assemblé dans le bundle final. Dans les bundlers modernes (Webpack, Rollup, esbuild), la minification est effectuée par des plugins à l'étape finale du build.
| Élément | Exemple (avant) | Exemple (après) | Économie |
|---|---|---|---|
| Espaces et tabulations | let x = 5; | let x=5; | ~10–20% |
| Sauts de ligne | \n entre les lignes | tout sur une ligne | ~2–5% |
| Commentaires | // comment | supprimé | ~5–30% |
| Parenthèses redondantes | if ((x > 0)) | if(x>0) | ~1–3% |
Suppression des espaces et des sauts de ligne est la technique la plus simple et la plus évidente. L'analyseur du minificateur parcourt l'AST (Abstract Syntax Tree) et supprime tous les caractères d'espacement qui ne font pas partie de littéraux de chaîne. La plupart des minificateurs combinent en outre les opérateurs sur une seule ligne, ce qui permet des économies supplémentaires lors de la compression avec GZip ou Brotli.
Remplacement des noms de variables (mangling) est une technique plus agressive. Les variables locales et les paramètres de fonctions sont renommés en identifiants d'une seule lettre : a, b, c. Cela réduit la taille de 15 à 30 % supplémentaires. Terser et esbuild prennent en charge le mangling avec l'option de conserver certains noms (par exemple, l'API publique via mangle.props.reserved).
Dead code elimination (DCE) supprime les branches de code qui ne sont jamais exécutées. Le minificateur analyse les conditions qui sont toujours fausses (if (false)) et supprime les blocs correspondants. Une analyse plus avancée est effectuée à l'étape de Tree Shaking avant la minification, mais la DCE au niveau du minificateur détecte les cas locaux de code mort non détectés au niveau des modules.
Mangling renomme les variables locales et les paramètres de fonctions en identifiants courts (une ou deux lettres). Terser effectue le mangling basé sur la portée : les variables d'une même fonction obtiennent des noms courts uniques qui n'entrent pas en conflit avec les portées externes. L'option mangle.reserved permet de conserver certains noms — par exemple, les API publiques des bibliothèques.
Le mangling n'affecte pas les variables globales, les propriétés d'objets (sauf si mangle.props est activé) ni les noms de classes utilisés avec new. Pour protéger l'API publique d'une bibliothèque du mangling, utilisez mangle.props.reserved avec des expressions régulières : reserved: ["_prop", /^private_/]. Sans ce paramètre, le mangling peut casser une bibliothèque si du code externe accède aux propriétés d'un objet par leur nom.
// Code source
function calculateTotal(price, tax) {
var result = price + (price * tax);
// Retourner le montant total
return result;
}
var total = calculateTotal(100, 0.2);
console.log(total);// Après minification avec Terser
function calculateTotal(a, b){return a + a * b}
var c = calculateTotal(100, .2);
console.log(c);Dans le deuxième exemple, Terser a supprimé les commentaires, les espaces et les sauts de ligne, renommé price en a, tax en b, result en c. La taille est passée de 197 caractères à 79 — une économie de 60 %. La fonctionnalité du code est entièrement préservée : calculateTotal(100, 0.2) renvoie 120.
Terser est le minificateur JavaScript standard dans l'écosystème Webpack et la plupart des bundlers modernes. Terser prend en charge la syntaxe ES6+ (fonctions fléchées, async/await, spread), le mangling avec protection de l'API publique, les source maps et l'exécution parallèle avec le nombre de CPU. Depuis la version 5.16, Terser inclut des optimisations pour TypeScript — suppression des imports de type uniquement et des interfaces.
esbuild est un minificateur écrit en Go, intégré dans le bundler du même nom. esbuild effectue la minification 10 à 100 fois plus rapidement que Terser grâce au code natif et au traitement parallèle. Cependant, esbuild prend en charge moins d'optimisations : il n'effectue pas de mangling avec conservation des propriétés, ne supprime pas les imports de type uniquement et optimise les expressions de manière moins agressive.
// webpack.config.js — configuration de TerserPlugin
const TerserPlugin = require("terser-webpack-plugin");
module.exports = {
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true,
dead_code: true,
},
mangle: {
reserved: ["React", "Component"],
},
output: {
comments: false,
},
},
parallel: true,
}),
],
},
};La configuration de TerserPlugin comprend trois blocs principaux. compress gère l'optimisation des expressions : drop_console supprime console.log, drop_debugger supprime debugger, dead_code supprime les branches inaccessibles. mangle contrôle le renommage des variables avec reserved pour protéger les noms publics. parallel active le multithreading avec le nombre de CPU.
// esbuild : commande CLI pour la minification JS et CSS
// esbuild app.js --bundle --minify --outfile=dist/app.min.js
// esbuild app.css --bundle --minify --outfile=dist/app.min.css
const esbuild = require("esbuild");
esbuild.build({
entryPoints: ["src/app.js", "src/styles.css"],
bundle: true,
minify: true,
sourcemap: true,
target: ["es2015"],
outdir: "dist",
}).catch(() => process.exit(1));L'API esbuild accepte une configuration en une ligne. minify: true active la minification de JS et CSS. sourcemap: true génère des cartes de code pour le débogage. target définit le niveau ES minimum — esbuild transpile automatiquement le code moderne pour la version sélectionnée. esbuild est particulièrement efficace pour les projets où le temps de build est critique : pipelines CI/CD, Hot Module Replacement et prototypes rapides.
React Native utilise Metro Bundler — son propre bundler qui inclut la minification basée sur Terser. En mode production, Metro applique automatiquement la minification au bundle JavaScript de l'application. La configuration de la minification dans Metro se définit via metro.config.js dans la section transformer.minifierConfig. De plus, inline-require peut être désactivé pour réduire la taille du bundle sur iOS.
WebView dans les applications mobiles bénéficie également de la minification. Le HTML, CSS et JS chargés dans WebView doivent être minifiés avant d'être intégrés dans l'application ou chargés depuis le serveur. Pour les ressources locales (Assets), la minification est particulièrement importante — la taille de l'APK/IPA affecte directement le taux d'installation dans les magasins d'applications.
Hermes est un moteur JavaScript pour React Native développé par Facebook. Hermes effectue une compilation Ahead-of-Time (AOT) en bytecode, ce qui réduit le temps de démarrage de l'application de 30 à 50 %. Pour Hermes, la minification du bundle JavaScript est effectuée avant la compilation en bytecode avec Terser. Hermes prend en charge son propre format HBC (Hermes Bytecode), mais l'étape de minification JS reste nécessaire.
// metro.config.js — configuration de la minification
const defaultConfig = require("metro-config/src/defaults");
module.exports = require("metro-config").mergeConfig(
defaultConfig,
{
transformer: {
minifierConfig: {
compress: {
drop_console: true,
},
mangle: {
safari10: true,
},
},
},
}
);Metro avec minifierConfig.drop_console supprime tous les console.log du bundle de production React Native. Le paramètre mangle.safari10 empêche le renommage des identifiants qui cassent Safari 10 (iOS 10). Ceci est particulièrement important pour les applications prenant en charge les anciens appareils iPad et iPhone 5s avec iOS 10/11.
Minification et compression (gzip, brotli) sont des étapes d'optimisation différentes. La minification agit au niveau du code source et réduit le nombre de caractères avant l'envoi au serveur. La compression agit au niveau du protocole de transport et est appliquée par le serveur (nginx, Apache, CDN) lors de la transmission du fichier au client. La minification réduit la taille avant la compression, ce qui donne un double effet : gzip compresse des données déjà réduites.
Un fichier JavaScript de 300 Ko après minification — 120 Ko, après gzip — 35–40 Ko. Si seul gzip est appliqué au fichier non minifié, la taille sera de 55–70 Ko. Minification + gzip donne un résultat 30 à 40 % meilleur que gzip seul. Brotli (niveau 6) compresse 15 à 20 % plus efficacement que gzip après minification.
| Méthode | Niveau | Taille du fichier | Réduction |
|---|---|---|---|
| Fichier original | — | 300 Ko | 0% |
| Après minification | Code | 120 Ko | 60% |
| Après gzip (sans minification) | Transport | 65 Ko | 78% |
| Minification + gzip | Code + Transport | 38 Ko | 87% |
| Minification + Brotli | Code + Transport | 30 Ko | 90% |
Foire aux questions
UglifyJS est un outil de minification obsolète qui ne prend pas en charge la syntaxe ES6+. Terser est un fork d'UglifyJS avec prise en charge du JavaScript moderne. Tous les bundlers modernes (Webpack 5, Rollup, esbuild) utilisent Terser ou leurs propres minificateurs, tandis qu'UglifyJS n'est utilisé que dans les projets legacy.
Source maps sont des fichiers .map séparés non inclus dans le bundle de production. Le serveur ne doit fournir les source maps qu'aux développeurs autorisés (via l'en-tête Authorization). En production, les source maps ne sont pas chargées par le navigateur de l'utilisateur, donc elles n'affectent pas la taille du bundle.
Risque de casse existe avec un mangling agressif qui transforme les noms de propriétés d'objets. Si le code accède à des éléments DOM via des data-attributes ou utilise des chaînes JSON pour nommer des champs, le mangling peut renommer les propriétés publiques. La solution est d'exclure via mangle.reserved ou de désactiver le mangling pour certains espaces de noms.
La minification CSS offre moins de gain (15–25 %) que la minification JS, mais est obligatoire pour la conformité aux Core Web Vitals. Les minificateurs CSS suppriment les espaces, fusionnent les sélecteurs identiques, raccourcissent les couleurs hexadécimales (#ff0000 → #f00) et suppriment les @keyframes inutilisés. CleanCSS et esbuild sont des outils populaires pour la minification CSS.
Source maps (fichiers .map) lient le code minifié à la source originale. Dans Chrome DevTools et Safari Web Inspector, lorsque les source maps sont activées, les fichiers originaux sont affichés. Pour un fonctionnement correct, les source maps doivent être chargées sur le serveur (même en production) et activées via les outils de développement.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi