提示:本网站现在为维护调试状态

前端性能優化:Core Web Vitals 實戰

Choyeon
Choyeon
2026年9月15日 1 分鐘閱讀 296 閱讀
482 字 1,579 字元 更新於 2026年11月8日
前端性能優化:Core Web Vitals 實戰
目錄

前端性能优化:Core Web Vitals (LCP/CLS/INP) 实战

自 2021 年起 Google 把 Core Web Vitals 纳入搜索排名因子,性能不再只是体验问题,而是直接影响业务增长。三个指标分别衡量加载/稳定/流畅的用户直观感受。

LCP 最大内容绘制 <2.5s

四大影响因素:慢服务器响应→CDN/HTTP3/preconnect关键域名;资源阻塞渲染→内联关键CSS/defer非关键JS;资源加载慢→fetchpriority=high/srcset多尺寸/AVIF;客户端渲染慢→SSR/孤岛架构。

import { onCLS, onINP, onLCP, type Metric } from "web-vitals";

const URL = "/api/analytics/vitals";
function send(metric: Metric) {
    const body = JSON.stringify({
        name: metric.name, value: metric.value, rating: metric.rating,
        id: metric.id, url: location.href, ts: Date.now(),
    });
    if (navigator.sendBeacon) navigator.sendBeacon(URL, body);
    else fetch(URL, { body, method: "POST", keepalive: true }).catch(() => {});
}
export function initVitals() {
    if (location.hostname === "localhost") {
        const log = (m: Metric) => console.log(`[vitals] ${m.name}=${Math.round(m.value)} rating=${m.rating}`);
        onLCP(log); onCLS(log); onINP(log); return;
    }
    onLCP(send); onCLS(send); onINP(send);
}

export function scheduleHigh(work: () => void): void {
    if ("scheduler" in window && "postTask" in (window as any).scheduler)
        (window as any).scheduler.postTask(work, { priority: "user-blocking" });
    else if ("requestIdleCallback" in window)
        requestAnimationFrame(() => requestIdleCallback(() => work(), { timeout: 1500 }));
    else setTimeout(work, 0);
}

export function splitTasks(total: number, unit: (i: number) => void, chunk = 25): void {
    let i = 0;
    const pump = (deadline?: any): void => {
        const rem = typeof deadline !== "undefined" && deadline.timeRemaining ? deadline : { timeRemaining: () => 8 };
        while (i < total && rem.timeRemaining() > 1 && (i % chunk !== 0 || i === 0)) unit(i++);
        if (i < total) "requestIdleCallback" in window ? requestIdleCallback(pump) : setTimeout(pump, 0);
    };
    "requestIdleCallback" in window ? requestIdleCallback(pump) : pump();
}

export function throttle<T extends (...a: any[]) => void>(fn: T, wait = 150, opts: { leading?: boolean; trailing?: boolean } = {}): T {
    const { leading = true, trailing = true } = opts;
    let last = 0, tId: any = null, lastArgs: any[] | null = null;
    return function (this: any, ...args: any[]) {
        const now = Date.now();
        if (!last && !leading) last = now;
        const remaining = wait - (now - last);
        lastArgs = args;
        if (remaining <= 0) {
            if (tId) { clearTimeout(tId); tId = null; }
            last = now; fn.apply(this, args); lastArgs = null;
        } else if (trailing && !tId) {
            tId = setTimeout(() => {
                last = leading ? Date.now() : 0; tId = null;
                if (lastArgs) { fn.apply(this, lastArgs); lastArgs = null; }
            }, remaining);
        }
    } as T;
}

CLS 布局偏移 <0.1 & INP <200ms

CLS 元凶:图片/video缺宽高、字体替换抖动、未预留高度的横幅/动态插入内容。INP 是 FID 继任指标,关注每次输入到下一次绘制,>50ms 长任务是重点优化对象。

指标 目标阈值 最大元凶 1 最大元凶 2 核心优化方法
LCP <2.5s (绿) 大图片/视频 慢TTFB preconnect, AVIF, fetchpriority
CLS <0.1 (绿) 图片未设尺寸 字体切换抖动 width+height声明, font-display:optional
INP <200ms (绿) 长任务阻塞主线程 重样式/重排 scheduler.postTask, rIC splitting
TTFB <800ms 后端慢查询 无缓存/边缘 CDN缓存, SSR streaming

最佳实践

安装 web-vitals 库埋点真实用户数据(RUM),别只看本地 Lighthouse 实验室数据。移动端性能预算 3x 重要,因为设备慢 3-10 倍。

X微博Telegram

本文作者

投票

你最希望 Rosetta 优先加入哪项功能?

社区投票(演示数据,可后台删除)

留言 (1)

0 / 3000
像素小贩
像素小贩pixelart.studio2026年9月21日

看到博主推荐的这个 UI 组件库了,之前一直在纠结选哪个,试了一下确实不错,文档也很友好!

相關文章

Astro 靜態站點深度:群島架構 & 內容集合

Astro 靜態站點深度:群島架構 & 內容集合

深入理解 Astro 核心創新:群島架構實現最小化 JS 注入,僅交互元件按需水合;內容集合提供類型安全的 Markdown/MDX 管理,構建零 JS 的高性能靜態站點。

1 分鐘閱讀
CSS Container Queries 完全指南

CSS Container Queries 完全指南

徹底掌握現代響應式 CSS:Container Queries 讓元件基於父容器尺寸自適應(而非視口),配合 :has() 父選擇器實現依賴後代狀態的樣式變化,徹底改變元件化響應式設計範式。

1 分鐘閱讀
PWA 離線應用實戰:Service Worker + IndexedDB + Background Sync

PWA 離線應用實戰:Service Worker + IndexedDB + Background Sync

逐步構建可安裝、可離線運行、網絡恢復自動同步的 Progressive Web App:Service Worker 緩存策略(Cache First / Stale-While-Revalidate)、IndexedDB 封裝結構化本地數據、Background Sync 後台隊列在用戶離線操作後網絡恢復時自動提交變更,附完整 TS 代碼。

1 分鐘閱讀
Tailwind CSS v4 新特性:Zero-config + CSS-native 變數

Tailwind CSS v4 新特性:Zero-config + CSS-native 變數

Tailwind CSS v4 是一次架構級升級:徹底拋棄 tailwind.config.js,用 @theme 塊在原生 CSS 文件聲明設計令牌;新增 @import "tailwindcss" 單入口代替 postcss.config;內置 CSS 變量、容器查詢原生支持、oxc 引擎提速 10-40 倍、顏色函數簡化。

1 分鐘閱讀
React 18 Hooks 最佳實踐

React 18 Hooks 最佳實踐

React 18 引入了並發渲染、自動批處理、useTransition、useDeferredValue 等革命性特性。本文系統梳理 useState/useEffect 的正確用法、useMemo/useCallback 的優化邊界、自定義 Hook 的設計模式,以及並發模式下避免陳舊閉包、競態條件等陷阱的完整指南,幫助你寫出更健壯的 React 18 代碼。

1 分鐘閱讀
Vue 3 組合式 API 實戰

Vue 3 組合式 API 實戰

Vue 3 的組合式 API (Composition API) 徹底改變了 Vue 組件的組織方式。本文通過構建一個複雜的電商篩選器組件,演示 ref/reactive 的選擇、computed/watch 的合理使用、自定義組合函數 (Composable) 的抽離原則、生命週期鉤子的時機以及 provide/inject 進行跨層級狀態傳遞的正確姿勢。

1 分鐘閱讀