Website Performance: What Actually Moves Core Web Vitals
Nobody clicks a link hoping to wait. Slow pages cost you rankings, conversions, and credibility — and unlike a redesign, performance problems are invisible until you measure them. The good news: making a website genuinely fast is not magic. It's a short list of high-impact fixes, applied in the right order.
Measure before you optimize
The first rule: never optimize a guess. Even the best intuition is wrong about where the time actually goes. Before touching anything, capture a baseline:
- Lighthouse (built into Chrome DevTools) for a lab snapshot of Core Web Vitals: LCP, INP, CLS.
- Real-user monitoring for field data — what actual visitors experience on their devices.
- The Network tab — sort by size and by duration to see what dominates the waterfall.
Optimize what the data points at, then re-measure. A fix you can't measure is a fix you can't defend.
The server side: TTFB is the foundation
Every other metric sits on top of TTFB — the time until the server sends the first byte. If that's slow, nothing downstream can compensate. The usual culprits, in order:
- Uncached database queries — the classic. Add indexes, eager-load relations, and cache repeated lookups.
- Missing HTTP caching — the browser should not re-download assets that haven't changed.
- A heavy framework runtime — sometimes the slow part is simply the request lifecycle itself.
For dynamic pages, a small amount of server-side caching (page-level or fragment cache) usually collapses TTFB on repeat visits. And if the page is public and changes rarely, consider pre-rendering it at build time — static output is the fastest output that exists.
The front end: what users actually see
Core Web Vitals measure the experience, not the code — so the front end matters just as much:
- Images are the biggest lever. Serve modern formats (AVIF/WebP), set explicit
width/heightto prevent layout shift, and lazy-load everything below the fold. - Fonts must not block rendering. Use
font-display: swapand subset fonts to the glyphs you actually use. - JavaScript should be a progressive enhancement, not a paywall to the content. Code-split, defer non-critical chunks, and never let a third-party script block first paint.
A typical checklist looks like this:
<img src="hero.avif" width="1200" height="630" alt="Hero" loading="lazy" decoding="async">
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>
Caching: the cheapest performance on the internet
Proper Cache-Control headers are nearly free and give you the largest win-per-effort ratio. The pattern:
Cache-Control: public, max-age=31536000, immutablefor hashed assets likeapp-8f3c2a.js.- A short
max-agewith cache revalidation for HTML pages. - HTTP/2 (or HTTP/3) so the browser can fetch many assets in a single connection instead of queueing them.
If visitors are geographically far from the server, a CDN fronting the static assets is usually the next step — it makes cache hits physically closer to the user.
The realistic order of operations
- Measure and pick the one worst metric.
- Fix the server side first — TTFB compounds everything.
- Optimize images and fonts — biggest visible gain per hour of work.
- Add or fix caching headers.
- Re-measure, compare with the baseline, repeat.
Performance work is never truly finished — pages change, content grows, new scripts appear. But a team that measures and applies these basics in order ends up with fast sites as a habit, not a project. And fast is a feature users feel on every single visit.