Webpack pour JavaScript (Node.js) : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Qu'est-ce que Webpack et pourquoi en a-t-on besoin ?

\n\n

Webpack est un puissant et flexible assembleur de modules (module bundler) pour les applications JavaScript, fonctionnant dans l'environnement Node.js. Sa tâche principale est de prendre de nombreux fichiers (JavaScript, CSS, images, polices et autres ressources), d'analyser leurs dépendances et de les regrouper en un ou plusieurs bundles optimisés, prêts à être utilisés dans le navigateur.

\n\n

Dans le développement web moderne, les applications sont rarement constituées d'un seul fichier. Généralement, le code est divisé en de nombreux modules, des bibliothèques externes (paquets npm) sont utilisées, ainsi que des préprocesseurs (SASS, LESS), TypeScript, JSX et d'autres technologies. Les navigateurs ne peuvent pas toujours traiter efficacement un tel nombre de fichiers et de dépendances. C'est là que Webpack intervient.

\n\n

Tâches principales de Webpack :

\n
    \n
  • Assemblage des modules : Regroupement de tous les fichiers JavaScript et de leurs dépendances en un ou plusieurs bundles.
  • \n
  • Transformation des ressources : Application de loaders pour transformer les fichiers (par exemple, SCSS en CSS, TypeScript en JavaScript, images en base64).
  • \n
  • Optimisation : Minification du code, suppression du code inutilisé (tree shaking), division du code en chunks (code splitting) pour le chargement différé.
  • \n
  • Gestion de l'environnement : Prise en charge des modes développement (development) et production (production) avec des configurations différentes.
  • \n
  • Serveur de développement : Serveur intégré pour le développement avec rechargement à chaud des modules (Hot Module Replacement — HMR).
  • \n
\n\n

Webpack est la norme de facto pour l'assemblage de projets JavaScript modernes, en particulier les applications React, Vue.js et Angular.

\n\n

Installation de Webpack

\n\n

Pour travailler avec Webpack, vous avez besoin de Node.js (version 12 ou supérieure) et d'un gestionnaire de paquets npm (ou yarn). L'installation se fait via npm. Il est recommandé d'installer Webpack localement dans chaque projet.

\n\n

Étape 1 : Initialisation du projet

\n
mkdir my-webpack-project\ncd my-webpack-project\nnpm init -y
\n\n

Étape 2 : Installation des paquets core

\n

Installez les deux paquets principaux : webpack et webpack-cli (interface en ligne de commande).

\n
npm install --save-dev webpack webpack-cli
\n\n

Étape 3 : Installation de webpack-dev-server (optionnel, pour le développement)

\n
npm install --save-dev webpack-dev-server
\n\n

Étape 4 : Installation des loaders et plugins (exemple pour CSS)

\n
npm install --save-dev style-loader css-loader
\n\n

Après l'installation, une section devDependencies apparaîtra dans le fichier package.json avec les paquets installés.

\n\n

Démarrage rapide avec un exemple de code

\n\n

Créons un projet simple qui démontre le fonctionnement de base de Webpack.

\n\n

Structure du projet :

\n
my-webpack-project/\n├── dist/          # Dossier pour les fichiers assemblés (créé automatiquement)\n├── src/           # Code source\n│   ├── index.js   # Point d'entrée\n│   └── style.css  # Styles\n├── index.html     # Fichier HTML\n├── package.json\n└── webpack.config.js  # Configuration de Webpack
\n\n

1. Créer le fichier src/index.js :

\n
// src/index.js\nimport './style.css';\n\nfunction greet(name) {\n    console.log(`Bonjour, ${name}!`);\n}\n\ngreet('Webpack');
\n\n

2. Créer le fichier src/style.css :

