更多内容已经迁移至掘金,欢迎来指导学习:

https://juejin.im/post/5d64c358518825121f661cee

# html-webpack-plugin插件

1. 动态生成html文件并自动引入js文件
2. 静态文件无需加载js或css文件,通过设置入口文件可以将js文件自动添加进去,而相关的css文件在js中导入
3. 同时修改生成的js文件命名规则,利用hash码命名js文件
4. 没有改动时可以让浏览器缓存内容,当有改动重新部署后可以让浏览器缓存失效
 

# 安装

cnpm install html-webpack-plugin --save-dev
 

# 插件常用的参数

## title

打包生成的html文档的标题。配置该项,它并不会替换指定模板文件中的title元素的内容,除非html模板文件中使用了模板引擎语法来获取该配置项值
<title><%= htmlWebpackPlugin.options.title %></title>

## template:模板路径

  • 指定你生成的文件所依赖哪一个html文件模板,模板类型可以是html、jade、ejs等。但是要注意的是,如果想使用自定义的模板文件的时候,你需要安装对应的loader
  • 为template指定的模板文件没有指定任何loader的话,默认使用ejs-loader。如template: './index.html',若没有为.html指定任何loader就使用ejs-loader

## filename:一般是相对路径

  • 输出文件的文件名称,默认为index.html,还可以为输出文件指定目录位置(例如'html/index.html')
  • filename配置的html文件目录是相对于webpackConfig.output.path路径而言的,不是相对于当前项目目录结构的
  • 指定生成的html文件内容中的link和script路径是相对于生成目录下的,写路径的时候一般是生成目录下的相对路径

## templateContent: string|function

可以指定模板的内容,不能与template共存。配置值为function时,可以直接返回html字符串,也可以异步调用返回html字符串

## minify: {....}|false

