hot
2023年12月20日
一、认识
如果已经通过 HotModuleReplacementPlugin
启用了 Hot Module Replacement
, 则它的接口将被暴露在 module.hot
以及 import.meta.webpackHot
属性下。请注意,只有 import.meta.webpackHot
可以在 strict ESM
中使用。
1.1 启用
const webpack = require('webpack');
module.exports = {
plugins: [
new webpack.HotModuleReplacementPlugin()
]
};
1.2 访问
if (module.hot) {
module.hot.accept('./library.js', function () {
// 对更新过的 library 模块做些事情...
});
}
// or
if (import.meta.webpackHot) {
import.meta.webpackHot.accept('./library.js', function () {
// Do something with the updated library module…
});
}
二、import.meta.webpackHot.data
三、import.meta.webpackHot.accept
module.hot.accept
接受(accept
)给定 依赖模块(dependencies
) 的更新,并触发一个 回调函数 来响应更新
3.1 语法
接受自身更新
module.hot.accept(
errorHandler // 在计算新版本时处理错误的函数
);
// or
import.meta.webpackHot.accept(
errorHandler // Function to handle errors when evaluating the new version
);
module.hot.accept(
dependencies, // 可以是一个字符串或字符串数组
callback // 用于在模块更新后触发的函数
errorHandler // (err, {moduleId, dependencyId}) => {}
);
// or
import.meta.webpackHot.accept(
dependencies, // 可以是一个字符串或字符串数组
callback, // 用于在模块更新后触发的函数
errorHandler // (err, {moduleId, dependencyId}) => {}
);
四、import.meta.webpackHot.decline
module.hot.decline
拒绝给定依赖模块的更新,使用 decline
方法强制更新失败。
4.1 语法
module.hot.decline(
dependencies // 可以是一个字符串或字符串数组
);
// or
import.meta.webpackHot.decline(
dependencies // Either a string or an array of strings
);
将依赖模块标记为不可更新(not-update-able
)。在处理「依赖的导出正在更新」或「尚未实现处理」时,这是有意义的。取决于你的 HMR 管理代码, 此依赖模块(或其未接受的依赖模块)更新,通常会导致页面被完全重新加载。
五、import.meta.webpackHot.dispose
module.hot.dispose
添加一个处理函数,在当前模块代码被替换时执行。此函数应该用于移除你声明或创建的任何持久资源。如果要将状态传入到更新过的模块,请添加给定 data
参数。更新后,此对象在更新之后可通过 module.hot.data
调用。
5.1 语法
module.hot.dispose((data) => {
// 清理并将 data 传递到更新后的模块...
});
// or
import.meta.webpackHot.dispose((data) => {
// Clean up and pass data to the updated module...
});
六、import.meta.webpackHot.invalidate
module.hot.invalidate