webpack学习笔记 (二) html-webpack-plugin使用

这个插件的两个作用:

  • 为html文件中引入的外部资源如scriptlink动态添加每次compile后的hash,防止引用缓存的外部文件问题
  • 可以生成创建html入口文件,比如单页面可以生成一个html文件入口,配置Nhtml-webpack-plugin可以生成N个页面入口

安装使用如下:

一、首先安装html-webpack-plugin插件

在cmd中打开项目,输入cnpm install html-webpack-plugin;

二、在webpack-config.js的plugins里面添加 信息,如下图

然后在cmd中输入,webpack,即可以在项目文件夹下自动生成index.html。如果报错,则表示,未安装html-webpack-plugin插件。

注:不配置任何选项的html-webpack-plugin插件,他会默认将webpack中的entry配置所有入口thunk和extract-text-webpack-plugin抽取的css样式都插入到文件指定的位置。

三、多页面配置

对于生成多页面的情况,在plugins配置多个plugin即可

 1 plugins:[
 2         new webpack.BannerPlugin(‘测试webpack搭建   ‘),
 3         new HtmlWebpackPlugin(),
 4         new HtmlWebpackPlugin({
 5           title:‘测试webpack‘,
 6           template: ‘src/template/index.html‘, // 源模板文件
 7           filename: ‘./index1.html‘, // 输出文件【注意:这里的根路径是module.exports.output.path】
 8           showErrors: true,
 9           inject: ‘body‘,
10           chunks: ["index"],
11           favicon:"./src/fav.ico",
12           hash:true,
13           minify:{
14                 caseSensitive: false, //是否大小写敏感
15                 removeComments:true, // 去除注释
16                 removeEmptyAttributes:true, // 去除空属性
17                 collapseWhitespace: true //是否去除空格
18             }
19       }),
20         new HtmlWebpackPlugin({
21           title:‘测试webpack‘,
22           template: ‘src/template/index.html‘, // 源模板文件
23           filename: ‘./index2.html‘, // 输出文件【注意:这里的根路径是module.exports.output.path】
24           showErrors: true,
25           inject: ‘body‘
26       })
27     ]

多页面配置

四、使用template模板页面

增加模板页面

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta charset="utf-8">
 5     <title><%= htmlWebpackPlugin.options.title %></title>
 6     <% for (var css in htmlWebpackPlugin.files.css) { %>
 7     <link href="<%=htmlWebpackPlugin.files.css[css] %>" rel="stylesheet">
 8     <% } %>
 9 </head>
10 <body>
11 <!-- 测试 -->
12 <div id="app" style=""></div>
13 </body>
14 <script type="text/babel">
15 </script>
16 </html>

模板页面

在配置中配置模板页面

五、自定义增加的js文件

在配置文件中,chunks选项添加对应的内容即可。

对应的内容为entry中的属性。具体如下图

六、生成页面压缩

配置minify配置项,常用的几个配置见上图

七、其他配置项解释如下

  • title: 生成的HTML模板的title,如果模板中有设置title的名字,则会忽略这里的设置
  • filename: 生成的模板文件的名字
  • 关于filename补充两点:

    1、filename配置的html文件目录是相对于webpackConfig.output.path路径而言的,不是相对于当前项目目录结构的。
    2、指定生成的html文件内容中的linkscript路径是相对于生成目录下的,写路径的时候请写生成目录下的相对路径。

  • template: 模板来源文件
  • 关于template补充几点:

    1、template配置项在html文件使用file-loader时,其所指定的位置找不到,导致生成的html文件内容不是期望的内容。
    2、为template指定的模板文件没有指定任何loader的话,默认使用ejs-loader。如template: ‘./index.html‘,若没有为.html指定任何loader就使用ejs-loader

  • inject: 引入模块的注入位置;取值有true/false/body/head;true | ‘head‘ | ‘body‘ | false  ,注入所有的资源到特定的 template 或者 templateContent 中,如果设置为 true 或者 body,所有的 javascript 资源将被放置到 body 元素的底部,‘head‘ 将放置到 head 元素中。
  • true或者body:所有JavaScript资源插入到body元素的底部
    2、head: 所有JavaScript资源插入到head元素中
    3、false: 所有静态资源css和JavaScript都不会注入到模板文件中
  • favicon: 指定页面图标;
  • minify: {} | false , 传递 html-minifier 选项给 minify 输出。是html-webpack-plugin中集成的 html-minifier ,生成模板文件压缩配置,有很多配置项,可以查看详细文档
       caseSensitive: false, //是否大小写敏感
       collapseBooleanAttributes: true, //是否简写boolean格式的属性如:disabled="disabled" 简写为disabled
       collapseWhitespace: true //是否去除空格
    
  • hash: 是否生成hash添加在引入文件地址的末尾,类似于我们常用的时间戳,比如最终引入是:<script type="text/javascript" src="bundle.049424f7d7ea5fa50656.js?049424f7d7ea5fa50656"></script>。这个可以避免缓存带来的麻烦
  • cache: 是否需要缓存,如果填写true,则文件只有在改变时才会重新生成
  • showErrors: 是否将错误信息写在页面里,默认true,出现错误信息则会包裹在一个pre标签内添加到页面上
  • chunks: 引入的模块,这里指定的是entry中设置多个js时,在这里指定引入的js,如果不设置则默认全部引入
  • chunksSortMode: 引入模块的排序方式,支持的值:‘none‘ | ‘default‘ | {function}-default:‘auto‘
  • excludeChunks: 排除的模块
  • xhtml: 生成的模板文档中标签是否自动关闭,针对xhtml的语法,会要求标签都关闭,默认false

