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

前端性能优化:Core Web Vitals 实战

Choyeon
Choyeon
2026年9月15日 1 分钟阅读 293 阅读
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 分钟阅读