By
被删
更新日期:
最近项目中需要搭建一个多页面的环境,包括本地路由服务和分页面打包。
本节介绍开发部署时,实现热加载和页面刷新。
webpack插件
Express和Webpack
Express
本质是一系列middleware
的集合,因此,适合Express
的webpack
开发工具是webpack-dev-middleware
和webpack-hot-middleware
。
详细例子说明也可参考《Express结合Webpack的全栈自动刷新》。
webpack-dev-middleware
是一个处理静态资源的middleware
。
有时候我们无需使用到Express
,我们常常使用webpack-dev-server
开启动服务。
webpack-dev-server
实际上是一个小型Express
服务器,它也是用webpack-dev-middleware
来处理webpack
编译后的输出。
webpack-hot-middleware
是一个结合webpack-dev-middleware
使用的middleware
,它可以实现浏览器的无刷新更新(hot reload
)。
这也是webpack
文档里常说的HMR(Hot Module Replacement)。
实现热加载和页面刷新
其实如果将热加载定义为文件变动时重新编译的话,其实我们上一节已经完成了。
但热加载的功能,不搭配页面自动刷新的话,其实就不完整了呢。
需要调整三个地方:
- 每个页面入口需要添加
webpack-hot-middleware/client?reload=true
。
- 在webpack配置中添加plugin插件
new webpack.HotModuleReplacementPlugin()
。
- 在
Express
实例中添加中间件'webpack-hot-middleware'
。
故我们的代码为:
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
var path = require('path') var express = require('express') var utils = require('./utils') var webpack = require('webpack') var webpackConfig = require('./webpack.config') var HtmlWebpackPlugin = require('html-webpack-plugin') var WebpackDevMiddleware = require('webpack-dev-middleware') var WebpackHotMiddleware = require('webpack-hot-middleware')
var app = express()
var entries = utils.entries
var hotMiddlewareScript = 'webpack-hot-middleware/client?reload=true'
webpackConfig.entry = {}
webpackConfig.output.filename = '[name].js' webpackConfig.output.path = path.join(__dirname, 'dist')
Object.keys(entries).forEach(function (name) { webpackConfig.entry[name] = [entries[name], hotMiddlewareScript] var plugin = new HtmlWebpackPlugin({ filename: name + '.html', template: './index.html', inject: true, chunks: [name] }) webpackConfig.plugins.push(plugin) })
webpackConfig.plugins.push(new webpack.HotModuleReplacementPlugin())
var compiler = webpack(webpackConfig)
app.use(WebpackDevMiddleware(compiler, { publicPath: '/', stats: { colors: true, chunks: false }, progress: true, inline: true, hot: true }))
app.use(WebpackHotMiddleware(compiler))
app.get('/:pagename?', function (req, res, next) { var pagename = req.params.pagename ? req.params.pagename + '.html' : 'index.html'
var filepath = path.join(compiler.outputPath, pagename)
compiler.outputFileSystem.readFile(filepath, function (err, result) { if (err) { return next('输入路径无效,请输入目录名作为路径,有效路径有:\n/' + Object.keys(entries).join('\n/')) } res.set('content-type', 'text/html') res.send(result) res.end() }) })
module.exports = app.listen(8080, function (err) { if (err) { return }
console.log('Listening at http://localhost:8080\n') })
|
这样,我们就实现了代码的热加载以及页面自动刷新了。
结束语
本节我们讲述了在webpack中添加代码热加载和页面自动刷新的功能,主要使用了webpack-dev-middleware
和webpack-hot-middleware
两个插件工具。
可参考代码github-vue-multi-pages,主要是这套环境使用在vue上的demo。
查看Github有更多内容噢:https://github.com/godbasin
更欢迎来被删的前端游乐场边撸猫边学前端噢
如果你想要关注日常生活中的我,欢迎关注“牧羊的猪”公众号噢