Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Simplifies creation of HTML files to serve your webpack bundles

License

NotificationsYou must be signed in to change notification settings

jantimon/html-webpack-plugin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

npmnodenpmtestsBackers on Open CollectiveSponsors on Open Collective

HTML Webpack Plugin

Plugin that simplifies creation of HTML files to serve your bundles

Install

Webpack 5

  npm i --save-dev html-webpack-plugin
  yarn add --dev html-webpack-plugin

Webpack 4

  npm i --save-dev html-webpack-plugin@4
  yarn add --dev html-webpack-plugin@4

This is awebpack plugin that simplifies creation of HTML files to serve yourwebpack bundles. This is especially useful forwebpack bundles that include a hash in the filename which changes every compilation. You can either let the plugin generate an HTML file for you, supplyyour own template usinglodash templates or use your own loader.

Sponsors

Thanks for supporting the ongoing improvements to the html-webpack-plugin!

Zero Config

Thehtml-webpack-plugin works without configuration.
It's a great addition to the⚙️ webpack-config-plugins.

Plugins

Thehtml-webpack-plugin provideshooks to extend it to your needs. There are already some really powerful plugins which can be integrated with zero configuration

Usage

The plugin will generate an HTML5 file for you that includes all yourwebpackbundles in the head usingscript tags. Just add the plugin to yourwebpackconfig as follows:

webpack.config.js

constHtmlWebpackPlugin=require("html-webpack-plugin");module.exports={entry:"index.js",output:{path:__dirname+"/dist",filename:"index_bundle.js",},plugins:[newHtmlWebpackPlugin()],};

This will generate a filedist/index.html containing the following

<!doctype html><html><head><metacharset="utf-8"/><title>Webpack App</title><scriptdefersrc="index_bundle.js"></script></head><body></body></html>

If you have multiplewebpack entry points, they will all be included withscript tags in the generated HTML.

If you have any CSS assets in webpack's output (for example, CSS extracted with themini-css-extract-plugin)then these will be included with<link> tags in the HTML head.

If you have plugins that make use of it,html-webpack-plugin should be ordered first before any of the integrated Plugins.

Options

You can pass a hash of configuration options tohtml-webpack-plugin.Allowed values are as follows:

NameTypeDefaultDescription
title{String}Webpack AppThe title to use for the generated HTML document
filename{String|Function}'index.html'The file to write the HTML to. Defaults toindex.html. You can specify a subdirectory here too (eg:assets/admin.html). The[name] placeholder will be replaced with the entry name. Can also be a function e.g.(entryName) => entryName + '.html'.
template{String}``webpack relative or absolute path to the template. By default it will usesrc/index.ejs if it exists. Please see thedocs for details
templateContent{string|Function|false}falseCan be used instead oftemplate to provide an inline template - please read theWriting Your Own Templates section
templateParameters{Boolean|Object|Function}falseAllows to overwrite the parameters used in the template - seeexample
inject{Boolean|String}truetrue || 'head' || 'body' || false Inject all assets into the giventemplate ortemplateContent. When passing'body' all javascript resources will be placed at the bottom of the body element.'head' will place the scripts in the head element. Passingtrue will add it to the head/body depending on thescriptLoading option. Passingfalse will disable automatic injections. - see theinject:false example
publicPath{String|'auto'}'auto'The publicPath used for script and link tags
scriptLoading{'blocking'|'defer'|'module'|'systemjs-module'}'defer'Modern browsers support non blocking javascript loading ('defer') to improve the page startup performance. Setting to'module' adds attributetype="module". This also implies "defer", since modules are automatically deferred.
favicon{String}``Adds the given favicon path to the output HTML
meta{Object}{}Allows to injectmeta-tags. E.g.meta: {viewport: 'width=device-width, initial-scale=1, shrink-to-fit=no'}
base{Object|String|false}falseInject abase tag. E.g.base: "https://example.com/path/page.html
minify{Boolean|Object}true ifmode is'production', otherwisefalseControls if and in what ways the output should be minified. Seeminification below for more details.
hash{Boolean}falseIftrue then append a uniquewebpack compilation hash to all included scripts and CSS files (i.e.main.js?hash=compilation_hash). This is useful for cache busting
cache{Boolean}trueEmit the file only if it was changed
showErrors{Boolean}trueErrors details will be written into the HTML page
chunks{?}?Allows you to add only some chunks (e.g only the unit-test chunk)
chunksSortMode{String|Function}autoAllows to control how chunks should be sorted before they are included to the HTML. Allowed values are'none' | 'auto' | 'manual' | {Function}
excludeChunks{Array.<string>}``Allows you to skip some chunks (e.g don't add the unit-test chunk)
xhtml{Boolean}falseIftrue render thelink tags as self-closing (XHTML compliant)

Here's an example webpack config illustrating how to use these options

webpack.config.js

{entry:'index.js',output:{path:__dirname+'/dist',filename:'index_bundle.js'},plugins:[newHtmlWebpackPlugin({title:'My App',filename:'assets/admin.html'})]}

Generating Multiple HTML Files

To generate more than one HTML file, declare the plugin more thanonce in your plugins array

webpack.config.js

{entry:'index.js',output:{path:__dirname+'/dist',filename:'index_bundle.js'},plugins:[newHtmlWebpackPlugin(),// Generates default index.htmlnewHtmlWebpackPlugin({// Also generate a test.htmlfilename:'test.html',template:'src/assets/test.html'})]}

Writing Your Own Templates

If the default generated HTML doesn't meet your needs you can supplyyour own template. The easiest way is to use thetemplate option and pass a custom HTML file.The html-webpack-plugin will automatically inject all necessary CSS, JS, manifestand favicon files into the markup.

Details of other template loaders aredocumented here.

plugins:[newHtmlWebpackPlugin({title:"Custom template",// Load a custom template (lodash by default)template:"index.html",}),];

index.html

<!doctype html><html><head><metacharset="utf-8"/><title><%= htmlWebpackPlugin.options.title %></title></head><body></body></html>

If you already have a template loader, you can use it to parse the template.Please note that this will also happen if you specify the html-loader and use.html file as template.

webpack.config.js

module:{loaders:[{test:/\.hbs$/,loader:"handlebars-loader"}]},plugins:[newHtmlWebpackPlugin({title:'Custom template using Handlebars',template:'index.hbs'})]

You can use thelodash syntax out of the box. If theinject feature doesn't fit your needs and you want full control over the asset placement use thedefault template of thehtml-webpack-template project as a starting point for writing your own.

The following variables are available in the template by default (you can extend them using thetemplateParameters option):

  • htmlWebpackPlugin: data specific to this plugin

    • htmlWebpackPlugin.options: the options hash that was passed tothe plugin. In addition to the options actually used by this plugin,you can use this hash to pass arbitrary data through to your template.

    • htmlWebpackPlugin.tags: the preparedheadTags andbodyTags Array to render the<base>,<meta>,<script> and<link> tags.Can be used directly in templates and literals. For example:

      <html><head><%= htmlWebpackPlugin.tags.headTags %></head><body><%= htmlWebpackPlugin.tags.bodyTags %></body></html>
    • htmlWebpackPlugin.files: direct access to the files used during the compilation.

      publicPath:string;js:string[];css:string[];manifest?:string;favicon?:string;
  • webpackConfig: the webpack configuration that was used for this compilation. Thiscan be used, for example, to get thepublicPath (webpackConfig.output.publicPath).

  • compilation: the webpackcompilation object.This can be used, for example, to get the contents of processed assets and inline themdirectly in the page, throughcompilation.assets[...].source()(seethe inline template example).

The template can also be directly inlined directly into the options object.
⚠️templateContent does not allow to use webpack loaders for your template and will not watch for template file changes

webpack.config.js

newHtmlWebpackPlugin({templateContent:`    <html>      <body>        <h1>Hello World</h1>      </body>    </html>  `,});

ThetemplateContent can also access alltemplateParameters values.
⚠️templateContent does not allow to use webpack loaders for your template and will not watch for template file changes

webpack.config.js

newHtmlWebpackPlugin({inject:false,templateContent:({ htmlWebpackPlugin})=>`    <html>      <head>${htmlWebpackPlugin.tags.headTags}      </head>      <body>        <h1>Hello World</h1>${htmlWebpackPlugin.tags.bodyTags}      </body>    </html>  `,});

Filtering Chunks

To include only certain chunks you can limit the chunks being used

webpack.config.js

plugins:[newHtmlWebpackPlugin({chunks:["app"],}),];

It is also possible to exclude certain chunks by setting theexcludeChunks option

webpack.config.js

plugins:[newHtmlWebpackPlugin({excludeChunks:["dev-helper"],}),];

Minification

If theminify option is set totrue (the default when webpack'smode is'production'),the generated HTML will be minified usinghtml-minifier-terserand the following options:

{collapseWhitespace:true,keepClosingSlash:true,removeComments:true,removeRedundantAttributes:true,removeScriptTypeAttributes:true,removeStyleLinkTypeAttributes:true,useShortDoctype:true}

To use customhtml-minifier optionspass an object tominify instead. This object will not be merged with the defaults above.

To disable minification during production mode set theminify option tofalse.

Meta Tags

If themeta option is set the html-webpack-plugin will inject meta tags.
For the default template the html-webpack-plugin will already provide a default for theviewport meta tag.

Please take a look at this well maintained list of almost allpossible meta tags.

name/content meta tags

Most meta tags are configured by setting aname and acontent attribute.
To add those use a key/value pair:

webpack.config.js

plugins:[newHtmlWebpackPlugin({meta:{viewport:"width=device-width, initial-scale=1, shrink-to-fit=no",// Will generate: <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">"theme-color":"#4285f4",// Will generate: <meta name="theme-color" content="#4285f4">},}),];

Simulate http response headers

Thehttp-equiv attribute is essentially used to simulate a HTTP response header.
This format is supported using an object notation which allows you to add any attribute:

webpack.config.js

plugins:[newHtmlWebpackPlugin({meta:{"Content-Security-Policy":{"http-equiv":"Content-Security-Policy",content:"default-src https:",},// Will generate: <meta http-equiv="Content-Security-Policy" content="default-src https:">// Which equals to the following http header: `Content-Security-Policy: default-src https:`"set-cookie":{"http-equiv":"set-cookie",content:"name=value; expires=date; path=url",},// Will generate: <meta http-equiv="set-cookie" content="value; expires=date; path=url">// Which equals to the following http header: `set-cookie: value; expires=date; path=url`},}),];

Base Tag

When thebase option is used,html-webpack-plugin will inject abase tag.By default, a base tag will not be injected.

The following two are identical and will both insert<base href="http://example.com/some/page.html">:

newHtmlWebpackPlugin({base:"http://example.com/some/page.html",});
newHtmlWebpackPlugin({base:{href:"http://example.com/some/page.html"},});

Thetarget can be specified with the corresponding key:

newHtmlWebpackPlugin({base:{href:"http://example.com/some/page.html",target:"_blank",},});

which will inject the element<base href="http://example.com/some/page.html">.

Long Term Caching

For long term caching addcontenthash to the filename.

Example:

plugins:[newHtmlWebpackPlugin({filename:"index.[contenthash].html",}),];

contenthash is the hash of the content of the output file.

Refer webpack'sTemplate Strings for more details

Events

To allow otherplugins to alter the HTML this plugin executestapable hooks.

Thelib/hooks.js contains all informationabout which values are passed.

Concept flow uml

beforeAssetTagGeneration hook

    AsyncSeriesWaterfallHook<{      assets: {        publicPath: string,        js: Array<{string}>,        css: Array<{string}>,        favicon?: string | undefined,        manifest?: string | undefined      },      outputName: string,      plugin: HtmlWebpackPlugin    }>

alterAssetTags hook

    AsyncSeriesWaterfallHook<{      assetTags: {        scripts: Array<HtmlTagObject>,        styles: Array<HtmlTagObject>,        meta: Array<HtmlTagObject>,      },      publicPath: string,      outputName: string,      plugin: HtmlWebpackPlugin    }>

alterAssetTagGroups hook

    AsyncSeriesWaterfallHook<{      headTags: Array<HtmlTagObject | HtmlTagObject>,      bodyTags: Array<HtmlTagObject | HtmlTagObject>,      publicPath: string,      outputName: string,      plugin: HtmlWebpackPlugin    }>

afterTemplateExecution hook

    AsyncSeriesWaterfallHook<{      html: string,      headTags: Array<HtmlTagObject | HtmlTagObject>,      bodyTags: Array<HtmlTagObject | HtmlTagObject>,      outputName: string,      plugin: HtmlWebpackPlugin,    }>

beforeEmit hook

    AsyncSeriesWaterfallHook<{      html: string,      outputName: string,      plugin: HtmlWebpackPlugin,    }>

afterEmit hook

    AsyncSeriesWaterfallHook<{      outputName: string,      plugin: HtmlWebpackPlugin    }>

Example implementation:webpack-subresource-integrity

plugin.js

// If your plugin is direct dependent to the html webpack plugin:constHtmlWebpackPlugin=require("html-webpack-plugin");// If your plugin is using html-webpack-plugin as an optional dependency// you can use https://github.com/tallesl/node-safe-require instead:constHtmlWebpackPlugin=require("safe-require")("html-webpack-plugin");classMyPlugin{apply(compiler){compiler.hooks.compilation.tap("MyPlugin",(compilation)=>{console.log("The compiler is starting a new compilation...");// Static Plugin interface |compilation |HOOK NAME | register listenerHtmlWebpackPlugin.getCompilationHooks(compilation).beforeEmit.tapAsync("MyPlugin",// <-- Set a meaningful name here for stacktraces(data,cb)=>{// Manipulate the contentdata.html+="The Magic Footer";// Tell webpack to move oncb(null,data);},);});}}module.exports=MyPlugin;

webpack.config.js

plugins:[newMyPlugin({options:""})];

Note that the callback must be passed the HtmlWebpackPluginData in order to pass this onto any other plugins listening on the samebeforeEmit event

Maintainers


Jan Nicklas

Thomas Sileghem

Backers

Thank you to all our backers!
If you want to support the project as wellbecome a sponsor or aa backer.

Contributors

This project exists thanks to all the people who contribute.

You're free to contribute to this project by submittingissues and/orpull requests. This project is test-driven, so keep in mind that every change and new feature should be covered by tests.

About

Simplifies creation of HTML files to serve your webpack bundles

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project


    [8]ページ先頭

    ©2009-2025 Movatter.jp