npm i --save-dev html-webpack-plugin
yarn add --dev html-webpack-plugin
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.
Thanks for supporting the ongoing improvements to the html-webpack-plugin!
The html-webpack-plugin
works without configuration.
It's a great addition to the
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
head
or body
(different locations ) of same html document.<link rel='preload'>
and <link rel='prefetch'>
<link />
tags to have their media attribute set automatically; useful for providing specific desktop/mobile/print etc. stylesheets that the browser will conditionally downloadnomodule
attribute to specific injected scripts, which prevents the scripts from being loaded by newer browsers. Good for limiting loads of polyfills.The plugin will generate an HTML5 file for you that includes all your webpack
bundles in the head using script
tags. Just add the plugin to your webpack
config 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.
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'
})
]
}
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'
})
]
}
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>
`
})
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' ]
})
]
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
.
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.
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">
}
})
]
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`
}
})
]
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">
.
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
To allow other plugins to alter the HTML this plugin executestapable hooks.
The lib/hooks.js contains all informationabout which values are passed.
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
Jan Nicklas |
Thomas Sileghem |
Thank you to all our backers!
If you want to support the project as well become a sponsor or a a backer.
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