传递 html-minifier 选项给 minify 输出,false就是不使用html压缩
minify: {
collapseWhitespace: true, //打包后是否删除空格(压缩)
removeAttributeQuotes: true // 移除属性的引号
},
  • caseSensitive(默认false):以区分大小写的方式处理属性(适用于定制的HTML标记)
  • collapseBooleanAttributes(默认false):从布尔属性中省略属性值
  • collapseInlineTagWhitespace Don't leave any spaces between display:inline;elements when collapsing. Must be used in conjunction with collapseWhitespace=true    false
  • collapseWhitespace  在显示之间不要留下任何空格:内联;崩溃时的元素。必须与折叠空间结合使用=true ?  false
  • conservativeCollapse 总是折叠到1个空间(永远不要完全删除它)。必须与折叠空间结合使用=true ?    false
  • customAttrAssign    允许支持自定义属性分配表达式的正则表达式数组。 (e.g. '<div flex?="{{mode != cover}}"></div>')  [ ]
  • customAttrCollapse  Regex指定自定义属性以从(例如/ng-class/)删除新行。
  • customAttrSurround  允许支持自定义属性包围表达式的正则表达式数组(e.g. <input {{#if value}}checked="checked"{{/if}}>)  [ ]
  • customEventAttributes   允许为minifyJS支持自定义事件属性的正则表达式数组(例如,ng-click)   [ /^on[a-z]{3,}$/ ]
  • decodeEntities  尽可能使用直接的Unicode字符。false
  • html5   根据HTML5规范分析输入。  true
  • ignoreCustomComments    当匹配时,允许忽略某些注释的正则表达式数组。  [ /^!/ ]
  • ignoreCustomFragments   当匹配时,允许忽略某些片段的正则表达式数组(例如<?php……吗?>,{ {…} },等等)。 [ /<%[\s\S]*?%>/, /<\?[\s\S]*?\?>/ ]
  • includeAutoGeneratedTags    插入由HTML解析器生成的标记。    true
  • keepClosingSlash    保留单例元素的末尾斜杠。    false
  • maxLineLength   指定最大行长度。压缩的输出将在有效的HTML分割点上被换行。
  • minifyCSS   缩小CSS样式元素和样式属性(usesclean-css)   false (could betrue, Object,Function(text))
  • minifyJS    在脚本元素和事件属性中缩小JavaScript(使用UglifyJS) false (could betrue, Object,Function(text, inline))
  • minifyURLs  在各种属性中缩小url(使用relateurl)    false (could beString, Object,Function(text))
  • preserveLineBreaks  当标记之间的空格包括换行符时,总是崩溃到1行中断(永远不要完全删除)。必须与折叠空间结合使用=true ?   false
  • preventAttributesEscaping   防止属性值的溢出。   false
  • processConditionalComments  通过minifier处理条件评论的内容。    false
  • processScripts  通过minifier(例如text/ng-template、text/x-handlebars-template等)来处理脚本元素类型的字符串数组。  [ ]
  • quoteCharacter  用于属性值的引用类型('or')
  • removeAttributeQuotes   在可能的情况下删除引号。    false
  • removeComments  带HTML注释 false
  • removeEmptyAttributes   删除所有的属性,只有whitespace-only的值。    false (could betrue,Function(attrName, tag))
  • removeEmptyElements 删除所有含有空内容的元素。   false
  • removeOptionalTags  删除可选的标记 false
  • removeRedundantAttributes   当值匹配默认值时删除属性。   false
  • removeScriptTypeAttributes  从脚本标签中删除type="text/javascript"。其他类型的属性值是完整的。false
  • removeStyleLinkTypeAttributes 从style和link标签中删除type="text/css"。其他类型的属性值是完整的。 false
  • removeTagWhitespace 尽可能在属性之间移除空间。注意,这将导致无效的HTML!    false
  • sortAttributes  根据频率属性进行排序  false
  • sortClassName   按频率分类样式类。   false
  • trimCustomFragments 在ignoreCustomFragments周围调整空白区域。 false
  • useShortDoctype 用short (HTML5) doctype替换doctype。    false

## chunks

  • 允许插入到模板中的一些chunk,不配置此项默认会将entry中所有的thunk注入到模板中
  • 在配置多个页面时,每个页面注入的thunk应该是不相同的,需要通过该配置为不同页面注入不同的thunk
  • chunks主要是选择使用你页面中呀加入的js
plugins: [
new httpWebpackPlugin({
chunks: ['index','main']
})
]
那么编译后:
<script type=text/javascript src="index.js"></script>
<script type=text/javascript src="main.js"></script>
 

## excludeChunks:排除掉一些js,用来配置不允许注入的thunk

## chunksSortMode: none | auto| function,默认auto

  • 允许指定的thunk在插入到html文档前进行排序。
  • function值可以指定具体排序规则
  • auto基于thunk的id进行排序
  • none就是不排序

## inject有四个值: true body head false

  • 向template或者templateContent中注入所有静态资源,不同的配置值注入的位置不经相同
  • true 默认值或body,所有JavaScript资源插入到body元素的底部
  • head script标签位于html文件的 head中
  • false 不插入生成的js文件,这个几乎不会用到的

## favicon

  • 添加特定favicon路径到输出的html文档中,这个同title配置项,需要在模板中动态获取其路径值
  • 结果是将生成的html文件生成一个 favicon ,值是一个路径 :favicon: 'path/to/my_favicon.ico',然后再生成的html中就有了一个 link 标签
  • <link rel="shortcut icon" href="example.ico">

## cache:true|fasle, 默认true

  • 表示内容变化的时候生成一个新的文件
  • 如果为true表示在对应的thunk文件修改后就会emit文件

## hash:布尔值,默认false

  • 是否为所有注入的静态资源添加webpack每次编译产生的唯一hash值,添加hash形式如下所示:
  • html <script type="text/javascript" src="common.js?a3e1396b501cdd9041be"></script>

## xhtml: true|fasle, 默认false

是否渲染link为自闭合的标签,true则为自闭合标签

## showErrors: true|false,默认true

是否将错误信息输出到html页面中

# 配置多个html页面例子

应用中配置了三个入口页面:index.html、course.html、about.html;并且每个页面注入的thunk不尽相同;类似如果多页面应用,就需要为每个页面配置一个;
// 需要暴露在全局(模块的导出)
// __dirname目录就是E:\MyLocalProject\webpackDemo
const path = require('path')
const htmlWebpackPlugin = require('html-webpack-plugin'); module.exports = {
entry: {
general: './src/skin/general/js/general.js',
index: './src/skin/index/js/index.js',
course: './src/skin/course/js/index.js',
about: './src/skin/about/js/index.js',
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'skin/[name]/[name].js', //必须是相对路径
publicPath: '../../'
},
module: {
rules: [
//配置babel,自动编译es6语法
{
test: /\.js$/,
exclude: /(node_modules)/,
loader: 'babel-loader'
}, ]
},
//插件的相关配置
plugins: [
//配置html文件
new htmlWebpackPlugin({
template: path.join(__dirname, '/src/static/index.html'),
filename: 'static/index.html',
minify: {
collapseWhitespace: true
},
hash: true,
favicon: 'favicon.ico',
chunks: ['general', 'index']
}),
new htmlWebpackPlugin({
template: path.join(__dirname, '/src/static/course/index.html'),
filename: 'static/course/index.html',
minify: {
collapseWhitespace: true,
},
hash: true,
favicon: 'favicon.ico',
chunks: ['general', 'course']
}),
new htmlWebpackPlugin({
template: path.join(__dirname, '/src/static/about/index.html'),
filename: 'static/about/index.html',
minify: {
collapseWhitespace: true
},
hash: true,
chunks: ['general', 'about'],
favicon: 'favicon.ico'
}),
]
}

项目结构:

# 配置自定义的模板

参考:https://www.cnblogs.com/wonyun/p/6030090.html

 
# 使用glob 扫描路径,自动配置html
// __dirname目录就是E:\MyLocalProject\webpackDemo
const path = require('path')
const htmlWebpackPlugin = require('html-webpack-plugin') //扫描入口目录static的路径
const glob = require("glob");
const staticHtmlPath = glob.sync('src/static/**/*.html'); //定义入口对象entrys
const entrys = {};
//设置公共的js入口文件
const commonJSObj = {
general: './src/skin/general/js/general.js',
}
Object.assign(entrys, commonJSObj) //定义html-webpack-plugin配置项
const htmlCfgs = [];
const htmlCfgsObj = {};
staticHtmlPath.forEach((filePath) => {
let path = filePath.split('/')
let pathLength = path.length
//获取文件名
let filename = path[pathLength - ].split('.')[] //动态配置入口文件路径
let entryJSName = path[pathLength - ] + '-' + filename
entrys[entryJSName] = './src/skin/' + path[pathLength - ] + '/js/' + filename + '.js';
htmlCfgs.push( //动态配置入口文件插件
new htmlWebpackPlugin({
template: filePath,
filename: filePath.replace('src', ''),
minify: {
collapseWhitespace: true
},
hash: true,
favicon: 'favicon.ico',
chunks: [entryJSName, 'general'],
})
)
}); module.exports = {
devtool: 'inline-source-map',
// 入口
entry: entrys,
// 出口
output: {
path: path.resolve(__dirname, 'dist'), //必须是绝对路径
filename: 'skin/[name]/[name].js', //必须是相对路径
publicPath: '../../'
},
// 开发服务器
devServer: {},
// 模块配置
module: {
rules: [
//配置babel,自动编译es6语法
{
test: /\.js$/,
exclude: /(node_modules)/,
loader: 'babel-loader'
},
]
},
//插件配置
plugins: htmlCfgs,
//配置解析
resolve: {}
}

glob自动扫描路径参考:https://blog.csdn.net/qq593249106/article/details/84964816

 
 
 
 

webpack.config.js====插件html-webpack-plugin的更多相关文章

  1. webpack.config.js====插件clean-webpack-plugin

    1. 安装:主要是用来清除重复文件,生成最新的的插件 就是说在编译文件的时候,先把 build或dist (就是放生产环境用的文件) 目录里的文件先清除干净,再生成新的带有hash值的文件 cnpm ...

  2. webpack.config.js====插件purifycss-webpack,提炼css文件

    1. 安装:打包编译时,可以删除一些html中没有使用的选择器,如果html页面中没有class=a class="b"的元素,.a{}.b{}样式不会加载 cnpm instal ...

  3. webpack.config.js配置遇到Error: Cannot find module '@babel/core'&&Cannot find module '@babel/plugin-transform-react-jsx' 问题

    下文是网上找到的方法,是因为版本冲突的原因,参照后安装7版本解决 cnpm install -D babel-loader@ babel-core babel-preset-env 一. 问题描述 在 ...

  4. [转]webpack4.0.1安装问题和webpack.config.js的配置变化

    本文转自:https://blog.csdn.net/jiang7701037/article/details/79403637 The CLI moved into a separate packa ...

  5. webpack前端构建工具学习总结(三)之webpack.config.js配置文件

    Webpack 在执行的时候,除了在命令行传入参数,还可以通过指定的配置文件来执行.默认情况下,会搜索当前目录的 webpack.config.js 文件,这个文件是一个 node.js 模块,返回一 ...

  6. webpack配置之webpack.config.js文件配置

    webpack配置之webpack.config.js文件配置 webpack.config.js webpack resolve  1.总是手动的输入webpack的输入输出文件路径,是一件非常繁琐 ...

  7. webpack.config.js====CSS相关:插件optimize-css-assets-webpack-plugin

    1. 安装:主要是用来压缩css文件 cnpm install --save-dev optimize-css-assets-webpack-plugin cssnano 2. webpack.con ...

  8. webpack3中文版使用参考文档--全面解析webpack.config.js

    Webpack目前官方发布的最新版本是3.1.0,相对于2.0的怎么本,在语法上没有变动,只是新增了功能.使用webpack,需要事先安装node.js,并对node.js生态有一些基本的了解,比如( ...

  9. webpack教程(二)——webpack.config.js文件

    首先我们需要安装一个webpack插件html-webpack-plugin,该插件的作用是帮助我们生成创建html入口文件.执行如下命令 npm install html-webpack-plugi ...

随机推荐

  1. echarts图表自适应

    当页面上只引入一个图表 window.onresize= () =>{ myEchart.resize() } 当引入多个时,上面的方法只会影响最后一个图表 window.addEventLis ...

  2. 《c# 实现p2p文件分享与传输系统》 一、 模型

    c#实现P2P文件分享与传输系统 一.模型 P2P的概念大家都不陌生,也就是所谓的“点对点传输”,即不直接通过服务器,在两台或多台客户端之间传输数据,实现信息交流和资源共享.P2P技术已经发展了很多年 ...

  3. C++的函数重载与C参数个数不一致时的编译

    C++的函数重载意味着函数名和返回值类型相同,但是参数个数和/或类型不同.在编译过程中编译器一般会把各个参数的类型连接到函数名内组成新的函数名,以区分各个重载函数. C语言不支持函数重载.但是有时候虽 ...

  4. 快速排序(java)

    快速排序是冒泡排序的优化,是一种非常高效的排序, 甚至是目前为止最高效的排序,其思想是这样的:设数组a中存放了n个数据元素,low为数组的低端下标,high为数组的高端下标,从数组a中任取一个元素(通 ...

  5. Hibernate延迟加载与opensessioninviewFilter

    转自:https://blog.csdn.net/skk_7/article/details/17917339 hibernate延迟加载: 一个person对应多个school,使用hibernat ...

  6. scores

    题意: m维偏序问题. 解法: 考虑对每一维按照每一个元素在这一维的数值分块,对于每一个块维护一个大小为 n 的bitset,表示前缀/后缀满足条件的元素集合. 对于每一个询问,我们可以枚举找到相应的 ...

  7. “找女神要QQ号码”——跟风篇java新手版(求指点)

    吃完粽子后闲来无事,于是准备在园子里面看看.突然看到了一个“找女神要QQ号码”的文章,顿时精力充沛了~~^_^. 该文章楼主说明此算法来自于<啊哈!算法>,图文并茂,非常不错.<啊哈 ...

  8. 连接带密码的access数据库

    在网上找了很多都不靠谱,稀里哗啦的弄一堆连接字符串,很不优雅. 这个方法很简单: 1.在“连接”这页中,下方有“输入登录数据库的信息”用户名:admin,并在下面选择“空白密码” 2.在“所有”这页的 ...

  9. WCF部署到IIS上调用报错:由于扩展配置问题而无法提供您请求的页面

    将WCF部署到全新win7 x64 IIS7.5上访问报错:由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 原因:IIS不识别.sv ...

  10. Google Analytics添加到网站

    把Google Analytics添加到网站的具体方式 https://developers.google.com/analytics/devguides/collection/analyticsjs ...