- 自动化生成项目中HTML页面(上)
使用场景:webpack可以处理js文件,那html中引入的JS文件,如果使用hash值命名,每次打包不一致,可以使用html-webpack-plugin去动态生成html页面,起到每次更新JS导入的作用
安装npm i html-webpack-plugin@3.0.7 —save-dev
在webpack中使用插件,代码如下:
var htmlWebpackPlugin = require("html-webpack-plugin");// 存在一个上下文就是根目录module.exports = {entry: {main: "./src/script/main.js",a: "./src/script/a.js"},//打包入口output: {path: "./dist",//打包之后文件的存放路径filename: "js/[name]-[chunkhash].js"//打包之后的文件名},plugins:[new htmlWebpackPlugin({filename:"index-[hash].html",//html处理之后的文件名template:'index.html',//以根目录下的index.html为模板inject:"head" //js文件在<head></head>引入,还是在<body></body>引入})]}
- 自动化生成项目中HTML页面(中)
- 调用htmlWebpackPlugin插件时,传入的模板(index.html)中,可以获取htmlWebpackPlugin的属性参数(备注:直接取值<%= %> 执行表达式:<% %>)
```javascript
var htmlWebpackPlugin = require(“html-webpack-plugin”);
// 存在一个上下文就是根目录
module.exports = {
entry: {
main: “./src/script/main.js”,
a: “./src/script/a.js”
},//打包入口
output: {
path: “./dist”,//打包之后文件的存放路径
filename: “js/[name]-[chunkhash].js”//打包之后的文件名
},
plugins: [
new htmlWebpackPlugin({
}) ] }filename: "index.html",//html处理之后的文件名 index-[hash].html 此处的名字可以使用hashtemplate: 'index.html',//以根目录下的index.html为模板inject: true, //js文件在<head></head>引入,还是在<body></body>引入title: "webpack is good",date: new Date()
```html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title><%= htmlWebpackPlugin.options.title%></title><script src="bundle.js" type="text/javascript"></script></head><!-- 直接取值<%= %> 执行表达式:<% %> --><body><% for(var key in htmlWebpackPlugin){%><%= key +":"+ JSON.stringify(htmlWebpackPlugin[key]) %><% } %></body></html>
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>webpack is good</title><script src="bundle.js" type="text/javascript"></script><script type="text/javascript" src="js/main-2f0460e5ccb816026595.js"></script><script type="text/javascript" src="js/a-1ceb4b79e006a83c7f37.js"></script></head><body>files:{"publicPath": "","chunks": {"main": {"size": 211,"entry": "js/main-2f0460e5ccb816026595.js","hash": "2f0460e5ccb816026595","css": []},"a": {"size": 177,"entry": "js/a-1ceb4b79e006a83c7f37.js","hash": "1ceb4b79e006a83c7f37","css": []}},"js": ["js/main-2f0460e5ccb816026595.js","js/a-1ceb4b79e006a83c7f37.js"],"css": []}options:{"template": "D:\\OpenSource\\webpack-demo\\node_modules\\html-webpack-plugin\\lib\\loader.js!D:\\OpenSource\\webpack-demo\\index.html","filename": "index.html","hash": false,"inject": "head","compile": true,"favicon": false,"minify": false,"cache": true,"showErrors": true,"chunks": "all","excludeChunks": [],"title": "webpack is good","xhtml": false}</body></html>
- 需求限定JS位置
```javascript
var htmlWebpackPlugin = require(“html-webpack-plugin”);
// 存在一个上下文就是根目录
module.exports = {
entry: {
},//打包入口 output: {main: "./src/script/main.js",a: "./src/script/a.js"
}, plugins: [path: "./dist",//打包之后文件的存放路径filename: "js/[name]-[chunkhash].js"//打包之后的文件名
] }new htmlWebpackPlugin({filename: "index.html",//html处理之后的文件名 index-[hash].html 此处的名字可以使用hashtemplate: 'index.html',//以根目录下的index.html为模板inject: false, //js文件在<head></head>引入,还是在<body></body>引入title: "webpack is good",})
```html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title><%=htmlWebpackPlugin.options.title%></title><script type="text/javascript" src="<%= htmlWebpackPlugin.files.chunks.main.entry %>"></script></head><body><script type="text/javascript" src="<%= htmlWebpackPlugin.files.chunks.a.entry %>"></script></body></html>
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>webpack is good</title><script type="text/javascript" src="js/main-2f0460e5ccb816026595.js"></script></head><body><script type="text/javascript" src="js/a-1ceb4b79e006a83c7f37.js"></script></body></html>
- publicPath属性,发布到服务器之后的域名地址
```javascript
var htmlWebpackPlugin = require(“html-webpack-plugin”);
// 存在一个上下文就是根目录
module.exports = {
entry: {
main: “./src/script/main.js”,
a: “./src/script/a.js”
},//打包入口
output: {
path: “./dist”,//打包之后文件的存放路径
filename: “js/[name]-[chunkhash].js”,//打包之后的文件名
publicPath:”http://cdn.com"//发布服务器地址
},
plugins: [
new htmlWebpackPlugin({
}) ] }filename: "index.html",//html处理之后的文件名 index-[hash].html 此处的名字可以使用hashtemplate: 'index.html',//以根目录下的index.html为模板inject: false, //js文件在<head></head>引入,还是在<body></body>引入title: "webpack is good",
```javascript<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>webpack is good</title><script type="text/javascript" src="http://cdn.com/js/main-c87d8b38bcd1c10a0a9b.js"></script></head><body><script type="text/javascript" src="http://cdn.com/js/a-cbbbe45dd56850a7c396.js"></script></body></html>
- index.html文件压缩,还有很多属性,自行上官网学习
```javascript var htmlWebpackPlugin = require(“html-webpack-plugin”); // 存在一个上下文就是根目录 module.exports = { entry: {minify: {removeComments: true,//删除注释collapseWhitespace: true//去掉空格}
},//打包入口 output: {main: "./src/script/main.js",a: "./src/script/a.js"
}, plugins: [path: "./dist",//打包之后文件的存放路径filename: "js/[name]-[chunkhash].js",//打包之后的文件名publicPath: "http://cdn.com"//发布服务器地址
] }new htmlWebpackPlugin({filename: "index.html",//html处理之后的文件名 index-[hash].html 此处的名字可以使用hashtemplate: 'index.html',//以根目录下的index.html为模板inject: false, //js文件在<head></head>引入,还是在<body></body>引入title: "webpack is good",date: new Date(),minify: {removeComments: true,//删除注释collapseWhitespace: true//去掉空格}})
3. 自动化生成项目中HTML页面(下)处理多页面应用情况(添加多个htmlWebpackPlugin实例):- chunks属性,页面导入指定JS- excludeChunks属性,除了指定的JS的,其它的JS都导入- htmlWebpackPlugin.files.chunks在html中获取的就是webpack.config.js指定的JS```javascriptlet htmlWebpackPlugin = require("html-webpack-plugin");// 存在一个上下文就是根目录module.exports = {entry: {main: "./src/script/main.js",a: "./src/script/a.js",b: "./src/script/b.js",c: "./src/script/c.js",},//打包入口output: {path: "./dist",//打包之后文件的存放路径filename: "js/[name]-[chunkhash].js",//打包之后的文件名publicPath: "http://cdn.com"//发布服务器地址},plugins: [new htmlWebpackPlugin({filename: "a.html",//html处理之后的文件名 index-[hash].html 此处的名字可以使用hashtemplate: 'index.html',//以根目录下的index.html为模板inject: "body", //js文件在<head></head>引入,还是在<body></body>引入title: "This is a.html",date: new Date(),chunks:['main','a'],//导入main和aminify: {removeComments: true,//删除注释collapseWhitespace: true//去掉空格}}),new htmlWebpackPlugin({filename: "b.html",//html处理之后的文件名 index-[hash].html 此处的名字可以使用hashtemplate: 'index.html',//以根目录下的index.html为模板inject: "body", //js文件在<head></head>引入,还是在<body></body>引入title: "This is b.html",excludeChunks:['c','a'],//除了a,c都导入date: new Date(),minify: {removeComments: true,//删除注释collapseWhitespace: true//去掉空格}}),new htmlWebpackPlugin({filename: "c.html",//html处理之后的文件名 index-[hash].html 此处的名字可以使用hashtemplate: 'index.html',//以根目录下的index.html为模板inject: "body", //js文件在<head></head>引入,还是在<body></body>引入title: "This is c.html",excludeChunks:['b','a'],//除了a,b都导入date: new Date(),minify: {removeComments: true,//删除注释collapseWhitespace: true//去掉空格}})]}
注意:inject设定为head或者是body会加入页面所需js,false表示自定义
- 导入初始化的main.js内容,不适用cdn(网络请求的方式加载)
```javascriptcompilation.assets[htmlWebpackPlugin.files.chunks.main.entry.substr(htmlWebpackPlugin.files.publicPath.length)].source()
let htmlWebpackPlugin = require(“html-webpack-plugin”);
// 存在一个上下文就是根目录
module.exports = {
entry: {
main: “./src/script/main.js”,
a: “./src/script/a.js”,
b: “./src/script/b.js”,
c: “./src/script/c.js”,
},//打包入口
output: {
path: “./dist”,//打包之后文件的存放路径
filename: “js/[name]-[chunkhash].js”,//打包之后的文件名
publicPath: “http://cdn.com"//发布服务器地址
},
plugins: [
new htmlWebpackPlugin({
filename: “a.html”,//html处理之后的文件名 index-[hash].html 此处的名字可以使用hash
template: ‘index.html’,//以根目录下的index.html为模板
inject: false, //js文件在引入,还是在引入
title: “This is a.html”,
date: new Date(),
chunks: [‘main’, ‘a’],//导入main和a
minify: {
removeComments: true,//删除注释
collapseWhitespace: true//去掉空格
}
}),
new htmlWebpackPlugin({
filename: “b.html”,//html处理之后的文件名 index-[hash].html 此处的名字可以使用hash
template: ‘index.html’,//以根目录下的index.html为模板
inject: false, //js文件在引入,还是在引入
title: “This is b.html”,
excludeChunks: [‘c’, ‘a’],//除了a,c都导入
date: new Date(),
minify: {
removeComments: true,//删除注释
collapseWhitespace: true//去掉空格
}
}),
new htmlWebpackPlugin({
filename: “c.html”,//html处理之后的文件名 index-[hash].html 此处的名字可以使用hash
template: ‘index.html’,//以根目录下的index.html为模板
inject: false, //js文件在引入,还是在引入
title: “This is c.html”,
excludeChunks: [‘b’, ‘a’],//除了a,b都导入
date: new Date(),
minify: {
removeComments: true,//删除注释
collapseWhitespace: true//去掉空格
}
})
]
}
```html<!--模板html--><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title><%=htmlWebpackPlugin.options.title%></title><!-- 导入初始化JS,无需请求网络优化 --><%=compilation.assets[htmlWebpackPlugin.files.chunks.main.entry.substr(htmlWebpackPlugin.files.publicPath.length)].source() %></head><body><% for(var key in htmlWebpackPlugin.files.chunks){ %><% if(key != 'main' ){ %><script src="<%= htmlWebpackPlugin.files.chunks[key].entry %>" type="text/javascript"></script><% } %><% } %></body></html>
