联系方式: QQ:249806703 | email:lcxfs1991@gmail.com
之前,我一直使用html-webpack-plugin 插件. 可是,这个插件有比较大的问题。当我使用inject模式的时候,我需要去筛走我不需要的入口文件。除此之外,如果我想加一些例如async这样的属性给我的script标签,也基本是不可能的事。如果我使用非inject模式,md5的自带特性将无法使用,更不用说资源内联了。
这就是我为什么要写一个全新的插件的原因,新的插件使用起来将会更加简单明了。
src/index.html --> dist/index.html
<!DOCTYPE html>
<html lang="en" id="html">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-dns-prefetch-control" content="on" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, minimal-ui" />
<title>html-res-webpack-example</title>
<link rel="stylesheet" href="/css/preview/preview.css">
</head>
<body>
<div class="preview-wrapper"></div>
<script src="/js/common.js"></script>
<script src="/js/preview/preview.js?__inline"></script>
</body>
</html>
src/page/preview/main.js --> dist/js/preview/preview.js
require('./index.scss');
var init = function() {
// some code here
};
src/page/preview/index.scss --> dist/css/preview/preview.css
html, body {
margin: 0;
}
// some code here
webpack.config.js
var config = {
hash: "-[hash:6]",
chunkhash: "-[chunkhash:6]",
};
entry: {
'preivew/preview': [path.join(config.path.src, "/page/preview/main.js")],
},
/**
* webpack options below
*/
.
.
.
output: {
publicPath: (config.env === 'prod') ? config.cdn : config.defaultPath,
path: path.join(config.path.dist),
filename: "js/[name]" + config.chunkhash + ".js"
},
.
.
.
plugins: [
// some other plugins
new ExtractTextPlugin("./css/[name]" + config.chunkhash + ".css"),
new HtmlResWebpackPlugin({
filename: "index.html",
template: "src/index.html",
jsHash: "[name]" + config.chunkhash + ".js",
cssHash: "[name]" + config.chunkhash + ".css"
});
]
package.json
"scripts": {
"dev": "webpack --progress --colors --watch",
"publish-mac": "export NODE_ENV=prod&&webpack -p --progress --colors",
"publish-windows": "SET NODE_ENV=prod&&webpack -p --progress --colors"
},
如果webpack使用watch模式(就是说,项目正在开发中),md5和资源内联功能都不会被使用。如果webpack在production(生产)模式,插件将会给文件添上md5或者将其内联。
另一个值得提的是hash(哈希)。如果你想给js添加hash,使用jsHash
参数,与webpack的output
参数filename
一致,除去它的生成位置。如果你想给css添加hash,请使用cssHash
,跟ExtractTextPlugin
输入的参数一致,除了它的生成目录。
有一个需要提及的是,hash与chunkhash的不同点在于,hash对于所有资源都是一样的,而每个入口文件却只有一个自己的chunkhash(如果你使用extract-text-webpack-plugin插件,在入口js文件里被引用的样式文件,则会共享相同的chunkhash)。
如果使用ExtractTextPlugin
插件,热替换的功能无法兼容样式的更新,所以,你在开发模式下需要去掉ExtractTextPlugin
插件。然而,你放在html里的<link>
元素会显示404报错,因为css的代码都已内联。此时,请将isHotReload
为true。
有时候,一个项目会有多于一个html文件。这种情况下,请对每个html文件添加对应的一个HtmlResWebacpk插件。
var config = {
hash: "-[hash:6]",
chunkhash: "-[chunkhash:6]",
};
var route = ['index', 'detail'];
route.forEach(function(item) {
var htmlResWebpackPlugin = new HtmlResWebpackPlugin({
filename: item + ".html",
template: "src/" + item + ".html",
jsHash: "[name]" + config.chunkhash + ".js",
cssHash: "[name]" + config.chunkhash + ".css",
htmlMinify:{
removeComments: true,
collapseWhitespace: true,
}
});
webpackConfig.plugins.push(htmlResWebpackPlugin);
});
index.html
<head>
<link rel="shortcut icon" type="image/x-icon" href="./favicon.ico">
<link rel="icon" type="image/x-icon" href="./favicon.ico">
</head>
webpack.config.js
new HtmlResWebpackPlugin({
filename: "index.html",
template: "src/index.html",
favicon: "src/favicon.ico",
}),
new HtmlResWebpackPlugin({
filename: "index.html",
template: "src/index.html",
templateContent: function(tpl) {
// 你可以在这里修改html内容tpl
// 你也可以在这里使用this.options
// 打开插件的index.js可以查看都有哪些option提供使用
return tpl;
}
}),
filename
: 生成的html文件名template
: html模板来源jsHash
: "[name]" + config.chunkhash + ".js" (example)cssHash
: "[name]" + config.chunkhash + ".css" (example)htmlMinify
: 请查看html-minifier
[https://github.com/kangax/html-minifier]文档. 如果设为false | null, html文件则不会被压缩isHotReload
: 如果设为真,元素会被忽略favicon
: favicon路径, 如: "src/favicon.ico"templateContent
: 这里可提供给开发者在输出前修改html内容。this.options
在这里也可以被使用
因为这只是v0.0.6版本,我可能会漏掉一些项目的场景。请给我发issue或者发邮件,我会尽快帮你解决问题(通常24小时之内)并不断优化这个插件。
- v0.0.1 html生成及相关js,css资源内联
- v0.0.2 使生成的文件名和哈希可定制化
- v0.0.3 支持生成favicon文件
- v0.0.4 修复针对某些资源添加前缀或添加md5的错误
- v0.0.5 添加templateContent函数以提供定制化修改html的办法
- v0.0.7 适应webpack2.0