\n
/* src/style.css */\nbody {\n    background-color: #f0f0f0;\n    font-family: Arial, sans-serif;\n}
\n\n

3. Créer le fichier index.html :

\n
<!DOCTYPE html>\n<html lang="fr">\n<head>\n    <meta charset="UTF-8">\n    <title>Démo Webpack</title>\n</head>\n<body>\n    <script src="dist/bundle.js"></script>\n</body>\n</html>
\n\n

4. Créer le fichier de configuration webpack.config.js :

\n
// webpack.config.js\nconst path = require('path');\n\nmodule.exports = {\n    entry: './src/index.js',\n    output: {\n        filename: 'bundle.js',\n        path: path.resolve(__dirname, 'dist'),\n    },\n    module: {\n        rules: [\n            {\n                test: /\\.css$/,\n                use: ['style-loader', 'css-loader'],\n            },\n        ],\n    },\n    mode: 'development',\n};
\n\n

5. Ajouter un script dans package.json :

\n
"scripts": {\n    "build": "webpack",\n    "dev": "webpack serve --open"\n}
\n\n

6. Lancer l'assemblage :

\n
npm run build
\n\n

Après l'exécution de cette commande, Webpack créera le dossier dist/ avec le fichier bundle.js, qui contient tout le code JavaScript et CSS. Ouvrez index.html dans le navigateur pour voir le résultat.

\n\n

Configuration de base de Webpack

\n\n

Le fichier webpack.config.js est le cœur de la configuration de Webpack. Examinons ses propriétés principales.

\n\n

entry (point d'entrée) — spécifie le fichier à partir duquel Webpack commence à construire le graphe des dépendances. Peut être une chaîne, un tableau ou un objet pour plusieurs points d'entrée.

\n\n

output (sortie) — détermine où et comment enregistrer le bundle assemblé. Propriétés principales :

\n
    \n
  • path — chemin absolu vers le dossier de sortie.
  • \n
  • filename — nom du fichier bundle. Vous pouvez utiliser des modèles comme [name].js ou [contenthash].js.
  • \n
  • clean: true — nettoie le dossier de sortie avant chaque assemblage (Webpack 5+).
  • \n
\n\n

module.rules (règles pour les modules) — un tableau de règles décrivant comment traiter différents types de fichiers. Chaque règle contient :

\n
    \n
  • test — une expression régulière pour faire correspondre les fichiers.
  • \n
  • use — une liste de loaders à appliquer (de droite à gauche ou de bas en haut).
  • \n
  • exclude — exclut les dossiers (par exemple, node_modules).
  • \n
\n\n

plugins — un tableau de plugins qui étendent les capacités de Webpack (par exemple, HtmlWebpackPlugin pour générer automatiquement HTML, MiniCssExtractPlugin pour extraire CSS dans des fichiers séparés).

\n\n

mode — définit le mode de fonctionnement : 'development' (développement) ou 'production' (production). En mode production, Webpack applique automatiquement des optimisations (minification, tree shaking).

\n\n

devServer — configuration du serveur de développement : port, hot (rechargement à chaud), static (dossier pour les fichiers statiques).

\n\n

Loaders (chargeurs) dans Webpack

\n\n

Les loaders transforment les fichiers avant de les ajouter au bundle. Ils permettent à Webpack de traiter non seulement JavaScript, mais aussi CSS, images, polices, TypeScript, etc.

\n\n

Loaders populaires :

\n
    \n
  • css-loader — interprète les directives @import et url() dans les fichiers CSS.
  • \n
  • style-loader — injecte les styles CSS dans le DOM via la balise <style>.
  • \n
  • sass-loader — compile SCSS/SASS en CSS.
  • \n
  • babel-loader — transpile le code JavaScript moderne (ES6+) en code compatible avec les anciens navigateurs via Babel.
  • \n
  • ts-loader ou awesome-typescript-loader — compile TypeScript en JavaScript.
  • \n
  • file-loader — copie les fichiers (images, polices) dans le dossier de sortie et retourne leur URL.
  • \n
  • url-loader — fonctionne comme file-loader, mais peut intégrer les petits fichiers en base64 directement dans le bundle.
  • \n
  • html-loader — exporte le HTML sous forme de chaîne et optimise les images dans les attributs src.
  • \n
\n\n

Exemple d'utilisation de plusieurs loaders :

\n
module.exports = {\n    module: {\n        rules: [\n            {\n                test: /\\.scss$/,\n                use: ['style-loader', 'css-loader', 'sass-loader'],\n            },\n            {\n                test: /\\.(png|jpg|gif)$/,\n                use: ['file-loader'],\n            },\n            {\n                test: /\\.js$/,\n                exclude: /node_modules/,\n                use: {\n                    loader: 'babel-loader',\n                    options: {\n                        presets: ['@babel/preset-env'],\n                    },\n                },\n            },\n        ],\n    },\n};
\n\n

Plugins dans Webpack

\n\n

Les plugins offrent des fonctionnalités supplémentaires que les loaders ne peuvent pas fournir. Ils peuvent intervenir à différentes étapes du processus d'assemblage.

\n\n

Plugins populaires :

\n
    \n
  • HtmlWebpackPlugin — crée automatiquement un fichier HTML et y ajoute les liens vers les bundles.
  • \n
  • MiniCssExtractPlugin — extrait le CSS dans des fichiers séparés (au lieu de l'injecter dans le DOM).
  • \n
  • CleanWebpackPlugin — nettoie le dossier de sortie avant l'assemblage (remplacé par output.clean dans Webpack 5).
  • \n
  • DefinePlugin — permet de définir des constantes globales accessibles dans le code (par exemple, process.env.NODE_ENV).
  • \n
  • ProvidePlugin — charge automatiquement des modules comme variables globales (par exemple, $ pour jQuery).
  • \n
  • CopyWebpackPlugin — copie des fichiers individuels ou des dossiers entiers dans le dossier de sortie.
  • \n
  • BundleAnalyzerPlugin — visualise la taille des bundles et de leurs dépendances.
  • \n
\n\n

Exemple d'utilisation de HtmlWebpackPlugin :

\n
const HtmlWebpackPlugin = require('html-webpack-plugin');\n\nmodule.exports = {\n    plugins: [\n        new HtmlWebpackPlugin({\n            template: './src/index.html',\n            filename: 'index.html',\n        }),\n    ],\n};
\n\n

Mode développement et mode production

\n\n

Webpack prend en charge deux modes principaux : développement et production. Chacun a ses propres paramètres et optimisations.

\n\n

Mode développement (development) :

\n
    \n
  • Le code n'est pas minifié.
  • \n
  • Les source maps sont ajoutées pour faciliter le débogage.
  • \n
  • Le rechargement à chaud des modules (HMR) est disponible.
  • \n
  • La vitesse d'assemblage est plus rapide.
  • \n
\n\n

Mode production (production) :

\n
    \n
  • Le code est minifié (par défaut via TerserWebpackPlugin).
  • \n
  • Le tree shaking est activé — suppression du code inutilisé.
  • \n
  • Les variables d'environnement process.env.NODE_ENV sont définies sur 'production'.
  • \n
  • Des optimisations supplémentaires sont appliquées (scope hoisting, etc.).
  • \n
\n\n

Exemple de configuration pour différents modes :

\n
module.exports = (env, argv) => {\n    const isProduction = argv.mode === 'production';\n\n    return {\n        mode: isProduction ? 'production' : 'development',\n        devtool: isProduction ? 'source-map' : 'eval-source-map',\n        optimization: {\n            minimize: isProduction,\n        },\n    };\n};
\n\n

Code Splitting (division du code)

\n\n

Le code splitting permet de diviser le bundle en plusieurs fichiers (chunks) chargés à la demande. Cela améliore les performances de chargement initial de l'application.

\n\n

Méthodes de division du code :

\n
    \n
  • Points d'entrée (entry points) : Définir plusieurs points d'entrée dans la configuration.
  • \n
  • Prevent Duplication (prévention de la duplication) : Utiliser SplitChunksPlugin pour extraire les dépendances communes dans un chunk séparé.
  • \n
  • Dynamic Imports (importations dynamiques) : Utiliser la syntaxe import() pour le chargement asynchrone des modules.
  • \n
\n\n

Exemple d'importation dynamique :

\n
// src/index.js\nasync function loadModule() {\n    const module = await import('./module.js');\n    module.doSomething();\n}\n\ndocument.getElementById('btn').addEventListener('click', loadModule);
\n\n

Webpack détecte automatiquement les importations dynamiques et crée des chunks séparés pour elles.

\n\n

Tree Shaking (élimination du code mort)

\n\n

Le tree shaking est un processus de suppression du code inutilisé. Il fonctionne grâce aux importations et exportations statiques (ES6 modules).

\n\n

Conditions pour le tree shaking :

\n
    \n
  • Utiliser la syntaxe import / export (ES6 modules).
  • \n
  • Le mode doit être 'production'.
  • \n
  • Dans package.json, ajouter "sideEffects": false ou spécifier les fichiers avec effets de bord.
  • \n
\n\n

Exemple :

\n
// math.js\nexport function add(a, b) { return a + b; }\nexport function subtract(a, b) { return a - b; }\n\n// index.js\nimport { add } from './math.js';\nconsole.log(add(2, 3)); // La fonction subtract sera supprimée du bundle
\n\n

Source Maps (cartes sources)

\n\n

Les source maps permettent de mapper le code assemblé au code source original, ce qui facilite le débogage dans le navigateur.

\n\n

Types de source maps :

\n
    \n
  • eval — rapide, mais de qualité moyenne.
  • \n
  • source-map — qualité maximale, mais plus lent.
  • \n
  • cheap-source-map — plus rapide, mais sans informations sur les colonnes.
  • \n
  • inline-source-map — intègre la source map directement dans le bundle (augmente la taille).
  • \n
  • hidden-source-map — crée une source map, mais ne l'ajoute pas au bundle.
  • \n
\n\n

Configuration :

\n
module.exports = {\n    devtool: 'source-map',\n};
\n\n

Variables d'environnement

\n\n

Webpack permet de passer des variables d'environnement via la ligne de commande et de les utiliser dans la configuration.

\n\n

Exemple :

\n
// webpack.config.js\nmodule.exports = (env) => {\n    console.log('API URL:', env.API_URL);\n    return {\n        // ...\n    };\n};\n\n// Commande : npx webpack --env API_URL=https://api.example.com
\n\n

Pour utiliser les variables d'environnement dans le code de l'application, on utilise DefinePlugin :

\n
const webpack = require('webpack');\n\nmodule.exports = {\n    plugins: [\n        new webpack.DefinePlugin({\n            'process.env.API_URL': JSON.stringify('https://api.example.com'),\n        }),\n    ],\n};
\n\n

Webpack Dev Server

\n\n

Webpack Dev Server est un serveur de développement intégré qui offre :

\n
    \n
  • Rechargement automatique du navigateur lors des modifications de fichiers.
  • \n
  • Rechargement à chaud des modules (HMR) — mise à jour des modules sans rechargement complet de la page.
  • \n
  • Prise en charge du routage côté client (historyApiFallback).
  • \n
  • Proxy pour les requêtes API.
  • \n
\n\n

Configuration de base :

Recommendations