webpack热更新(总结二)

547 阅读2分钟

webpack-dev-server(WDS)

WDS通常和HotModuleReplacementPlugin一起使用,两者结合可以开启热更新的功能

优势:没有磁盘IO,不会输出文件,是将生成的文件放在内存中,而不是本地磁盘文件

功能:提供 bundle server的能力,即生成的 bundle.js 文件可以通过 localhost://xxx 的方式去访问,另外 WDS 也提供 livereload(浏览器的自动刷新)。

webpack-dev-middleware(WDM)

WDM将webpack输出的文件传输给服务器,适用于较灵活的场景,需再引入node server

热更新的实现

热更分为两个过程:

1. 启动阶段:文件系统进行编译,初始代码通过webpack compiler进行打包,打包好的文件传给bundle server(相当于服务器),bundle server会run这个文件,以server的方式让浏览器能够访问的到(1 -> 2 -> A -> B)

2. 文件变更:代码通过webpack compiler进行打包编译,编译后的代码还发送给HMR server,这时HMR server就会知道哪些模块(源代码编译的模块)发生了变更,然后会通过websoket以json的方式通知HRM runtime,HRM runtime就会更新代码,实现不刷新代码的更新(1 -> 2 -> 3 -> 4)

**HMR Server 是服务端:**用来将变化的 js 模块通过 websocket 的消息通知给浏览器端。

HMR Runtime是浏览器端:用于接受 HMR Server 传递的模块数据,浏览器端可以看到 .hot-update.json 的文件过来。

webpack构建出来的bundle.js本身是不具备热更新能力的HotModuleReplacementPlugin的作用是将HMR runtime注入到bundle.js,这样就实现了bundle.js可以和HMR server建立websocket的通信连接

Q:WDS HotModuleReplacementPlugin之间的关系

A:WDS 的功能提供 bundle server的能力,就是生成的 bundle.js 文件可以通过 localhost://xxx 的方式去访问,另外 WDS 也提供 livereload(浏览器的自动刷新)。

HotModuleReplacementPlugin 的作用是提供 HMR 的 runtime,并且将 runtime 注入到 bundle.js 代码里面去。一旦磁盘里面的文件修改,那么 HMR server 会将有修改的 js module 信息发送给 HMR runtime,然后 HMR runtime 去局部更新页面的代码。因此这种方式可以不用刷新浏览器。

单独写两个包也是出于功能的解耦来考虑的。简单来说就是:HotModuleReplacementPlugin 包给WDS提供了热更新的能力