mini-css-extract-plugin

A Webpack 5 plugin that extracts imported CSS into separate files per chunk, with async loading, source maps, and on-demand delivery.

Tool
npm
v2.10.2
4,655 stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
62 /100 Good
Development Activity 28
Maintenance 48
Community 72
Maturity 60
Momentum 40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
79 /100 Good
Architecture 85
Code Quality 88
Innovation 62
Learning Curve 80

mini-css-extract-plugin is the standard way to pull CSS out of a Webpack 5 bundle and into its own .css files instead of inlining styles into JavaScript. It creates one output CSS file per JS chunk that imports styles, so stylesheets can be requested in parallel with scripts and cached independently across deploys.

Built on Webpack 5’s module and chunk-graph APIs rather than child-compiler hacks used by its predecessor (extract-text-webpack-plugin), it supports async/on-demand loading of CSS for code-split chunks, hot module replacement for standalone stylesheets and CSS Modules during development, and both automatic and manual conflict-order warnings when the same class is defined across multiple imported stylesheets.

The project is maintained by the core Webpack team (sokra, alexander-akait) and ships as both a plugin (registered in plugins) and a loader (referenced in module.rules) from a single package, with generated TypeScript declarations and an extensive Jest test suite covering HMR, attribute injection, ordering, and runtime chunk loading.

As of the current release the maintainers have flagged the project as deprecated in favor of Webpack’s now-native CSS support (experiments.css), though existing configurations continue to work unchanged and migration is opt-in per-rule.

What You Get

  • A MiniCssExtractPlugin class registered in webpack.config.js plugins, paired with MiniCssExtractPlugin.loader in module.rules to intercept CSS imports
  • Per-chunk CSS file output with configurable filename/chunkFilename templates, including function-based naming and content-hash based long-term caching
  • Async/on-demand loading of CSS for code-split (non-initial) chunks via a generated Webpack runtime module, including preload/prefetch link injection
  • Hot Module Replacement support for standalone stylesheets and CSS Modules locals during development, without needing HotModuleReplacementPlugin
  • Conflicting-order detection between chunks that import the same CSS in different sequences, with an ignoreOrder escape hatch for CSS-Modules-scoped projects
  • Named ES module exports for CSS Modules locals (esModule/namedExport), letting bundlers tree-shake unused class-name bindings

Common Use Cases

  • Extracting production CSS from a Webpack 5 app so styles load in parallel with scripts instead of being inlined and executed via JS
  • Splitting CSS per async route/chunk in a code-split single-page app so users only download stylesheets for the routes they visit
  • Combining with css-loader, postcss-loader, and sass-loader in a dev/prod dual configuration (style-loader in dev for fast HMR, mini-css-extract-plugin in prod for cacheable files)
  • Consolidating all CSS into one bundle via optimization.splitChunks cache groups with type: "css/mini-extract" for simpler <link> wiring
  • Server-side rendering setups that need to detect and avoid re-loading CSS already inlined or linked during SSR

Under The Hood

Architecture

The plugin hooks into Webpack 5’s compiler and compilation lifecycle rather than the bundle-time module wrapping used by its extract-text-webpack-plugin predecessor: src/index.js defines a CssModule/CssDependency pair registered per-compiler via getCssModule/getCssDependency (cached in a WeakMap keyed on the webpack instance so multiple integrations share one class), taps compilation.hooks.renderManifest to emit one CSS asset per chunk containing CSS-typed modules, and taps runtimeRequirementInTree for ensureChunkHandlers/hmrDownloadUpdateHandlers/prefetchChunkHandlers/preloadChunkHandlers to inject a generated CssLoadingRuntimeModule that creates <link> tags at runtime for async CSS chunks. src/loader.js is a separate pitching loader that either runs a child compiler (createChildCompiler) or, when experimentalUseImportModule is enabled, uses Webpack’s newer this.importModule API to execute the CSS-emitting module and hand its exported locals/dependencies back to the plugin via addDependency. A sortModules topological sort orders CSS modules per chunk group and falls back to a best-effort match with a compilation warning when import order conflicts across entry points.

Tech Stack

The package is plain CommonJS JavaScript compiled with Babel (@babel/cli/@babel/preset-env) into dist/, with hand-written TypeScript declarations generated separately via tsc --declaration --emitDeclarationOnly into types/. Its only runtime dependencies are schema-utils (for loader-options.json/plugin-options.json JSON-schema option validation) and tapable (SyncWaterfallHook for the beforeTagInsert/linkPreload/linkPrefetch public extension hooks); webpack itself is a peer dependency pinned to ^5.0.0. The dev toolchain runs Jest with jest-environment-jsdom and memfs for in-memory filesystem test fixtures, cross-env for platform-independent env vars, and standard-version for release automation.

Code Quality

Testing is extensive: 18 top-level Jest suites (HMR.test.js, runtime-option.test.js, ignoreOrder-option.test.js, hooks.test.js, validate-plugin-options.test.js, and more) plus a test/cases directory of full webpack-config fixture builds compared against snapshots, run under test:coverage with collectCoverageFrom="src/**/*.js". Options are validated at runtime through schema-utils against committed JSON schemas rather than ad hoc checks, giving structured, descriptive validation errors. Linting combines ESLint (eslint-config-webpack, run through the project’s own dogfooded config) with Prettier and cspell for spelling, all wired into a single npm run lint and enforced in GitHub Actions CI (nodejs.yml) alongside a separate dependency-review.yml workflow; a commitlint conventional-commit check also gates commits via Husky.

What Makes It Unique

Unlike its predecessor, it avoids spinning up a child compiler for every module by default when experimentalUseImportModule is available (auto-enabled from Webpack 5.52.0), instead executing CSS modules through Webpack’s native importModule API for a meaningful build-performance and memory improvement. It’s also one of the few Webpack plugins that generates its own runtime module (CssLoadingRuntimeModule) to teach the Webpack chunk-loading runtime how to fetch, dedupe, and hot-swap CSS <link> tags for async chunks, rather than only handling the synchronous asset-emission side of the problem — including deduping against <link>/<style> tags already present in the DOM at load time, which is what makes it usable for SSR use cases where critical CSS is inlined server-side.

Used by 35 apps in this directory

TypeScript
47%
AGPL 3.0

Grafana

Analytics · Monitoring

77,469

The open-source observability platform that unifies metrics, logs, and traces from any data source into dynamic, queryable dashboards.

View details
95
Repo Health
91
Technical
63
Dependency
Built with
TypeScript 47%
Go 47%
Updated 5 days ago
Go
62%
Apache 2.0

Harness Open Source

Code Editors · Developer Tools · Devops

38,684

A unified open source DevOps platform combining Git hosting, CI/CD pipelines, cloud development environments, and artifact registries in a single self-hosted system.

View details
90
Repo Health
79
Technical
64
Dependency
Built with
Go 62%
TypeScript 33%
Updated 6 days ago
Go
87%
MIT

Hatchet

AI Development · Automation · Developer Tools

8,174

A Postgres-backed orchestration engine for background tasks, AI agents, and durable workflows that replaces Redis queues and multi-datastore durable execution platforms with a single self-hostable service.

View details
88
Repo Health
83
Technical
67
Dependency
Built with
Go 87%
Updated 6 days ago
TypeScript
62%
EPL-2.0

Huly Platform

Collaboration · Project Management · Team Chat

27,978

Open-source all-in-one workspace that replaces Linear, Jira, Slack, and Notion for product and engineering teams.

View details
90
Repo Health
86
Technical
62
Dependency
Built with
TypeScript 62%
Svelte 34%
Updated 6 days ago
TypeScript
98%
Other

Kibana

Analytics · Monitoring

21,338

Your open source window into the Elastic Stack — query, visualize, and act on data stored in Elasticsearch with real-time dashboards, AI-assisted search, and automated alerting.

View details
98
Repo Health
87
Technical
63
Dependency
Built with
TypeScript 98%
Updated 5 days ago
TypeScript
39%
Apache 2.0

Label Studio

AI Development · Data Engineering

28,540

Label Studio is an open-source, multi-type data labeling platform that lets teams annotate images, text, audio, video, and time series data with a configurable XML-based UI and export annotations in formats ready for any ML framework.

View details
93
Repo Health
87
Technical
64
Dependency
Built with
TypeScript 39%
JavaScript 27%
Python 25%
Updated 6 days ago
TypeScript
94%
AGPL 3.0

Laudspeaker

Automation · Marketing

2,629

Open-source customer engagement platform for building visual, event-triggered messaging journeys across email, SMS, push, in-app, and webhooks.

View details
45
Repo Health
66
Technical
62
Dependency
Built with
TypeScript 94%
Updated 3 months ago
JavaScript
42%
Other

LimeSurvey

Forms Surveys

3,778

The world's most flexible open-source survey platform with 900+ templates, conditional logic, 80+ languages, and full GDPR compliance for any scale.

View details
86
Repo Health
62
Technical
62
Dependency
Built with
JavaScript 42%
PHP 36%
CSS 12%
Updated 5 days ago
TypeScript
51%
Other

Mattermost

Collaboration · Devops · Team Chat

39,418

Open core, self-hosted team collaboration with chat, AI agents, voice calling, and deep DevOps integrations — all under your control.

View details
96
Repo Health
87
Technical
65
Dependency
Built with
TypeScript 51%
Go 40%
Updated 5 days ago

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers