fix(frontend): 菜单点击偶发无响应三处根因——①路由懒加载chunk失败被静默吞掉(新增onError自动整页重载+保险丝防循环) ②首页入口被权限接口阻塞(改乐观显示+缓存TTL10分钟+超时30s→8s) ③菜单hover预取目标页chunk(工具卡片/工作流步骤/顶部导航)

This commit is contained in:
2026-09-09 18:53:34 +08:00
parent 83cb3ff84e
commit 0cf20527a4
6 changed files with 139 additions and 14 deletions
+37
View File
@@ -135,4 +135,41 @@ const router = createRouter({
},
})
// 懒加载 chunk 加载失败(网络抖动/瞬间断流)会被 vue-router 静默吞掉,
// 菜单点击表现为"点了没反应";此处统一重载页面(重新拉最新 index.html 与新 chunk)。
// 用会话内计数做保险丝,网络持续异常时最多重载 2 次,不再死循环。
router.onError((error) => {
const message = String((error as Error)?.message || '')
const isChunkLoadError =
message.includes('Failed to fetch dynamically imported module') ||
message.includes('Importing a module script failed')
if (isChunkLoadError) {
const RELOAD_KEY = 'spa-chunk-reload-count'
let count = 0
try {
count = Number(sessionStorage.getItem(RELOAD_KEY) || '0') || 0
} catch {
/* 存储不可用时按首次处理 */
}
if (count < 2) {
try {
sessionStorage.setItem(RELOAD_KEY, String(count + 1))
} catch {
/* 忽略存储异常 */
}
console.error(`[router] 页面资源加载失败,重载页面(第 ${count + 1} 次):`, error)
window.location.reload()
return
}
try {
sessionStorage.removeItem(RELOAD_KEY)
} catch {
/* 忽略存储异常 */
}
console.error('[router] 页面资源多次加载失败,停止重载:', error)
} else {
console.error('[router] 路由导航失败:', error)
}
})
export default router