作者回复: 这里面的热更新有最核心的是 HMR Server 和 HMR runtime。 HMR Server 是服务端,用来将变化的 js 模块通过 websocket 的消息通知给浏览器端。 HMR Runtime是浏览器端,用于接受 HMR Server 传递的模块数据,浏览器端可以看到 .hot-update.json 的文件过来。 继续回到这个问题:老师HotModuleReplacementPlugin是做什么用的? webpack 构建出来的 bundle.js 本身是不具备热更新的能力的,HotModuleReplacementPlugin 的作用就是将 HMR runtime 注入到 bundle.js,使得bundle.js可以和HMR server建立websocket的通信连接
作者回复: 嗯嗯,这里面也是出于演示 HMR Runtime
作者回复: 需要从两者的功能上来分析说明: webpack-dev-server(WDS)的功能提供 bundle server的能力,就是生成的 bundle.js 文件可以通过 localhost://xxx 的方式去访问,另外 WDS 也提供 livereload(浏览器的自动刷新)。 hot-module-replacement-plugin 的作用是提供 HMR 的 runtime,并且将 runtime 注入到 bundle.js 代码里面去。一旦磁盘里面的文件修改,那么 HMR server 会将有修改的 js module 信息发送给 HMR runtime,然后 HMR runtime 去局部更新页面的代码。因此这种方式可以不用刷新浏览器。 单独写两个包也是出于功能的解耦来考虑的。简单来说就是:hot-module-replacement-plugin 包给 webpack-dev-server 提供了热更新的能力。
作者回复: npm i webpack-dev-server -D,安装下这个包依赖
作者回复: 你需要在项目里面安装下这个依赖哈, npm i webpack-dev-server -D
作者回复: webpack-dev-server 默认是会在内容编译完成后自动刷新(liveload)浏览器的,此处增加了 HotModuleReplacementPlugin 插件之后可以做到 HMR的。如果HMR失败的化会降级使用 liveload 自动刷新浏览器模式。
作者回复: 嗯嗯,是的。这里引入 HotModuleReplacementPlugin 也是为了更好的说明热更新的 HMR runtime 的含义,就是通过这个插件给 bundle.js 注入 HMR runtime 的
作者回复: 是 One Monokai
作者回复: 这种情况下可以考虑把 node_modules删掉重新运行下 npm install
作者回复: 不会更新的,热更新的情况下是放在内存里的。 这个章节也讲到了,热更新分两个阶段,启动阶段还是依赖磁盘文件去编译。更新阶段是直接内存增量更新的