<meta name="app-version" content="20260317-abc123" />
function getCurrentVersion() {
return document
.querySelector('meta[name="app-version"]')
?.getAttribute('content');
}
async function fetchLatestVersionFromHtml() {
const res = await fetch(`/index.html?t=${Date.now()}`, {
cache: 'no-store'
});
const html = await res.text();
const match = html.match(
/<meta\s+name=["']app-version["']\s+content=["']([^"']+)["']/
);
return match ? match[1] : null;
}
// 发现新版本后,友好地提示用户刷新
function showUpdateDialog() {
const ok = window.confirm('系统已更新,是否立即刷新页面?');
if (ok) {
window.location.reload();
}
}
async function checkVersion() {
try {
const currentVersion = getCurrentVersion();
const latestVersion = await fetchLatestVersionFromHtml();
if (currentVersion && latestVersion && currentVersion !== latestVersion) {
showUpdateDialog();
}
} catch (err) {
console.error('版本检测失败:', err);
}
}
checkVersion();
setInterval(checkVersion, 5 * 60 * 1000);
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') {
checkVersion();
}
});
方案二:捕获 chunk 加载失败,作为最终兜底
如果说“版本检测 + 刷新提示”是在事前预防,
那么“chunk 加载失败自动恢复”就是最关键的事后兜底。
这一层非常重要,因为现实中总会遇到这样的情况:
- 版本检测还没来得及执行
- 用户刚好在检测间隔内点击了菜单
- 服务端刚完成发布
- 某个懒加载 chunk 已经失效
这时候,问题已经发生了。
如果没有兜底机制,用户就会直接看到报错或白屏。
常见错误形式
不同构建工具、浏览器环境下,报错信息可能略有差异,但常见的有:
Loading chunk xxx failed
ChunkLoadError
Failed to fetch dynamically imported module
这类错误本质上都可以理解为:
动态加载的资源拿不到了。
监听全局错误
可以通过以下方式统一拦截:
function isChunkLoadError(error) {
const message = error?.message || error?.reason?.message || '';
return (
message.includes('Loading chunk') ||
message.includes('ChunkLoadError') ||
message.includes('Failed to fetch dynamically imported module')
);
}
监听
error: