详解html-webpack-plugin用法全解


Posted in Javascript onJanuary 22, 2018

html-webpack-plugin 可能用过的 webpack 的童鞋都用过这个 plugin ,就算没用过可能也听过。我们在学习webpack的时候,可能经常会看到这样的一段代码。

// webpack.config.js
module.exports = {
  entry: path.resolve(__dirname, './app/index.js'),
  output:{
    path: path.resolve(__dirname, './build'),
    filename: 'bundle.js'
  }
  ...
  plugins: [
    new HtmlWebpackPlugin()
  ]
}

之后在终端输入 webpack 命令后

webpack

你会神奇的看到在你的 build 文件夹会生成一个 index.html 文件和一个 bundle.js 文件,而且 index.html 文件中自动引用 webpack 生成的 bundle.js 文件。

所有的这些都是 html-webpack-plugin 的功劳。它会自动帮你生成一个 html 文件,并且引用相关的 assets 文件(如 css, js)。

自己在六月第一次接触前端自动化构建,学习 webpack 和 react 时,曾经简单使用过这个插件,但也只是用了常见的几个选项,今天就跟着官方文档走一走,看看它的所有用法。

title

顾名思义,设置生成的 html 文件的标题。

filename

也没什么说的,生成 html 文件的文件名。默认为 index.html.

template

根据自己的指定的模板文件来生成特定的 html 文件。这里的模板类型可以是任意你喜欢的模板,可以是 html, jade, ejs, hbs, 等等,但是要注意的是,使用自定义的模板文件时,需要提前安装对应的 loader, 否则webpack不能正确解析。以 jade 为例。

npm install jade-loader --save-dev
// webpack.config.js
...
loaders: {
  ...
  {
    test: /\.jade$/,
    loader: 'jade'
  }
}
plugins: [
  new HtmlWebpackPlugin({
    ...
    jade: 'path/to/yourfile.jade'
  })
]

最终在build文件夹内会生成一个 yourfile.html 和 bundle.js 文件。现在我们再回头来看看之前将的 title 属性。

如果你既指定了 template 选项,又指定了 title 选项,那么webpack 会选择哪一个? 事实上,这时候会选择你指定的模板文件的 title, 即使你的模板文件中未设置 title。

那么 filename 呢,是否也会覆盖,其实不是,会以指定的 filename 作为文件名。

inject

注入选项。有四个选项值 true, body, head, false.

  1. true:默认值,script标签位于html文件的 body 底部
  2. body:同 true
  3. head:script 标签位于 head 标签内
  4. false:不插入生成的 js 文件,只是单纯的生成一个 html 文件
  5. favicon:给生成的 html 文件生成一个 favicon。属性值为 favicon 文件所在的路径名。
// webpack.config.js
...
plugins: [
  new HtmlWebpackPlugin({
    ...
    favicon: 'path/to/yourfile.ico'
  }) 
]

生成的 html 标签中会包含这样一个 link 标签

<link rel="shortcut icon" href="example.ico" rel="external nofollow" >

同 title 和 filename 一样,如果在模板文件指定了 favicon,会忽略该属性。

minify

minify 的作用是对 html 文件进行压缩,minify 的属性值是一个压缩选项或者 false 。默认值为false, 不对生成的 html 文件进行压缩。来看看这个压缩选项。

html-webpack-plugin 内部集成了html-minifier ,这个压缩选项同 html-minify 的压缩选项完全一样,
看一个简单的例子。

// webpack.config.js
...
plugins: [
  new HtmlWebpackPlugin({
    ...
    minify: {
      removeAttributeQuotes: true // 移除属性的引号
    }
  })
]
<!-- 原html片段 -->
<div id="example" class="example">test minify</div>
<!-- 生成的html片段 -->
<div id=example class=example>test minify</div>

hash

hash选项的作用是 给生成的 js 文件一个独特的 hash 值,该 hash 值是该次 webpack 编译的 hash 值。默认值为 false 。同样看一个例子。

// webpack.config.js
plugins: [
  new HtmlWebpackPlugin({
    ...
    hash: true
  })
]
<script type=text/javascript src=bundle.js?22b9692e22e7be37b57e></script>

执行 webpack 命令后,你会看到你的生成的 html 文件的 script 标签内引用的 js 文件,是不是有点变化了。

bundle.js 文件后跟的一串 hash 值就是此次 webpack 编译对应的 hash 值。

$ webpack
Hash: 22b9692e22e7be37b57e
Version: webpack 1.13.2

cache

默认值是 true。表示只有在内容变化时才生成一个新的文件。

showErrors

