文章目录
  1. 1. webpack插件
    1. 1.1. Express和Webpack
    2. 1.2. webpack-dev-middleware
    3. 1.3. webpack-hot-middleware
    4. 1.4. 实现热加载和页面刷新
  2. 2. 结束语

最近项目中需要搭建一个多页面的环境,包括本地路由服务和分页面打包。
本节介绍开发部署时,实现热加载和页面刷新。

webpack插件


Express和Webpack

Express本质是一系列middleware的集合,因此,适合Expresswebpack开发工具是webpack-dev-middlewarewebpack-hot-middleware
详细例子说明也可参考《Express结合Webpack的全栈自动刷新》

webpack-dev-middleware

webpack-dev-middleware是一个处理静态资源的middleware

有时候我们无需使用到Express,我们常常使用webpack-dev-server开启动服务。
webpack-dev-server实际上是一个小型Express服务器,它也是用webpack-dev-middleware来处理webpack编译后的输出。

webpack-hot-middleware

webpack-hot-middleware是一个结合webpack-dev-middleware使用的middleware,它可以实现浏览器的无刷新更新(hot reload)。
这也是webpack文档里常说的HMR(Hot Module Replacement)。

实现热加载和页面刷新

其实如果将热加载定义为文件变动时重新编译的话,其实我们上一节已经完成了。
但热加载的功能,不搭配页面自动刷新的话,其实就不完整了呢。

需要调整三个地方:

  1. 每个页面入口需要添加webpack-hot-middleware/client?reload=true
  2. 在webpack配置中添加plugin插件new webpack.HotModuleReplacementPlugin()
  3. 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
// build/dev-server.js
// dev-server.js
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')

// Express实例
var app = express()

// 获取页面目录
var entries = utils.entries
// entry中添加HotUpdate地址
var hotMiddlewareScript = 'webpack-hot-middleware/client?reload=true'

// 重置入口entry
webpackConfig.entry = {}
// 设置output为每个页面[name].js
webpackConfig.output.filename = '[name].js'
webpackConfig.output.path = path.join(__dirname, 'dist')

Object.keys(entries).forEach(function (name) {
// 每个页面生成一个entry
// 这里修改entry实现HotUpdate
webpackConfig.entry[name] = [entries[name], hotMiddlewareScript]

// 每个页面生成一个[name].html
var plugin = new HtmlWebpackPlugin({
// 生成出来的html文件名
filename: name + '.html',
// 每个html的模版,这里多个页面使用同一个模版
template: './index.html',
// 自动将引用插入html
inject: true,
// 每个html引用的js模块,也可以在这里加上vendor等公用模块
chunks: [name]
})
webpackConfig.plugins.push(plugin)
})

webpackConfig.plugins.push(new webpack.HotModuleReplacementPlugin())

// webpack编译器
var compiler = webpack(webpackConfig)

// webpack-dev-server中间件
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)

// 使用webpack提供的outputFileSystem
compiler.outputFileSystem.readFile(filepath, function (err, result) {
if (err) {
// something error
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) {
// do something
return
}

console.log('Listening at http://localhost:8080\n')
})

这样,我们就实现了代码的热加载以及页面自动刷新了。

结束语


本节我们讲述了在webpack中添加代码热加载和页面自动刷新的功能,主要使用了webpack-dev-middlewarewebpack-hot-middleware两个插件工具。
可参考代码github-vue-multi-pages,主要是这套环境使用在vue上的demo。

码生艰难,写文不易,给我家猪囤点猫粮了喵~

B站: 被删

查看Github有更多内容噢:https://github.com/godbasin
更欢迎来被删的前端游乐场边撸猫边学前端噢

如果你想要关注日常生活中的我,欢迎关注“牧羊的猪”公众号噢

作者:被删

出处:https://godbasin.github.io

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

文章目录
  1. 1. webpack插件
    1. 1.1. Express和Webpack
    2. 1.2. webpack-dev-middleware
    3. 1.3. webpack-hot-middleware
    4. 1.4. 实现热加载和页面刷新
  2. 2. 结束语