八、插件事件(引用位置

不知道你发现没有,html-webpack-plugin插件在插入静态资源时存在一些问题:

  • 在插入js资源只能插入head或者body元素中,不能一些插入head中,另一些插入body中
  • 不支持在html中文件内联*,例如在文件的某个地方用<script src="xxx.js?__inline"></script>来内联外部脚本

为此,有人专门给插件作者提问了这个问题;对此插件作者提供了插件事件,允许其他插件来改变html文件内容。具体的事件如下:

Async(异步事件):

    * html-webpack-plugin-before-html-generation
    * html-webpack-plugin-before-html-processing
    * html-webpack-plugin-alter-asset-tags
    * html-webpack-plugin-after-html-processing
    * html-webpack-plugin-after-emit

Sync(同步事件):

    * html-webpack-plugin-alter-chunks

这些事件是提供给其他插件使用的,用于改变html的内容。因此,要用这些事件需要提供一个webpack插件。例如下面定义的MyPlugin插件。


function MyPlugin(options) {
  // Configure your plugin with options...
}

MyPlugin.prototype.apply = function(compiler) {
  // ...
  compiler.plugin(‘compilation‘, function(compilation) {
    console.log(‘The compiler is starting a new compilation...‘);

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

};

module.exports = MyPlugin;

然后,在webpack.config.js文件中配置Myplugin信息:

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

注:一个比较全的配置

 1 var webpack=require(‘webpack‘);
 2 var HtmlWebpackPlugin = require(‘html-webpack-plugin‘);
 3
 4 module.exports = {
 5     devtool: ‘eval-source-map‘, // 还不知有什么用
 6     entry: {
 7             index:"./src/js/runoob1.js",
 8             main:"./src/js/runoob1.js"
 9         },
10     output: {
11         path: __dirname+"/build/web/",    //通过HtmlWebpackPlugin插件生成的html文件存放在这个目录下面
12         filename: "../js/[name].js" //编译生成的js文件存放到根目录下面的js目录下面,如果js目录不存在则自动创建,相对于path
13     },
14     module: {
15         loaders: [
16             { test: /\.css$/, loader: "style-loader!css-loader" }
17         ]
18     },
19     plugins:[
20         new webpack.BannerPlugin(‘测试webpack搭建           ‘),
21         new HtmlWebpackPlugin(),
22         new HtmlWebpackPlugin({
23           title:‘测试webpack‘,
24           template: ‘src/template/index.html‘, // 源模板文件
25           filename: ‘./index1.html‘, // 输出文件【注意:这里的根路径是module.exports.output.path】
26           showErrors: true,
27           inject: ‘body‘,
28           chunks: ["index"],
29           favicon:"./src/fav.ico",
30           hash:true,
31           minify:{
32                 caseSensitive: false, //是否大小写敏感
33                 removeComments:true, // 去除注释
34                 removeEmptyAttributes:true, // 去除空属性
35                 collapseWhitespace: true //是否去除空格
36             }
37       }),
38         new HtmlWebpackPlugin({
39           title:‘测试webpack‘,
40           template: ‘src/template/index.html‘, // 源模板文件
41           filename: ‘./index2.html‘, // 输出文件【注意:这里的根路径是module.exports.output.path】
42           showErrors: true,
43           inject: ‘body‘
44       })
45     ]
46 };

完整配置

时间: 2024-12-25 08:21:53

webpack学习笔记 (二) html-webpack-plugin使用的相关文章

webpack 学习笔记 01 使用webpack的原因

本系列文章实际上就是官网文档的翻译加上自己实践过程中的理解. 伴随着websites演化至web apps的过程,有三个现象是很明显的: 页面中有越来越多的Js. 客户端能做的事情越来越多. 越来越少的页面重载(当然也伴随着更复杂的代码). 这些现象导致了什么?大量的前端代码. 庞大的代码库需要被高效的组织.而Module(组件式)开发的系统即为大多数开发者采取的途径. MODULE SYSTEM STYLES 有很多种定义依赖,导出变量的标准或者说方法: <script> tag 的形式(不

webpack学习笔记一

webpack.gulp.grunt是前端打包功能工具:因为已经学习了gulp,而最近发现webpack很火,于是着手学习webpack.本篇是webpack学习笔记系列的第一篇,欢迎指教. 我是从慕课网以及官网文档相结合的方式学习的,从官方文档学到的第一个知识点是在使用webpack打包过程中,即使没有webpack.config,js这个文件也是可以的. 首先是全局安装webpack,cmd(如果是window系统,在任意位置)执行命令: npm install --g webpack或cn

webpack学习笔记八

webpack自动刷新浏览器 webpack开发服务器,是webpack官方提供的一个辅助开发工具,它可以自动监控项目下的文件,一旦有修改保存的操作,它就会自动执行打包命令,将我们的代码重新打包,并且需要的话还可以刷新浏览器. 首先我们安装webpack-dev-server 在CMD中安装执行npm intall webpack-dev-server -g 在项目目录执行安装依赖命令: npm install --save-dev webpack-dev-server 其中webpack-de

webpack学习笔记

webpack笔记 webpack学习笔记 1.全局安装 npm install webpack -g 2.作为项目依赖安装 npm install webpack --save-dev 3.安装css-loader.sass-loader.node-scss npm install css-loader sass-loader node-scss --save-dev 4.webpack配置 // webpack.config.js var path = require('path'); mo

马哥学习笔记二十六——MySQL主从复制

配置MySQL复制基本步骤: 一.master 1.启用二进制日志 log-bin = master-bin log-bin-index = master-bin.index 2.选择一个惟一server-id server-id = {0-2^32} 3.创建具有复制权限的用户 REPLICATION SLAVE REPLICATION CLIENT 二.slave 1.启用中继日志 relay-log = relay-log relay-log-index = 2.选择一个惟一的server

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它