perf: speed up app loading

This commit is contained in:
boos
2026-06-06 19:21:59 +08:00
parent 9c1e5ae293
commit ef0f91e683
8 changed files with 272 additions and 118 deletions
+31 -9
View File
@@ -15,6 +15,15 @@ const SiteTrendChart = lazy(
() => import("../components/charts/SiteTrendChart.js"),
);
function scheduleDashboardIdleWork(callback: () => void, timeout = 1600): () => void {
if (typeof requestIdleCallback === "function") {
const idleId = requestIdleCallback(callback, { timeout });
return () => cancelIdleCallback(idleId);
}
const timer = globalThis.setTimeout(callback, Math.min(timeout, 450));
return () => globalThis.clearTimeout(timer);
}
function getGreeting(): string {
const hour = new Date().getHours();
if (hour < 6) return "夜深了";
@@ -233,6 +242,7 @@ export default function Dashboard({
const [siteTrend, setSiteTrend] = useState<any[]>([]);
const [siteLoading, setSiteLoading] = useState(true);
const [sites, setSites] = useState<any[]>([]);
const [chartsReady, setChartsReady] = useState(false);
const [siteSpeedStates, setSiteSpeedStates] = useState<
Record<string, SiteSpeedState>
>({});
@@ -318,6 +328,8 @@ export default function Dashboard({
loadSiteStats();
}, [loadSiteStats]);
useEffect(() => scheduleDashboardIdleWork(() => setChartsReady(true)), []);
useEffect(() => {
let timer: ReturnType<typeof setInterval> | null = null;
let disposed = false;
@@ -1011,17 +1023,25 @@ export default function Dashboard({
<div className="dashboard-chart-grid">
<div className="chart-panel-enter animate-slide-up stagger-6">
<Suspense fallback={<ChartFallback height={320} />}>
<SiteDistributionChart
data={siteDistribution}
loading={siteLoading}
/>
</Suspense>
{chartsReady ? (
<Suspense fallback={<ChartFallback height={320} />}>
<SiteDistributionChart
data={siteDistribution}
loading={siteLoading}
/>
</Suspense>
) : (
<ChartFallback height={320} />
)}
</div>
<div className="chart-panel-enter animate-slide-up stagger-7">
<Suspense fallback={<ChartFallback height={320} />}>
<SiteTrendChart data={siteTrend} loading={siteLoading} />
</Suspense>
{chartsReady ? (
<Suspense fallback={<ChartFallback height={320} />}>
<SiteTrendChart data={siteTrend} loading={siteLoading} />
</Suspense>
) : (
<ChartFallback height={320} />
)}
</div>
</div>
@@ -1266,6 +1286,8 @@ export default function Dashboard({
</div>
{insightsLoading && !insightsData ? (
<ChartFallback height={260} />
) : !chartsReady ? (
<ChartFallback height={260} />
) : (
<Suspense fallback={<ChartFallback height={260} />}>
<ModelAnalysisPanel data={insightsData?.modelAnalysis} />
@@ -1,4 +1,3 @@
import { marked } from 'marked';
import { formatDateTimeLocal } from './checkinLogTime.js';
const VOID_TAGS = new Set(['br', 'hr', 'img']);
@@ -367,8 +366,7 @@ export function renderSiteAnnouncementHtml(content: string): string {
}
if (isLikelyMarkdown(raw)) {
const rendered = String(marked.parse(raw, { gfm: true, breaks: true }));
return sanitizeAnnouncementHtml(rendered || renderMarkdown(raw));
return sanitizeAnnouncementHtml(renderMarkdown(raw));
}
return renderPlainText(raw);