html-webpack-plugin

授权协议 MIT License
开发语言 JavaScript
所属分类 Web应用开发、 常用JavaScript包
软件类型 开源软件
地区 不详
投 递 者 邢英奕
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

tests

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 a webpack plugin that simplifies creation of HTML files to serve your webpack bundles. This is especially useful for webpack 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 using lodash templates or use your own loader.

Sponsors

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

Zero Config

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

Plugins

The html-webpack-plugin provides hooks 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 your webpackbundles in the head using script tags. Just add the plugin to your webpackconfig as follows:

webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  entry: 'index.js',
  output: {
    path: __dirname + '/dist',
    filename: 'index_bundle.js'
  },
  plugins: [
    new HtmlWebpackPlugin()
  ]
}

This will generate a file dist/index.html containing the following

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Webpack App</title>
    <script defer src="index_bundle.js"></script>
  </head>
  <body>
  </body>
</html>

If you have multiple webpack entry points, they will all be included with script tags in the generated HTML.

If you have any CSS assets in webpack's output (for example, CSS extracted with the mini-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 to html-webpack-plugin.Allowed values are as follows:

Name Type Default Description
title {String} Webpack App The title to use for the generated HTML document
filename {String|Function} 'index.html' The file to write the HTML to. Defaults to index.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 use src/index.ejs if it exists. Please see the docs for details
templateContent {string|Function|false} false Can be used instead of template to provide an inline template - please read the Writing Your Own Templates section
templateParameters {Boolean|Object|Function} false Allows to overwrite the parameters used in the template - see example
inject {Boolean|String} true true || 'head' || 'body' || false Inject all assets into the given template or templateContent. 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. Passing true will add it to the head/body depending on the scriptLoading option. Passing false will disable automatic injections. - see the inject:false example
publicPath {String|'auto'} 'auto' The publicPath used for script and link tags
scriptLoading {'blocking'|'defer'|'module'} 'defer' Modern browsers support non blocking javascript loading ('defer') to improve the page startup performance. Setting to 'module' adds attribute type="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 inject meta-tags. E.g. meta: {viewport: 'width=device-width, initial-scale=1, shrink-to-fit=no'}
base {Object|String|false} false Inject a base tag. E.g. base: "https://example.com/path/page.html
minify {Boolean|Object} true if mode is 'production', otherwise false Controls if and in what ways the output should be minified. See minification below for more details.
hash {Boolean} false If true then append a unique webpack compilation hash to all included scripts and CSS files. This is useful for cache busting
cache {Boolean} true Emit the file only if it was changed
showErrors {Boolean} true Errors 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} auto Allows 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} false If true render the link 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: [
    new HtmlWebpackPlugin({
      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: [
    new HtmlWebpackPlugin(), // Generates default index.html
    new HtmlWebpackPlugin({  // Also generate a test.html
      filename: '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 the template 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 are documented here.

plugins: [
  new HtmlWebpackPlugin({
    title: 'Custom template',
    // Load a custom template (lodash by default)
    template: 'index.html'
  })
]

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="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: [
  new HtmlWebpackPlugin({
    title: 'Custom template using Handlebars',
    template: 'index.hbs'
  })
]

You can use the lodash syntax out of the box. If the inject feature doesn't fit your needs and you want full control over the asset placement use the default template of the html-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 the templateParameters 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 prepared headTags and bodyTags 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 the publicPath (webpackConfig.output.publicPath).

  • compilation: the webpack compilation object.This can be used, for example, to get the contents of processed assets and inline themdirectly in the page, through compilation.assets[...].source()(see the 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

new HtmlWebpackPlugin({
  templateContent: `
    <html>
      <body>
        <h1>Hello World</h1>
      </body>
    </html>
  `
})

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

webpack.config.js

new HtmlWebpackPlugin({
  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: [
  new HtmlWebpackPlugin({
    chunks: ['app']
  })
]

It is also possible to exclude certain chunks by setting the excludeChunks option

webpack.config.js

plugins: [
  new HtmlWebpackPlugin({
    excludeChunks: [ 'dev-helper' ]
  })
]

Minification

If the minify option is set to true (the default when webpack's mode is 'production'),the generated HTML will be minified using html-minifier-terserand the following options:

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

To use custom html-minifier optionspass an object to minify instead. This object will not be merged with the defaults above.

To disable minification during production mode set the minify option to false.

Meta Tags

If the meta 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 the viewport meta tag.

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

name/content meta tags

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

webpack.config.js

plugins: [
  new HtmlWebpackPlugin({
      '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

The http-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: [
  new HtmlWebpackPlugin({
    '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 the base option is used,html-webpack-plugin will inject a base 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">:

new HtmlWebpackPlugin({
  'base': 'http://example.com/some/page.html'
})
new HtmlWebpackPlugin({
  'base': { 'href': 'http://example.com/some/page.html' }
})

The target can be specified with the corresponding key:

new HtmlWebpackPlugin({
  'base': {
    'href': 'http://example.com/some/page.html',
    'target': '_blank'
  }
})

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

Long Term Caching

For long term caching add contenthash to the filename.

Example:

plugins: [
  new HtmlWebpackPlugin({
    filename: 'index.[contenthash].html'
  })
]

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

Refer webpack's Template Strings for more details

Events

To allow other plugins to alter the HTML this plugin executestapable hooks.

The lib/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:
const HtmlWebpackPlugin = 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:
const HtmlWebpackPlugin = require('safe-require')('html-webpack-plugin');

class MyPlugin {
  apply (compiler) {
    compiler.hooks.compilation.tap('MyPlugin', (compilation) => {
      console.log('The compiler is starting a new compilation...')

      // Static Plugin interface |compilation |HOOK NAME | register listener 
      HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapAsync(
        'MyPlugin', // <-- Set a meaningful name here for stacktraces
        (data, cb) => {
          // Manipulate the content
          data.html += 'The Magic Footer'
          // Tell webpack to move on
          cb(null, data)
        }
      )
    })
  }
}

module.exports = MyPlugin

webpack.config.js

plugins: [
  new MyPlugin({ options: '' })
]

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

Maintainers


Jan Nicklas

Thomas Sileghem

Backers

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

Contributors

This project exists thanks to all the people who contribute.

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

This project uses the semistandard code style.

  • 引言 最近在react项目中初次用到了html-webapck-plugin插件,用到该插件的两个主要作用: 为html文件中引入的外部资源如script、link动态添加每次compile后的hash,防止引用缓存的外部文件问题 可以生成创建html入口文件,比如单页面可以生成一个html文件入口,配置N个html-webpack-plugin可以生成N个页面入口 有了这种插件,那么在项目中遇到

  • Error: Cannot find module 'html-webpack-plugin' Require stack: - E:\rhis-web\ruoyi-ui\node_modules\script-ext-html-webpack-plugin\lib\plugin.js - E:\rhis-web\ruoyi-ui\node_modules\script-ext-html-webp

  • 1、简单介绍 html-webpack-plugin: 作用:1)根据一个html模板在内存中生成一个相同的html 2)把内存中的打包好的js插入到内存中Html最后面 clean-webpack-plugin: 作用:把之前老的打包好的模块删除掉,仅仅留下最新打包的。 webpack-dev-server: 作用:开发模式下,直接在内存中打包,速度快,使用epxress服务器托

  • html-webpack-plugin dist 目录属于构建目录,是我们源码的输出目录,我们希望里面的一切都是可以自动化的,包括 index.html 文件也能自动创建,js 文件也能自动引入到页面, 所以我们需要用到插件 html-webpack-plugin 。 1:首先安装该插件 npm install html-webpack-plugin -D 要用该插件,首先我们得有一个模板文件,好

  • 因为在打包时,webpack默认只会打包js,也就是说,咱们打包出来的dist文件夹中只有js文件而已,并没有html啥的其他文件。 当我们想查看打包后的js文件是否可以使用的话,我们需要将html文件拷贝到dist目录下,然后在html文件中使用script标签引用打包好的js文件,步骤很是麻烦。 那么可以怎么简化这些操作,自然是使用插件咯,标题白写的不成。 进入正题: 一、找到对应功能的插件

  • html-webpack-plugin 插件是用于编译 Webpack 项目中的 html 类型的文件,如果直接将 html 文件置于 ./src 目录中,用 Webpack 打包时是不会编译到生产环境中的。因为 Webpack 编译任何文件都需要基于配置文件先行配置的。 Webpack 插件使用三步曲:安装>引入>配置 npm 安装 npm install --save-dev html-web

  • webpack使用日常,使用webpack是需要压缩html模板代码请注意 var HtmlWebpackPlugin = require('html-webpack-plugin') webpackconfig = { ... plugins: [ new HtmlWebpackPlugin({ template: 'src/index.

  • 文档:https://github.com/jantimon/html-webpack-plugin 示例:将版本号传入到html模板文件中 配置文件 webpack.config.js const HtmlWebpackPlugin = require('html-webpack-plugin') const version = require('./package.json').version

  • 总结一下html-webpack-plugin插件中常用的配置: template: '相对路径',作用:加载对应的模板文件; title: '标题',作用:在页面中动态生成标题; hash: true,作用:清除浏览器缓存,保证每次都加载最新的数据; minify: {...},作用:压缩文件的操作; filename: '生成的文件名',作用:用于定义生成多个HTML文件的文件名; chunk

  • 背景 上一篇,我们已经学会了如何简化webpack打包的流程了。但是无论打包过程怎么变,打包之后的js都需要手动的引入到html文件里头,那么当我们改下打包生成的文件名之后,就需要再次手动的修改html里头的引用了,显然这个有诸多的不便利。eg: 有一种情况,有时候为了更好的 cache 处理,文件名还带着 hash,例如下面这样: main.9046fe2bf8166cbe16d7.js 这个

  • 1 安装指定版本2的插件:npm i -D html-webpack-plugin@2 { "name": "demo", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1

  • htmlWebpackPlugin  可以自动的创建 html  文件 动态的引用文件名包含 hash 值得文件 1,使用 npm install html-webpack-plugin --save-dev 安装插件 2,在配置文件中的使用 引用插件 var htmlWebpackPlugin = require('html-webpack-plugin'); 插件简单的配置 var htmlW

  • 安装依赖 npm i webpack webpack-cli html-webpack-plugin -D webpack.config.js配置文件 const path = require('path') //导入htm-webpack-plugin插件 const htmlWebpackPlugin = require('html-webpack-plugin'); //这个配置文件初始就

  • 我们现在的代码里,html中引入的index.js是手动写入的,主要问题有: 我们打包好的文件有时候会带有hash(接下来一章会讲到),如果直接引入,则每次修改都需要手动修改引入。 HtmlWebpackPlugin让你可以用此插件为你生成一个HTML文件,使用lodash模板提供你自己的模板,或使用你自己的loader。 1,安装HtmlWebpackPlugin npm install ht

  • 近期公司有个多页面的网站需要开发,选择用webpack构建项目。 在编写webpack config 的过程中,发现html-webpack-plugin和html-loader有冲突。 如果使用html-loader来处理html模版文件中的url,会导致html-webpack-plugin的ejs模版语法失效。 经过研究发现html-loader会把原始的html模版,编译成一个js模块样式

  • 今天在使用html-webpack-plugin时只要一引用html-webpack-plugin就报错,报错信息类似下面这个样子: module.js:471 throw err; ^ Error: Cannot find module 'webpack/lib/node/NodeTemplatePlugin' at Function.Module._resolveFi

  • 背景:一般情况下,我们需要通过一个ip地址,或者是通过localhost的方式来访问一个页面,这种情况下,我们需要进行设置。 解决办法:使用webpack-dev-server 安装完webpack-dev-server 后,可以直接运行npx webpack-dev-server,会生成一个地址。 1.不做任何设置 如果不做任何设置,直接在项目目录下运行npx webpack-dev-serve

  • 本文只在个人博客和 SegmentFault 社区个人专栏发表,转载请注明出处 个人博客: https://zengxiaotao.github.io SegmentFault 个人专栏: https://segmentfault.com/blog... html-webpack-plugin 可能用过的 webpack 的童鞋都用过这个 plugin ,就算没用过可能也听过。我们在学习webpa

  • 1.安装插件 npm install html-webpack-plugin --save-dev 2.在webpack.config.js中位置如下: const HtmlWebpackPlugin = require("html-webpack-plugin"); //引入插件 //配置如下 module.exports = { plugins: [ new html

 相关资料
  • Static html pages with Webpack 5 > PREVIEW LIVE This is a forkable example of a static website (plain html/css/javascript)assembled with webpack. You could also use this repository as a template when

  • �� Static HTML Webpack Boilerplate Enjoy hand-writing your HTML? Keep it old-school with modern build tools. This boilerplate setup makes it easier to write your own styling, scripts, and mark-up. ✨ F

  • 我有一个项目,使用Twig模板。它中的所有数据都是静态的,但为了清晰起见,我在其他twig文件中分离了页面的部分(否则一个文件中会有数百行标记)。 views/welcome/hello.html 现在我想做的是使用webpack捆绑任何js、css,并使用HTML webpack插件创建HTML页面,并将这些样式和脚本注入: 在我的dist/index.html中,我希望得到这样的结果,生成的h

  • 问题内容: 我正在尝试使用Webpack设置一个有角度的项目,但是我不知道如何从html模板中引用图像并将其包含在构建中。 我的项目树如下: 我正在尝试与和一起使用,但这只是没有发生。 这是一个示例模板: 问题#1 :我希望能够参考相对于的图片。现在,路径需要相对于模板文件,这将变得非常丑陋()。 问题2 :即使我指定了相对路径(如我上面所做的那样),项目也可以成功构建,但实际上没有任何反应。路径

  • 下面是我得到的解析错误。 错误:模板分析错误:无法绑定到“routerlink”,因为它不是“a”的已知属性。(“r>Menu][routerlink]=r.routerlink[routerlinkactive]=”['active']“>{{r.text}}”):t@0:359无法绑定到“routerlinkactive”,因为它不是“a”的已知属性。(“项ui红色”*ngfor=“让r个路由

  • 更改历史 * 2017-11-12 王莹 webpack内容更新 第一章 webpack介绍 1.1 概述 Webpack 是当下最热门的前端资源模块化管理和打包工具。它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分隔,等到实际需要的时候再异步加载。通过 loader 的转换,任何形式的资源都可以视作模块,比如 CommonJs