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