使用 ViteJS 检测 HMR 事件 React/SolidJS
Detect HMR event with ViteJS React/SolidJS
为 React / SolidJS 使用 ViteJS 启动器,
在代码更改触发 HMR 重新加载之前,我如何检测(使用某种 js 回调)? (做一些清理工作)
需要说明的是,我不是在问如何使用 HMR,而是在问如何在此之前进行一些清理。
我试过 window.onbeforeunload
没用。
谢谢。
window.onbeforeunload
不起作用,因为在 HMR 中页面永远不会重新加载。 HMR 的工作方式是用通过 websocket 接收的新模块修补现有模块。
您可以使用 HMR API 连接到更新管道。 https://vitejs.dev/guide/api-hmr.html#hot-accept-cb
您可以在接受补丁的模块中使用 accept
方法:
if (import.meta.hot) {
import.meta.hot.accept((newModule) => {
console.log(`Receving new module...`, newModule);
});
}
或者您可以在主文件中添加一个事件侦听器:
if (import.meta.hot) {
import.meta.hot.on('vite:beforeUpdate', () => {
console.log('Running before update!!');
});
}
或者,您可以使用 Service Worker 观看网络事件。创建一个 JavaScript 文件,其中包含监视获取事件的内容:
// sw.js
self.addEventListener('fetch', function(event) {
console.log(event);
});
并在您的主文件中注册服务工作者:
navigator.serviceWorker.register('/sw.js');
为 React / SolidJS 使用 ViteJS 启动器,
在代码更改触发 HMR 重新加载之前,我如何检测(使用某种 js 回调)? (做一些清理工作)
需要说明的是,我不是在问如何使用 HMR,而是在问如何在此之前进行一些清理。
我试过 window.onbeforeunload
没用。
谢谢。
window.onbeforeunload
不起作用,因为在 HMR 中页面永远不会重新加载。 HMR 的工作方式是用通过 websocket 接收的新模块修补现有模块。
您可以使用 HMR API 连接到更新管道。 https://vitejs.dev/guide/api-hmr.html#hot-accept-cb
您可以在接受补丁的模块中使用 accept
方法:
if (import.meta.hot) {
import.meta.hot.accept((newModule) => {
console.log(`Receving new module...`, newModule);
});
}
或者您可以在主文件中添加一个事件侦听器:
if (import.meta.hot) {
import.meta.hot.on('vite:beforeUpdate', () => {
console.log('Running before update!!');
});
}
或者,您可以使用 Service Worker 观看网络事件。创建一个 JavaScript 文件,其中包含监视获取事件的内容:
// sw.js
self.addEventListener('fetch', function(event) {
console.log(event);
});
并在您的主文件中注册服务工作者:
navigator.serviceWorker.register('/sw.js');