html-webpack-plugin

Generates and injects your webpack bundle tags into HTML files automatically, with zero configuration required.

Tool
npm
v5.6.8
10,718 stars
MIT License

Repository Health

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

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
80 /100 Excellent
Architecture 78
Code Quality 80
Innovation 82
Learning Curve 80

html-webpack-plugin is the standard webpack plugin for generating the HTML files that load your bundled JavaScript and CSS. Instead of hand-editing script and link tags every time an output filename or content hash changes, the plugin watches the compilation’s chunks and entry points and injects the right tags automatically — with zero configuration needed for a simple single-page app.

Beyond the zero-config default, it supports custom EJS/Handlebars/Pug templates, per-entry filenames for multi-page builds, favicon handling, and a set of typed tapable hooks (beforeAssetTagGeneration, alterAssetTags, afterTemplateExecution, beforeEmit, and more) that let a large ecosystem of companion plugins — subresource integrity, CSP headers, favicon generation, asset inlining — extend its output without patching webpack itself.

What You Get

  • Zero-config HTML generation for single-page apps — works immediately after new HtmlWebpackPlugin()
  • Custom template support via EJS, Handlebars, Pug, or a raw loader for full control over markup
  • Multi-page output with per-entry filename functions and chunks/excludeChunks filtering
  • Automatic favicon copying and <link rel="icon"> injection
  • Six ordered tapable hooks for deep customization by companion plugins
  • Cached child compilation so unchanged output isn’t re-emitted on every rebuild

Common Use Cases

  • Single-page app builds - front-end teams building an SPA get an index.html with correctly hashed script/link tags emitted automatically on every build, no manual editing needed.
  • Multi-page/multi-entry sites - projects with several entry points use per-entry filename functions and chunks filtering to emit one HTML file per page from a single webpack config.
  • Custom branded templates - teams with existing HTML templates (EJS, Handlebars, Pug) plug them in via template/templateContent to keep their own markup while still getting automatic asset injection.
  • Building companion webpack plugins - plugin authors hook into beforeAssetTagGeneration, alterAssetTags, or beforeEmit to add SRI hashes, CSP meta tags, or inline critical CSS without forking core.

Under The Hood

Architecture

The main HtmlWebpackPlugin class in index.js (~1,568 lines) hooks into webpack’s compiler via apply(compiler) and exposes six ordered tapable AsyncSeriesWaterfallHooks (beforeAssetTagGeneration, alterAssetTags, alterAssetTagGroups, afterTemplateExecution, beforeEmit, afterEmit) through a static getCompilationHooks() keyed off a WeakMap<Compilation, Hooks> so multiple plugin instances share one hook registry per compilation. Actual HTML generation is delegated to lib/cached-child-compiler.js and lib/child-compiler.js, which spin up a webpack child compiler using NodeTemplatePlugin/NodeTargetPlugin/LoaderTargetPlugin/EntryPlugin to compile the user’s template into a runnable module and execute it in a VM context to produce the final HTML string; lib/chunksorter.js orders entries in the output and lib/html-tags.js models the injected script/link/meta tags as reusable objects. Because the tapable hooks are the plugin’s entire public extension surface, a large ecosystem of downstream plugins (subresource-integrity, favicon, CSP plugins) depends directly on this child-compiler abstraction remaining stable.

Tech Stack

Written as plain CommonJS JavaScript with @ts-check and a hand-authored typings.d.ts for consumer typing rather than being written in TypeScript directly, so the package ships raw source with no build/transpile step. Runtime dependencies are minimal and targeted: tapable for the hook system, lodash for template interpolation, html-minifier-terser for optional output minification, and pretty-error for readable compiler error output. webpack (^5.20) and @rspack/core are both declared as optional peer dependencies, reflecting a recent push to support Rspack alongside webpack. Tooling around the package is comprehensive: Jest for tests, ESLint + Prettier + cspell for linting, Husky/lint-staged/commitlint for commit hygiene, and standard-version for releases, all wired into GitHub Actions CI.

Code Quality

Test coverage is extensive — spec/basic.spec.js alone runs to nearly 3,900 lines covering broad permutations of plugin options and output, alongside dedicated suites for incremental/watch caching (caching.spec.js), hot module replacement behavior (hot.spec.js), and an example-build regression suite that diffs generated output against fixtures using dir-compare. Errors are handled explicitly and formatted through a dedicated lib/errors.js module rather than swallowed, and every source file uses @ts-check with JSDoc type annotations checked against typings.d.ts via a posttest tsc run, giving most of the safety of TypeScript without a compile step. Naming is consistent and CI enforces lint plus the full test suite on every change.

API Design The public surface is intentionally small: a single constructor option object covers the common cases with sane defaults, so a bare new HtmlWebpackPlugin() works with no configuration at all. Options like chunks, excludeChunks, chunksSortMode, and a function-valued filename cover the large majority of multi-entry scenarios without needing to escape into hook code, while the six documented tapable hooks (mirrored in both a JSDoc block in index.js and the Hooks namespace in typings.d.ts) give advanced users typed, ordered extension points. This combination of a low floor and a well-documented, typed extension ceiling is what has let a wide ecosystem of independent companion plugins build on it without needing to fork or monkey-patch core behavior.

Used by 37 apps in this directory

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
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%
MIT

isoflow

Design Tools · Developer Tools

1,728

A React component that lets developers embed a fully-featured, isometric network diagram editor directly into their applications.

View details
41
Repo Health
72
Technical
70
Dependency
Built with
TypeScript 98%
Updated 1 years ago
TypeScript
77%
Other

Joplin

Note Taking

56,853

The privacy-first, open-source note-taking app with end-to-end encrypted sync, AI assistance, and a powerful plugin ecosystem across every platform.

View details
93
Repo Health
87
Technical
60
Dependency
Built with
TypeScript 77%
JavaScript 14%
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
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
Clojure
57%
Other

Metabase

Analytics

49,827

The open-source BI platform that lets anyone ask questions and build dashboards without writing SQL — with an embedded analytics SDK and AI-powered query assistant included.

View details
95
Repo Health
84
Technical
62
Dependency
Built with
Clojure 57%
TypeScript 38%
Updated 5 days ago
TypeScript
85%
GPL 3.0

Notesnook

File Storage · Note Taking · Security

14,822

End-to-end encrypted, open-source note-taking where your data stays yours — even from the server.

View details
91
Repo Health
84
Technical
60
Dependency
Built with
TypeScript 85%
JavaScript 12%
Updated 5 days ago
Go
69%
Apache 2.0

open-code-review

Developer Tools · Devops

48,167

The AI code review agent born at Alibaba's scale — combining deterministic engineering with LLM intelligence for precise, token-efficient reviews.

View details
82
Repo Health
83
Technical
73
Dependency
Built with
Go 69%
JavaScript 12%
Updated 1 weeks 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