Module Bundler

Webpack

Webpack est le module bundler éprouvé. Il transforme un graphe de modules, d'assets et de dépendances en bundles optimisés — et le comprendre rend tout autre outil de build plus clair.

advanced14 min readUpdated 15 sept. 2026
webpack.config.js
js
// webpack.config.js
import path from "node:path";

export default {
  entry: "./src/index.js",
  output: {
    path: path.resolve(import.meta.dirname, "dist"),
    filename: "[name].[contenthash].js",
    clean: true,
  },
  module: {
    rules: [
      { test: /\.css$/, use: ["style-loader", "css-loader"] },
    ],
  },
  optimization: { splitChunks: { chunks: "all" } },
};
Première version
2012
Modèle
Graphe de dépendances
Transformations
Loaders
Extensions
Plugins
Dev server
webpack-dev-server
Toujours utilisé par
De nombreuses applications d'entreprise

Pourquoi c'est important

Pourquoi Webpack est toujours pertinent

Gère tout

JavaScript, CSS, images, polices et plus encore passent tous par un seul pipeline, rendant le graphe complet et explicite.

Hautement configurable

Les loaders, plugins et options d'optimisation vous permettent de façonner le build précisément lorsque les réglages par défaut ne suffisent pas.

Optimisation puissante

Le code splitting, le tree shaking, la mise en cache et la minification sont tous disponibles avec un contrôle granulaire.

Le tableau complet

Les trois concepts fondamentaux de Webpack

Un graphe de dépendances, des loaders pour transformer les fichiers et des plugins pour étendre le build.

Le graphe

Découvrir

À partir des points d'entrée, Webpack suit les imports pour construire un graphe de chaque module et asset.

Loaders

Transformer

Des fonctions qui transforment un fichier en module, comme la compilation TypeScript ou le traitement du CSS.

Plugins

Étendre

S'insèrent dans le cycle de vie du build pour des tâches dépassant la simple transformation de fichiers individuels.

Webpack en un coup d'œil

Le cœur de Webpack

Entry

Les modules de départ à partir desquels Webpack construit le graphe de dépendances.

Output

L'endroit où les bundles sont écrits et la manière dont ils sont nommés, incluant les hashs de contenu.

Loaders

Transforment les fichiers avant qu'ils n'entrent dans le graphe, comme babel-loader ou css-loader.

Plugins

Étendent le build avec la génération de HTML, des variables d'environnement et plus encore.

Code splitting

L'import dynamique et splitChunks créent des bundles séparés chargés à la demande.

Tree shaking

Supprime les exports inutilisés, ce qui nécessite des ES modules et du code sans effets de bord.

Un bref aperçu

Le bundler qui a bâti le web moderne

  1. 2012

    Sortie de Webpack

    Tobias Koppers introduit un bundler qui traite chaque asset comme un module.

    12
  2. 2014

    Webpack 1

    Le bundler devient populaire avec la montée de React et des applications mono-page.

    14
  3. 2016

    Webpack 2

    Arrivée des ES modules natifs et du tree shaking.

    16
  4. 2020

    Webpack 5

    Lancement du caching persistant, de la module federation et des asset modules.

    20
  5. Aujourd'hui

    Toujours en production

    Vite est le standard moderne, mais Webpack reste omniprésent dans les applications existantes.

    Aujourd'hui

Le guide complet

Webpack: Tout ce que vous devez savoir

Qu’est-ce que Webpack ?

Webpack est un module bundler. À partir d’un ou plusieurs points d’entrée, il suit chaque import pour construire un graphe des modules et des assets de votre application. Il les transforme ensuite et les combine en un petit nombre de bundles que le navigateur peut charger efficacement.

Sorti en 2012, Webpack est devenu la pierre angulaire du build front-end moderne. Vite est désormais le choix par défaut pour les nouveaux projets car il est plus rapide et plus simple, mais Webpack propulse toujours un nombre énorme d’applications en production. Ses concepts — le graphe de dépendances, les loaders, les plugins et le code splitting — constituent le vocabulaire de tous les bundlers qui ont suivi.

Entrée et sortie

Les deux éléments de configuration requis sont le point de départ du graphe et la destination des bundles.

// webpack.config.js
import path from "node:path";

export default {
  entry: "./src/index.js",
  output: {
    path: path.resolve(import.meta.dirname, "dist"),
    filename: "[name].[contenthash].js",
    clean: true,
  },
};

entry est le module de départ. output.filename utilise un hash de contenu afin que les navigateurs puissent mettre les bundles en cache indéfiniment et ne retélécharger que ceux qui ont été modifiés. clean: true supprime les fichiers obsolètes avant chaque build.

Loaders

Par défaut, Webpack ne comprend que le JavaScript. Les Loaders transforment d’autres types de fichiers en modules lorsqu’ils sont intégrés au graphe.

// loaders.js
export default {
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        exclude: /node_modules/,
        use: "ts-loader",
      },
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"],
      },
      {
        test: /\.(png|svg|woff2)$/,
        type: "asset",
      },
    ],
  },
};

Une règle possède un test pour définir les fichiers correspondants et un use pour le loader ou les loaders à appliquer. Les loaders s’exécutent de droite à gauche, donc ["style-loader", "css-loader"] analyse d’abord le CSS puis l’injecte dans la page. Webpack 5 propose également des asset modules, qui remplacent les anciens file-loader et url-loader pour les images et les polices.

Plugins

Les plugins étendent le processus de build lui-même. Alors qu’un loader transforme un fichier, un plugin s’insère dans le cycle de vie de la compilation.

// plugins.js
import HtmlWebpackPlugin from "html-webpack-plugin";
import { DefinePlugin } from "webpack";

export default {
  plugins: [
    new HtmlWebpackPlugin({ template: "./src/index.html" }),
    new DefinePlugin({
      "process.env.NODE_ENV": JSON.stringify("production"),
    }),
  ],
};

Les plugins courants permettent de générer le fichier HTML, de définir des variables d’environnement, de copier des assets statiques, d’analyser la taille du bundle et de nettoyer le dossier de sortie. C’est ici que réside la majeure partie de la puissance — et de la complexité — de Webpack.

Resolve et alias

Les options resolve contrôlent la manière dont les imports sont recherchés.

// resolve.js
export default {
  resolve: {
    extensions: [".ts", ".tsx", ".js"],
    alias: {
      "@": path.resolve(import.meta.dirname, "src"),
    },
  },
};

extensions vous permet d’importer des fichiers sans spécifier l’extension, et alias crée des raccourcis pour éviter que les imports ne soient encombrés de chemins ../../... Le même alias est généralement reproduit dans la configuration TypeScript pour que l’éditeur soit synchronisé avec le bundler.

Code splitting et tree shaking

Deux optimisations dominent les performances en production.

Le code splitting divise le bundle en morceaux (chunks) chargés à la demande. L’import() dynamique est l’outil principal, et splitChunks extrait automatiquement les dépendances partagées.

// split.js
export default {
  optimization: {
    splitChunks: { chunks: "all" },
  },
};

Le tree shaking supprime les exports inutilisés, mais seulement lorsqu’il peut analyser les imports statiquement. Cela implique l’utilisation de modules ES (import/export) plutôt que CommonJS, ainsi que des modules exempts d’effets de bord. Le fait de marquer des packages comme sideEffects: false dans leur package.json permet à Webpack d’élaguer le code de manière agressive.

Le serveur de développement

webpack-dev-server sert le build en développement avec le hot module replacement.

// devServer.js
export default {
  devServer: {
    port: 3000,
    hot: true,
    historyApiFallback: true,
    proxy: [{ context: ["/api"], target: "http://localhost:8787" }],
  },
};

historyApiFallback permet le fonctionnement du routage côté client en servant index.html pour les chemins inconnus, et proxy redirige les requêtes API vers votre backend. Le serveur de développement conserve le build en mémoire, ce qui rend les reconstructions rapides.

Quand utiliser Webpack

Webpack reste un choix solide lorsque vous maintenez une application existante, que vous dépendez d’un loader ou d’un plugin spécifique, ou que vous avez besoin de fonctionnalités avancées comme la module federation pour les micro-frontends. Sa configuration est verbeuse, mais elle est également extrêmement puissante et prévisible une fois maîtrisée.

Pour les nouveaux projets, Vite est généralement le meilleur choix par défaut : démarrage plus rapide, configuration simplifiée et API de plugins moderne. Apprendre Webpack reste pertinent car ses concepts sont directement transférables — l’interface de plugins de Vite est compatible avec Rollup et les mêmes notions de graphe, de transformations et de splitting s’appliquent partout.

Bonnes pratiques

  • Séparez la configuration en fichiers ou fonctions common, dev et prod.
  • Utilisez des hashs de contenu dans les noms de fichiers pour le caching à long terme.
  • Privilégiez les ES modules pour permettre le tree shaking.
  • Isolez les fonctionnalités lourdes à l’aide d’imports dynamiques.
  • Marquez les packages sans effets de bord (side-effect-free) pour que le code inutilisé soit supprimé.
  • Reflétez resolve.alias dans la configuration TypeScript.
  • Analysez le bundle avec un outil de visualisation lorsqu’il augmente de manière inattendue.

Erreurs courantes

  • Tout livrer dans un seul bundle sans jamais faire de code splitting.
  • Utiliser CommonJS et se demander pourquoi le tree shaking ne fonctionne pas.
  • Placer un loader dans le mauvais ordre et obtenir des erreurs confuses.
  • Dupliquer la configuration entre les environnements au lieu de la composer.
  • Configurer des alias dans Webpack mais pas dans TypeScript, créant ainsi un conflit avec l’éditeur.
  • Ajouter un plugin qui duplique une fonctionnalité native de Webpack 5.

Et après ?

Webpack est le fondement historique des outils de build modernes et reste un choix fiable pour les applications existantes. Comparez-le avec Vite pour vos nouveaux projets, explorez les packages npm qui fournissent des loaders et des plugins, et découvrez comment ces mêmes concepts sont appliqués dans Turborepo pour les builds de monorepos. Ensuite, analysez la configuration Webpack de votre projet et suivez le cheminement d’un fichier, de l’entrée (entry) jusqu’à la sortie (output).

Activer le tree shaking

Le tree shaking nécessite la syntaxe ES module. Les appels require de CommonJS sont trop dynamiques pour que les exports inutilisés puissent être supprimés en toute sécurité.

Préférer
// math.js
export function add(a, b) {
  return a + b;
}
export function unused() {}

// only add is bundled
Éviter
// math.js
module.exports = {
  add: (a, b) => a + b,
  unused: () => {},
};
// both shipped to the browser

Découper le code

L'import dynamique crée un chunk séparé chargé uniquement quand c'est nécessaire. Les imports statiques placent tout dans le bundle initial.

Préférer
async function openEditor() {
  const { Editor } = await import(
    "./Editor"
  );
  return Editor;
}
Éviter
import { Editor } from "./Editor";
// heavy editor in the
// initial bundle for everyone

FAQ

Foire aux questions

Keep learning

Related topics from the roadmap.

$ commencer à apprendre

Prêt à apprendre Webpack ?

Notre tutoriel interactif vous guide à travers Webpack pas à pas — avec des quiz et du vrai code que vous pouvez exécuter dans le navigateur.