本文主要是介绍webpack-模块热替换剖析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
webpack-模块热替换剖析 目录
文章目录
- 前言
- 推荐阅读
- 前提
- `HMR`
- 应用
- 开启`HMR`
- 开启`webpack-dev-server`的`HMR`
- 手动添加代码
- `HMR`原理
- 步骤
前言
- 主要讲解热更新的原理
推荐阅读
- 《webpack实战 入门、进阶与调优》
前提
- 早期调试代码基本都是
改代码 - 刷新网页 - 查看 - 修改代码
- 第一次提升效率:工具检测到代码改动,自动重新构建,然后触发网页刷新,称为:
live reload
- 第二次提升:
webpack
不刷新的前提下得到改动,甚至不需要重新发起请求就能看到更新后的效果,成为:模块热替换功能(Hot Module Replacement
),简称HMR
HMR
- 保留页面当前状态的前提下呈现出最新的改动,节省时间成本
应用
- 复杂系统每改动一次,要经历资源重构建、网络请求、浏览器渲染等过程,需要几十秒
- 调式页面很深的层级,有时候需要人配合验证
开启HMR
- 基于
webpack-dev-server
或者webpack-dev-middle
,webpack
本身不支持HMR
开启webpack-dev-server
的HMR
npm i webpack-dev-server -D
const webpack = require('webpack');
module.exports = {plugins: [new webpack.HotModuleReplacementPlugin()],devServer: {hot: true,},
};
- 注意:
webpack-cli
的版本需要为3.3.10
,才能和web-pack-server
一起使用
调用HMR API
有两种方式:
- 手动地添加代码
- 利用现成的工具:
react-hot-loader, vue-loader
手动添加代码
// index.js
import { add } from 'util.js';
add(2, 3);if(module.hot) {module.hot.accept();
}
- 当发现有模块发生变动时,
HMR
会再当前浏览器环境下重新执行一遍index.js
,但是页面本身不会刷新
HMR
原理
- 在开启
HMR
的状态下进行开发,会出现资源的体积比原本的大,因为webpack
会注入很多相关的代码 - 在本地开发环境下,浏览器是客户端,
webpack-dev-seerver
(WDS
)相当于服务端 HMR
的核心:客户端从服务端拉取更新后的资源(不是拉取整个资源文件,而是chunk diff
,即chunk
需要更新的部分)
步骤
- 浏览器拉取更新的时间。
WDS
对本地源文件进行监听,与浏览器之间构建了一个websocket
- 当本地资源发生变化时,
WDS
会向浏览器推送更新事件,并带上本次构建的hash
,让客户端与上一次资源进行比对 - 通过
hash
比对可以防止冗余更新的出现 live reload
也是依赖websocket
实现的
- 拉取资源内容。
- 客户端如果知道了新的构建结果和当前的有了差别,就会向
WDS
发起一个请求来获取更改文件的列表,即哪些模块有了改动 - 通常这个请求的名字为:
[hash].hot-update.json
- 客户端返回:
main.[hash].hot-update.js
这篇关于webpack-模块热替换剖析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!