perf: optimize polling, stats cache, and frontend chunk splitting

This commit is contained in:
2026-02-07 11:41:49 +08:00
parent 21c537da10
commit 04b94d7fb2
73 changed files with 516 additions and 203 deletions

View File

@@ -405,18 +405,51 @@ async function refreshAll(options = {}) {
}
}
const REPORT_POLL_ACTIVE_MS = 5000
const REPORT_POLL_HIDDEN_MS = 20000
let refreshTimer = null
function isPageHidden() {
if (typeof document === 'undefined') return false
return document.visibilityState === 'hidden'
}
function currentRefreshDelay() {
return isPageHidden() ? REPORT_POLL_HIDDEN_MS : REPORT_POLL_ACTIVE_MS
}
function stopRefreshLoop() {
if (!refreshTimer) return
clearTimeout(refreshTimer)
refreshTimer = null
}
function scheduleRefreshLoop() {
stopRefreshLoop()
refreshTimer = window.setTimeout(async () => {
refreshTimer = null
await refreshAll({ showLoading: false }).catch(() => {})
scheduleRefreshLoop()
}, currentRefreshDelay())
}
function onVisibilityChange() {
scheduleRefreshLoop()
}
onMounted(() => {
refreshAll({ showLoading: false })
refreshTimer = setInterval(() => refreshAll({ showLoading: false }), 5000)
.catch(() => {})
.finally(() => {
scheduleRefreshLoop()
})
window.addEventListener('visibilitychange', onVisibilityChange)
})
onUnmounted(() => {
if (refreshTimer) {
clearInterval(refreshTimer)
refreshTimer = null
}
stopRefreshLoop()
window.removeEventListener('visibilitychange', onVisibilityChange)
})
</script>

View File

@@ -8,5 +8,18 @@ export default defineConfig({
outDir: '../static/admin',
emptyOutDir: true,
manifest: true,
cssCodeSplit: true,
chunkSizeWarningLimit: 800,
rollupOptions: {
output: {
manualChunks(id) {
if (!id.includes('node_modules')) return
if (id.includes('/vue/') || id.includes('/vue-router/')) return 'vendor-vue'
if (id.includes('/element-plus/') || id.includes('/@element-plus/')) return 'vendor-element'
if (id.includes('/axios/')) return 'vendor-axios'
return 'vendor'
},
},
},
},
})