这是个小众场景,因为现在webpack大多是和react配合使用,react并不需要在html中添加过多内容,所以可能关注不是很多,我之前研究webpack,希望可以配合jQuery做基础的前端技术栈的打包,所以希望可以热更新HTML。
首先我们需要理解的是webpack所有文件皆是JS模块,我们在entry里定义了某些入口文件,通过webpack处理这些入口文件内部的依赖,最后打包到output里的目录中去。按照这个思路,我们可以把html文件也当成一个js模块,在js入口文件中引入,这样webpack的HRM就可以监听到这个html模块了,自然就可以做到热更新!
通过这个思路,我们需要一个转义html文件的插件:raw-loader
首先我们安装raw-loader
1
| npm install --save-dev raw-loader
|
webpack配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| var path = require('path') var webpack = require('webpack') var HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = { devtool: 'cheap-eval-source-map', entry: [ 'webpack-dev-server/client?http://localhost:8080', 'webpack/hot/dev-server', './src/index' ], output: { path: path.join(__dirname, 'dist'), filename: 'bundle.js' }, plugins: [ new webpack.HotModuleReplacementPlugin(), new HtmlWebpackPlugin({ template: './src/index.html' }) ], module: { loaders: [{ test: /\.css$/, loaders: ['style', 'css'] }, { test: /\.html$/, loader: "raw-loader" }] }, devServer: { contentBase: './dist', hot: true } }
|
这样我们在入口文件引入html文件:
1 2
| require('./index.html')
|
现在就可以做到热更新了,但是我们还需要区分一下本地和生产环境,不然生产环境会把html打包进去。配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| var path = require('path') var webpack = require('webpack') var HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = { devtool: 'source-map', entry: ['./src/index'], output: { path: path.join(__dirname, 'dist'), filename: 'bundle.js' }, plugins: [ new webpack.optimize.UglifyJsPlugin({ compressor: { warnings: false, }, }), new webpack.optimize.OccurenceOrderPlugin(), new HtmlWebpackPlugin({ template: './src/index.html' }), new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify('production') }) ], module: { loaders: [{ test: /\.css$/, loaders: ['style', 'css'] }] } }
|
1 2 3 4
| if (process.env.NODE_ENV !== 'production') { require('./index.html') }
|
参考:
https://github.com/AriaFallah/WebpackTutorial/tree/master/part1/html-reload