Module Bundler

Webpack

Webpack ist der praxiserprobte Module Bundler. Er verwandelt einen Graphen aus Modulen, Assets und Abhängigkeiten in optimierte Bundles – und wer Webpack versteht, für den werden alle anderen Build-Tools klarer.

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" } },
};
Erstveröffentlichung
2012
Modell
Dependency graph
Transformationen
Loaders
Erweiterungen
Plugins
Dev server
webpack-dev-server
Im Einsatz bei
Vielen Enterprise-Apps

Warum es wichtig ist

Warum Webpack immer noch wichtig ist

Beherrscht alles

JavaScript, CSS, Bilder, Fonts und mehr fließen durch eine einzige Pipeline, sodass der Graph vollständig und explizit ist.

Tief konfigurierbar

Loaders, Plugins und Optimierungsoptionen ermöglichen es, den Build präzise zu gestalten, wenn die Standardeinstellungen nicht ausreichen.

Leistungsstarke Optimierung

Code Splitting, Tree Shaking, Caching und Minifizierung sind mit feingranularer Kontrolle verfügbar.

Das Gesamtbild

Die drei Kernkonzepte hinter Webpack

Ein Dependency Graph, Loaders zur Dateitransformation und Plugins zur Erweiterung des Builds.

Der Graph

Entdecken

Ausgehend von den Entry Points folgt Webpack den Imports, um einen Graphen jedes Moduls und Assets zu erstellen.

Loaders

Transformieren

Funktionen, die eine Datei in ein Modul verwandeln, wie etwa das Kompilieren von TypeScript oder das Verarbeiten von CSS.

Plugins

Erweitern

Klinken sich in den Build-Lifecycle ein, um Aufgaben zu übernehmen, die über die Transformation einzelner Dateien hinausgehen.

Webpack auf einen Blick

Das Herzstück von Webpack

Entry

Die Startmodule, von denen aus Webpack den Dependency Graph aufbaut.

Output

Wo die Bundles geschrieben werden und wie sie benannt werden, inklusive Content Hashes.

Loaders

Transformieren Dateien, bevor sie in den Graphen gelangen, wie z. B. babel-loader oder css-loader.

Plugins

Erweitern den Build um HTML-Generierung, Umgebungsvariablen und mehr.

Code splitting

Dynamic import und splitChunks erstellen separate Bundles, die bei Bedarf geladen werden.

Tree shaking

Entfernt ungenutzte Exports, was ES modules und nebenwirkungsfreien Code voraussetzt.

Eine kurze Geschichte

Der Bundler, der das moderne Web mitgestaltet hat

  1. 2012

    Webpack veröffentlicht

    Tobias Koppers stellt einen Bundler vor, der jedes Asset als Modul behandelt.

    12
  2. 2014

    Webpack 1

    Der Bundler wird mit dem Aufstieg von React und Single-Page-Apps populär.

    14
  3. 2016

    Webpack 2

    Native ES modules und Tree Shaking werden eingeführt.

    16
  4. 2020

    Webpack 5

    Persistent Caching, Module Federation und Asset Modules erscheinen.

    20
  5. Heute

    Immer noch in Produktion

    Vite ist der moderne Standard, aber Webpack bleibt in bestehenden Apps weit verbreitet.

    Heute

Der vollständige Leitfaden

Webpack: Alles was Sie wissen müssen

Was ist Webpack?

Webpack ist ein Module Bundler. Ausgehend von einem oder mehreren Entry Points folgt es jedem Import und erstellt einen Graphen der Module und Assets Ihrer Anwendung. Anschließend transformiert und kombiniert es diese in eine geringe Anzahl von Bundles, die der Browser effizient laden kann.

Webpack wurde 2012 veröffentlicht und wurde zum Rückgrat des modernen Front-End-Builds. Vite ist mittlerweile der Standard für neue Projekte, da es schneller und einfacher ist, aber Webpack treibt immer noch eine enorme Anzahl von Produktionsanwendungen an. Seine Konzepte – der Dependency Graph, Loader, Plugins und Code Splitting – bilden das Vokabular jedes darauf folgenden Bundlers.

Entry und Output

Die zwei erforderlichen Konfigurationspunkte sind der Startpunkt des Graphen und der Zielort für die 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 ist das Startmodul. output.filename verwendet einen Content-Hash, damit Browser Bundles dauerhaft cachen und nur geänderte Dateien erneut herunterladen können. clean: true entfernt veraltete Dateien vor jedem Build.

Loader

Standardmäßig versteht Webpack nur JavaScript. Loader transformieren andere Dateitypen in Module, sobald diese in den Graph einfließen.

// 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",
      },
    ],
  },
};

Eine Regel besitzt ein test, um festzulegen, auf welche Dateien sie zutrifft, und ein use für den zu verwendenden Loader oder die Loader-Kette. Loader werden von rechts nach links ausgeführt, sodass ["style-loader", "css-loader"] zuerst das CSS parst und es anschließend in die Seite injiziert. Webpack 5 bietet zudem Asset Modules, welche den alten file-loader und url-loader für Bilder und Schriftarten ersetzen.

Plugins

Plugins erweitern den Build-Prozess selbst. Während ein Loader eine Datei transformiert, klinkt sich ein Plugin in den Lifecycle der Kompilierung ein.

// 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"),
    }),
  ],
};

Gängige Plugins generieren die HTML-Datei, definieren Umgebungsvariablen, kopieren statische Assets, analysieren die Bundle-Größe oder bereinigen den Output. Hier liegt der Großteil der Power von Webpack – und auch der Großteil seiner Komplexität.

Resolve und Aliase

Die resolve-Optionen steuern, wie Imports aufgelöst werden.

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

Mit extensions können Sie Imports ohne Dateiendung durchführen, und alias erstellt Kürzel, damit die Imports nicht mit ../../..-Pfaden überladen werden. Derselbe Alias wird normalerweise in der TypeScript-Konfiguration gespiegelt, damit der Editor mit dem Bundler übereinstimmt.

Code splitting und Tree shaking

Zwei Optimierungen sind entscheidend für die Performance in der Production.

Code splitting unterteilt das Bundle in Chunks, die bei Bedarf geladen werden. Dynamische import() sind hierfür das primäre Werkzeug, während splitChunks gemeinsam genutzte Abhängigkeiten automatisch extrahiert.

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

Tree shaking entfernt ungenutzte Exports, allerdings nur, wenn die Imports statisch analysiert werden können. Das bedeutet, es müssen ES-Module (import/export) anstelle von CommonJS verwendet werden sowie Module, die frei von Side Effects sind. Wenn Pakete in ihrer package.json als sideEffects: false markiert sind, kann Webpack diese aggressiver entfernen.

Der Development-Server

webpack-dev-server stellt den Build in der Entwicklung mit Hot Module Replacement bereit.

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

historyApiFallback ermöglicht clientseitiges Routing, indem index.html für unbekannte Pfade ausgeliefert wird, und proxy leitet API-Anfragen an dein Backend weiter. Der Dev-Server hält den Build im Arbeitsspeicher, sodass Rebuilds schnell erfolgen.

Wann man Webpack einsetzen sollte

Webpack ist nach wie vor eine starke Wahl, wenn Sie eine bestehende Anwendung warten, auf einen spezifischen Loader oder ein Plugin angewiesen sind oder fortgeschrittene Funktionen wie Module Federation für Micro-Frontends benötigen. Die Konfiguration ist zwar ausführlich, aber sobald man sie versteht, ist sie extrem leistungsfähig und vorhersehbar.

Für neue Projekte ist Vite in der Regel die bessere Standardwahl: schnellerer Start, einfachere Konfiguration und eine moderne Plugin-API. Es lohnt sich dennoch, Webpack zu lernen, da die Konzepte direkt übertragbar sind – die Plugin-Schnittstelle von Vite ist Rollup-kompatibel, und die gleichen Ideen von Graphen, Transforms und Splitting finden überall Anwendung.

Best Practices

  • Halten Sie die Konfiguration in separate common-, dev- und prod-Dateien oder -Funktionen aufgeteilt.
  • Verwenden Sie Content-Hashes in Dateinamen für langfristiges Caching.
  • Bevorzugen Sie ES modules, damit Tree Shaking funktioniert.
  • Teilen Sie umfangreiche Features mithilfe von dynamischen Imports auf.
  • Markieren Sie Pakete ohne Side-Effects, damit ungenutzter Code entfernt wird.
  • Spiegeln Sie resolve.alias in der TypeScript-Konfiguration wider.
  • Analysieren Sie das Bundle mit einem Visualisierer, wenn es unerwartet anwächst.

Häufige Fehler

  • Alles in einem einzigen Bundle ausliefern und niemals Code Splitting einsetzen.
  • CommonJS verwenden und sich wundern, warum Tree Shaking nicht funktioniert.
  • Einen Loader in der falschen Reihenfolge platzieren und dadurch verwirrende Fehlermeldungen erhalten.
  • Konfigurationen über verschiedene Umgebungen hinweg duplizieren, anstatt sie modular zu komponieren.
  • Aliasing in Webpack, aber nicht in TypeScript konfigurieren, sodass der Editor Fehlermeldungen ausgibt.
  • Ein Plugin hinzufügen, das eine bereits integrierte Funktion von Webpack 5 dupliziert.

Wie geht es weiter?

Webpack ist das historische Fundament moderner Build-Tooling-Landschaften und nach wie vor eine zuverlässige Wahl für bestehende Anwendungen. Vergleiche es bei neuen Projekten mit Vite, verschaffe dir einen Überblick über die npm-Pakete, die Loader und Plugins bereitstellen, und schau dir an, wie dieselben Konzepte in Turborepo für Monorepo-Builds implementiert sind. Lies anschließend die Webpack-Konfiguration deines Projekts und verfolge den Weg einer einzelnen Datei vom Entry bis zum Output.

Tree Shaking aktivieren

Tree Shaking benötigt die ES-Modul-Syntax. CommonJS require-Aufrufe sind zu dynamisch, sodass ungenutzte Exports nicht sicher entfernt werden können.

Bevorzugt
// math.js
export function add(a, b) {
  return a + b;
}
export function unused() {}

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

Code Splitting

Dynamic import erstellt einen separaten Chunk, der nur bei Bedarf geladen wird. Statische Imports packen alles in das initiale Bundle.

Bevorzugt
async function openEditor() {
  const { Editor } = await import(
    "./Editor"
  );
  return Editor;
}
Vermeiden
import { Editor } from "./Editor";
// heavy editor in the
// initial bundle for everyone

Häufig gestellte Fragen

Häufig gestellte Fragen

Keep learning

Related topics from the roadmap.

$ Lernen Sie jetzt

Bereit, Webpack zu lernen?

Unser interaktives Tutorial führt Sie Schritt für Schritt durch Webpack — mit Quizzen und echtem Code, den Sie im Browser ausführen können.