perf(frontend): 收敛导航预取并去重首屏请求

- 导航预取仅保留 pointerdown 触发,移除 mouseenter/focus,避免鼠标划过误触发
- 后台预取只做组件懒加载,不再预取各页业务数据,减少首屏资源争抢
- 版本状态检查增加 sessionStorage 缓存(正常 20 分钟 / 错误 5 分钟 TTL)
- fetchModules、必读公告拉取增加请求去重,避免并发重复请求
- 更新检查改用可清理的定时器,组件卸载时清理
- UsageRecordsTable 搜索防抖改为自定义实现,卸载时取消挂起 emit 并补充测试
This commit is contained in:
elky
2026-07-01 20:42:52 +08:00
parent a0f7074e59
commit 2e5ff32e1a
6 changed files with 158 additions and 110 deletions
+19 -10
View File
@@ -9,25 +9,34 @@ export const useModuleStore = defineStore('modules', () => {
const loaded = ref(false)
const loading = ref(false)
const error = ref<string | null>(null)
let fetchModulesPromise: Promise<Record<string, ModuleStatus>> | null = null
/**
* 获取所有模块状态
*/
async function fetchModules() {
if (loading.value) return
if (fetchModulesPromise) return fetchModulesPromise
loading.value = true
error.value = null
try {
modules.value = await modulesApi.getAllStatus()
loaded.value = true
} catch (err: unknown) {
log.error('Failed to fetch modules status', err)
error.value = parseApiError(err, '获取模块状态失败')
} finally {
loading.value = false
}
fetchModulesPromise = (async () => {
try {
const nextModules = await modulesApi.getAllStatus()
modules.value = nextModules
loaded.value = true
return nextModules
} catch (err: unknown) {
log.error('Failed to fetch modules status', err)
error.value = parseApiError(err, '获取模块状态失败')
throw err
} finally {
loading.value = false
fetchModulesPromise = null
}
})()
return fetchModulesPromise
}
/**