webpack 插件html-webpack-plugin的具体使用


Posted in Javascript onApril 09, 2018

本文介绍了webpack 插件html-webpack-plugin的具体使用,分享给大家,具体如下:

插件地址:https://www.npmjs.com/package/html-webpack-plugin

这个插件用来简化创建服务于 webpack bundle 的 HTML 文件,尤其是对于在文件名中包含了 hash 值,而这个值在每次编译的时候都发生变化的情况。你既可以让这个插件来帮助你自动生成 HTML 文件,也可以使用 lodash 模板加载生成的 bundles,或者自己加载这些 bundles。

Installation

使用 npm 安装这个插件

$ npm install html-webpack-plugin@2 --save-dev

Basic Usage

这个插件可以帮助生成 HTML 文件,在 body 元素中,使用 script 来包含所有你的 webpack bundles,只需要在你的 webpack 配置文件中如下配置:

var HtmlWebpackPlugin = require('html-webpack-plugin')
var webpackConfig = {
 entry: 'index.js',
 output: {
  path: 'dist',
  filename: 'index_bundle.js'
 },
 plugins: [new HtmlWebpackPlugin()]
}

这将会自动在 dist 目录中生成一个名为 index.html 的文件,内容如下:

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

如果你有多个 webpack 入口点,它们都会被包含在生成的 script 元素中。

如果有任何的 CSS 资源包含在 webpack 输出中(例如,使用 ExtractTextPlugin 提炼出的 css ),这些将会使用 link 包含在 HTML 页面的 head 元素中。

Configuration

 可以进行一系列的配置,支持如下的配置信息

  1. title: 用来生成页面的 title 元素
  2. filename: 输出的 HTML 文件名,默认是 index.html, 也可以直接配置带有子目录。
  3. template: 模板文件路径,支持加载器,比如 html!./index.html
  4. inject: true | 'head' | 'body' | false  ,注入所有的资源到特定的 template 或者 templateContent 中,如果设置为 true 或者 body,所有的 javascript 资源将被放置到 body 元素的底部,'head' 将放置到 head 元素中。
  5. favicon: 添加特定的 favicon 路径到输出的 HTML 文件中。
  6. minify: {} | false , 传递 html-minifier 选项给 minify 输出
  7. hash: true | false, 如果为 true, 将添加一个唯一的 webpack 编译 hash 到所有包含的脚本和 CSS 文件,对于解除 cache 很有用。
  8. cache: true | false,如果为 true, 这是默认值,仅仅在文件修改之后才会发布文件。
  9. showErrors: true | false, 如果为 true, 这是默认值,错误信息会写入到 HTML 页面中
  10. chunks: 允许只添加某些块 (比如,仅仅 unit test 块)
  11. chunksSortMode: 允许控制块在添加到页面之前的排序方式,支持的值:'none' | 'default' | {function}-default:'auto'
  12. excludeChunks: 允许跳过某些块,(比如,跳过单元测试的块)

下面的示例演示了如何使用这些配置。

{
 entry: 'index.js',
 output: {
  path: 'dist',
  filename: 'index_bundle.js',
  hash: true
 },
 plugins: [
  new HtmlWebpackPlugin({
   title: 'My App',
   filename: 'assets/admin.html'
  })
 ]
}

生成多个 HTML 文件

通过在配置文件中添加多次这个插件,来生成多个 HTML 文件。

{
 entry: 'index.js',
 output: {
  path: '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'
  })
 ]
}

编写自定义模板

如果默认生成的 HTML 文件不适合你的需要看,可以创建自己定义的模板。方便的方式是通过 inject 选项,然后传递给定制的 HTML 文件。html-webpack-plugin 将会自动注入所有需要的 CSS, js, manifest 和 favicon 文件到标记中。

plugins: [
 new HtmlWebpackPlugin({
  title: 'Custom template',
  template: 'my-index.html', // Load a custom template 
  inject: 'body' // Inject all scripts into the body 
 })
]

my-index.html 文件

<!DOCTYPE html>
<html>
 <head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
  <title><%= htmlWebpackPlugin.options.title %></title>
 </head>
 <body>
 </body>
</html>

如果你有模板加载器,可以使用它来解析这个模板。

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

另外,如果你的模式是一个字符串,可以使用 templateContent 传递它。

plugins: [
 new HtmlWebpackPlugin({
  inject: true,
  templateContent: templateContentString
 })
]

如果 inject 特性不适合你的需要,你希望完全控制资源放置。 可以直接使用 lodash 语法,使用  default template 作为起点创建自己的模板。

templateContent 选项也可以是一个函数,以便使用其它语言,比如 jade:

