
Core Web Vitals در ۲۰۲۵: LCP، INP، CLS — راهنمای بهبود
Core Web Vitals در یک نگاه (۲۰۲۵)
- LCP: کمتر از 2.5s خوب، 2.5–4s نیاز به بهبود، بیشتر از 4s ضعیف.
- INP: کمتر از 200ms خوب، 200–500ms نیاز به بهبود، بیشتر از 500ms ضعیف.
- CLS: کمتر از 0.1 خوب، 0.1–0.25 نیاز به بهبود، بیشتر از 0.25 ضعیف.
این معیارها با دادههای میدانی (CrUX) سنجیده میشوند و باید روی ۷۵٪ بازدیدها خوب باشند.
از ۲۰۲۴ به بعد INP جایگزین FID شد. اگر هنوز FID را رصد میکنی، به INP مهاجرت کن.
سنجش میدانی vs آزمایشگاهی
• میدانی (Field): از کاربران واقعی میآید (CrUX/Analytics). • آزمایشگاهی (Lab): در محیط کنترلشده (Lighthouse/WebPageTest) برای عیبیابی.
هر دو لازماند: آزمایشگاهی برای کشف مشکل، میدانی برای تایید اثر در دنیای واقعی.
بهبود LCP در Next.js
- تصویر قهرمان (Hero) را با
next/imageوpriorityرندر کن. - فونتهای مهم را با
next/fontلود کن. - Critical CSS را سریع برسان و از بلاکینگهای غیرضروری پرهیز کن.
import Image from "next/image";
import { GeistSans } from "next/font/google";
const font = GeistSans({ subsets: ["latin"], display: "swap" });
export default function Hero(){
return (
<section className={`relative ${font.className}`}>
<Image
src="/images/hero.webp"
alt="قهرمان"
fill
priority
sizes="100vw"
className="object-cover"
/>
<div className="relative z-10 p-8">
<h1 className="text-3xl font-extrabold">سلام کارایی 👋</h1>
</div>
</section>
);
}
کاهش CLS (جهش چیدمان)
ابعاد تصاویر/تبلیغات را از قبل مشخص کن، از Placeholders استفاده کن و فونتها را با display: swap لود کن.
import Image from "next/image";
export function Card(){
return (
<Image
src="/images/card.webp"
alt="کارت"
width={800}
height={450}
placeholder="blur"
blurDataURL="data:image/webp;base64,UklGR..."
/>
);
}
بهبود INP (پاسخگویی تعاملات)
• کارهای سنگین را با Web Worker/server actions از مسیر تعامل جدا کن.
• از virtualization در لیستها استفاده کن.
• در React از useTransition برای تغییرات غیرضروری فوری استفاده کن.
import { useState, useTransition } from "react";
export function SearchBox(){
const [isPending, startTransition] = useTransition();
const [q, setQ] = useState("");
function onInput(e: React.ChangeEvent<HTMLInputElement>){
const value = e.target.value;
setQ(value);
startTransition(() => {
// فراخوانی فیلتر/جستجوی سنگین
});
}
return (
<input className="input" value={q} onChange={onInput} />
);
}
Listenerهای عمومی روی document را کم کن؛ delegation هدفمند روی کانتینرهای کوچکتر، INP را بهبود میدهد.
جمعبندی
ابتدا مشکلات را در Lab پیدا کن، سپس با Field تایید کن. روی LCP/Image، CLS/Image+Fonts و INP/Interactions تمرکز کن تا به آستانههای ۲۰۲۵ برسی.
سوالی داری یا پروژهای در ذهنته؟
با ما تماس بگیر تا با هم بهترین مسیر رو بچینیم.