showErrors 的作用是,如果 webpack 编译出现错误,webpack会将错误信息包裹在一个 pre 标签内,属性的默认值为 true ,也就是显示错误信息。

chunks

chunks 选项的作用主要是针对多入口(entry)文件。当你有多个入口文件的时候,对应就会生成多个编译后的 js 文件。那么 chunks 选项就可以决定是否都使用这些生成的 js 文件。

chunks 默认会在生成的 html 文件中引用所有的 js 文件,当然你也可以指定引入哪些特定的文件。

看一个小例子。

// webpack.config.js
entry: {
  index: path.resolve(__dirname, './src/index.js'),
  index1: path.resolve(__dirname, './src/index1.js'),
  index2: path.resolve(__dirname, './src/index2.js')
}
...
plugins: [
  new HtmlWebpackPlugin({
    ...
    chunks: ['index','index2']
  })
]

执行 webpack 命令之后,你会看到生成的 index.html 文件中,只引用了 index.js 和 index2.js

...
<script type=text/javascript src=index.js></script>
<script type=text/javascript src=index2.js></script>

而如果没有指定 chunks 选项,默认会全部引用。

excludeChunks

弄懂了 chunks 之后,excludeChunks 选项也就好理解了,跟 chunks 是相反的,排除掉某些 js 文件。 比如上面的例子,其实等价于下面这一行

...
excludeChunks: ['index1.js']

chunksSortMode

这个选项决定了 script 标签的引用顺序。默认有四个选项,'none', 'auto', 'dependency', '{function}'。

  1. 'dependency' 不用说,按照不同文件的依赖关系来排序。
  2. 'auto' 默认值,插件的内置的排序方式,具体顺序这里我也不太清楚...
  3. 'none' 无序? 不太清楚...
  4. {function} 提供一个函数?但是函数的参数又是什么? 不太清楚...

如果有使用过这个选项或者知道其具体含义的同学,还请告知一下。。。

xhtml

一个布尔值,默认值是 false ,如果为 true ,则以兼容 xhtml 的模式引用文件。

总结

以上,就总结完了传入 new HtmlWebpackPlugin() 的选项,了解全部选项的含义后,可以在项目构建时更灵活的使用。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
让广告代码不再影响你的网页加载速度
Jul 07 Javascript
FormValid0.5版本发布,带ajax自定义验证例子
Aug 17 Javascript
jquery中获得$.ajax()事件返回的值并添加事件的方法
Apr 15 Javascript
jquery列表拖动排列(由项目提取相当好用)
Jun 17 Javascript
Vue.js实现拖放效果的实例
Sep 30 Javascript
js案例之鼠标跟随jquery版(实例讲解)
Jul 21 jQuery
jQuery选择器之子元素过滤选择器
Sep 28 jQuery
如何在vue中使用ts的示例代码
Feb 28 Javascript
Node.js中的child_process模块详解
Jun 08 Javascript
js+canvas实现验证码功能
Sep 21 Javascript
一文了解vue-router之hash模式和history模式
May 31 Javascript
Vue中fragment.js使用方法小结
Feb 17 Javascript
js构造函数创建对象是否加new问题
Jan 22 #Javascript
bmob js-sdk 在vue中的使用教程
Jan 21 #Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
Jan 21 #Javascript
Angular17之Angular自定义指令详解
Jan 21 #Javascript
laravel5.3 vue 实现收藏夹功能实例详解
Jan 21 #Javascript
详解node.js中的npm和webpack配置方法
Jan 21 #Javascript
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
Jan 21 #jQuery
You might like
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
php中实现可以返回多个值的函数实例
2015/03/21 PHP
学习php设计模式 php实现模板方法模式
2015/12/08 PHP
javascript 自动转到命名锚记
2009/01/10 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
2016/05/27 Javascript
node作为中间服务层如何发送请求(发送请求的实现方法详解)
2018/01/02 Javascript
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
python实现2048小游戏
2015/03/30 Python
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
Python简单计算给定某一年的某一天是星期几示例
2018/06/27 Python
python计算列表内各元素的个数实例
2018/06/29 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
Python 支持向量机分类器的实现
2020/01/15 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
python实现将range()函数生成的数字存储在一个列表中
2020/04/02 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
python实现学生信息管理系统(精简版)
2020/11/27 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
Waterford英国官方网站:世界上最受欢迎的优质水晶品牌
2019/08/17 全球购物
广州地球村科技数据库题目
2016/04/25 面试题
国贸专业个人求职信范文
2014/01/08 职场文书
重阳节登山活动方案
2014/02/03 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
C++程序员求职信
2014/05/07 职场文书
2014年教师节寄语
2014/08/11 职场文书
模范教师事迹材料
2014/12/16 职场文书