plugins: [
 new HtmlWebpackPlugin({
  templateContent: function(templateParams, compilation) {
   // Return your template content synchronously here 
   return '..';
  }
 })
]

或者异步版本

plugins: [
 new HtmlWebpackPlugin({
  templateContent: function(templateParams, compilation, callback) {
   // Return your template content asynchronously here 
   callback(null, '..');
  }
 })
]

注意,如果同时使用 template 和 templateContent ,插件会抛出错误。

变量 o 在模板中是在渲染时传递进来的数据,这个变量有如下的属性:

1、htmlWebpackPlugin: 这个插件的相关数据 ◦

htmlWebpackPlugin.files: 资源的块名,来自 webpack 的 stats 对象,包含来自 entry 的从 entry point name 到 bundle 文件名映射。

"htmlWebpackPlugin": {
 "files": {
  "css": [ "main.css" ],
  "js": [ "assets/head_bundle.js", "assets/main_bundle.js"],
  "chunks": {
   "head": {
    "entry": "assets/head_bundle.js",
    "css": [ "main.css" ]
   },
   "main": {
    "entry": "assets/main_bundle.js",
    "css": []
   },
  }
 }
}

如果在 webpack 配置文件中,你配置了 publicPath,将会反射正确的资源

htmlWebpackPlugin.options: 传递给插件的配置。

2、webpack: webpack 的 stats 对象。

3、webpackConfig: webpack 配置信息。

过滤块

可以使用 chunks 来限定特定的块。

plugins: [
 new HtmlWebpackPlugin({
  chunks: ['app']
 })
]

还可以使用 excludeChunks 来排除特定块。

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

事件

通过事件允许其它插件来扩展 HTML。

  1. html-webpack-plugin-before-html-processing
  2. html-webpack-plugin-after-html-processing
  3. html-webpack-plugin-after-emit

使用方式:

compilation.plugin('html-webpack-plugin-before-html-processing', function(htmlPluginData, callback) {
 htmlPluginData.html += 'The magic footer';
 callback();
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
Sep 27 Javascript
jquery ajax中使用jsonp的限制解决方法
Nov 22 Javascript
png在IE6 下无法透明的解决方法汇总
May 21 Javascript
轻松掌握JavaScript状态模式
Sep 07 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
Dec 31 Javascript
Angular.js自定义指令学习笔记实例
Feb 24 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
Jul 23 Javascript
温故知新——JavaScript中的字符串连接问题最全总结(推荐)
Aug 21 Javascript
vue-router项目实战总结篇
Feb 11 Javascript
通过js动态创建标签,并设置属性方法
Feb 24 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
Jul 12 Javascript
解决cordova+vue 项目打包成APK应用遇到的问题
May 10 Javascript
详解webpack 入门与解析
Apr 09 #Javascript
vue技术分享之你可能不知道的7个秘密
Apr 09 #Javascript
一步步教会你微信小程序的登录鉴权
Apr 09 #Javascript
vue组件详解之使用slot分发内容
Apr 09 #Javascript
vue组件中使用props传递数据的实例详解
Apr 08 #Javascript
Vue入门之animate过渡动画效果
Apr 08 #Javascript
vue组件与复用详解
Apr 08 #Javascript
You might like
WordPress中is_singular()函数简介
2015/02/05 PHP
php判断电子邮件是否正确方法
2018/12/04 PHP
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
2013/03/05 Javascript
jquery对象和DOM对象的区别介绍
2013/08/09 Javascript
javascript设置连续两次点击按钮时间间隔的方法
2014/10/28 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
jQuery实现侧浮窗与中浮窗切换效果的方法
2016/09/05 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
2016/11/07 Javascript
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
vue给组件传递不同的值方法
2018/09/29 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
[49:20]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Python查找相似单词的方法
2015/03/05 Python
Python通过Django实现用户注册和邮箱验证功能代码
2017/12/11 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
python中tkinter的应用:修改字体的实例讲解
2019/07/17 Python
python+jinja2实现接口数据批量生成工具
2019/08/28 Python
python输入错误后删除的方法
2019/10/12 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
PyCharm上安装Package的实现(以pandas为例)
2020/09/18 Python
快递业务员岗位职责
2014/01/06 职场文书
陈欧的广告词
2014/03/18 职场文书
红色故事演讲稿
2014/05/22 职场文书
会计试用期自我评价
2014/09/19 职场文书
政府领导干部个人对照检查材料思想汇报
2014/09/24 职场文书
工作时间调整通知
2015/04/24 职场文书
Spring Bean是如何初始化的详解
2022/03/22 Java/Android