AV
HomeAboutProjectBlog

© 2026 Ave syah Shina. All rights reserved.

  1. Home
  2. Blog
  3. 21 — Production Optimization — Images, Fonts, Scripts, Metadata, and Observability

21 — Production Optimization — Images, Fonts, Scripts, Metadata, and Observability

August 13, 20266 min read
Download as Markdown

Everything that mattered before shipping turned out to be already installed. The model that clicked: Next.js ships built-in components and APIs that handle the optimizations that matter — next/image for images, next/font for fonts, next/script for third-party scripts, the Metadata API for SEO, and instrumentation hooks for observability [1][2][3][4][5]. The production checklist isn't "build it all yourself" — it's "use what's already here."

Images — the biggest page-weight lever

Images account for a huge portion of typical page weight and have a sizable impact on LCP (how fast the largest visible element loads) [2]. The next/image component extends the HTML <img> with automatic optimization:

  • Size optimization — serves correctly sized images per device, in modern formats (WebP, AVIF).
  • Visual stability — prevents layout shift while loading.
  • Faster page loads — lazy-loads images as they enter the viewport, with optional blur-up placeholders.
  • Asset flexibility — on-demand resizing, even for remote images.
import Image from 'next/image';

<Image src="/hero.jpg" alt="Hero" width={1200} height={630} priority />

The priority prop on above-the-fold images is the one to remember — it tells the browser to load that image eagerly, which matters for LCP.

Fonts — self-hosted, no layout shift

The next/font module automatically optimizes fonts and removes external network requests, with built-in self-hosting for any font file [3]. The result: optimally loaded web fonts with no layout shift. No more FOIT/FOUT (text flashing invisible or unstyled before the font arrives), no requests to third-party font CDNs, no cumulative layout shift from late-arriving fonts.

import { Inter } from 'next/font/google';
const inter = Inter({ subsets: ['latin'] });

export default function RootLayout({ children }) {
return <html className={inter.className}>…</html>;
}

Scripts — controlled loading

Third-party scripts (analytics, ads, social widgets) often require downloading and executing code from external servers, which can hurt performance [4]. The next/script component optimizes when and how scripts execute — afterInteractive, lazyOnceVisible, etc. — so a third-party script doesn't block the first paint.

Metadata — SEO and shareability

The Metadata APIs define the app's metadata for SEO and web shareability [5]. Three forms:

  • A static metadata object exported from a layout or page.
  • A dynamic generateMetadata function for per-request metadata.
  • Special file conventions for favicons and OG images (static or dynamically generated).
// app/page.tsx
export const metadata = {
title: 'Ave — Portfolio',
openGraph: { images: ['/og.png'] },
};

Package bundling and lazy loading

By default, packages imported into Server Components and Route Handlers are automatically bundled for optimization [6]. For the client side, lazy loading defers Client Components and imported libraries so they're included in the bundle only when needed [7]. A modal that opens on click doesn't need to ship in the initial bundle.

import dynamic from 'next/dynamic';
const HeavyChart = dynamic(() => import('./HeavyChart'));

Static assets and third parties

Static files live in the public/ folder, referenced from the base URL [8]. Note that Next.js can't safely cache public assets because they may change. For popular third-party libraries (Google Analytics, Tag Manager), @next/third-parties provides optimized integrations [9].

Observability — analytics and instrumentation

Production means measuring. Next.js has built-in support for performance metrics via useReportWebVitals, or Vercel's managed analytics service [10]. Instrumentation integrates monitoring and logging tools so I can track performance and behavior and debug production issues [11]. For vendor-agnostic observability, Next.js recommends OpenTelemetry — a platform-agnostic instrumentation standard supported out of the box [12].

next/image right size per device WebP / AVIF lazy + priority next/font self-hosted no external request no layout shift next/script controlled load timing afterInteractive lazyOnceVisible Metadata API title, description OG images generateMetadata Lazy load + bundle dynamic imports auto-bundled server pkgs smaller client JS Observability useReportWebVitals instrumentation hook OpenTelemetry built-in components and APIs — use them, don't roll your own

Memory usage

As apps grow, they demand more resources when building locally or creating production builds [13]. Next.js documents strategies for optimizing memory and addressing common memory issues — worth consulting when builds start hitting limits.

How I use this

Before shipping, I run through the built-in optimizations: every image goes through next/image (with priority on the LCP image), fonts through next/font, third-party scripts through next/script, and metadata defined via the Metadata API on every route. Heavy client components get lazy-loaded. On the observability side, I wire up web-vitals reporting and (for larger apps) OpenTelemetry instrumentation so production behavior is measurable. The discipline is to trust the framework's components — they're tuned for the cases that matter, and rolling my own rarely beats them.

References

[1] Vercel, "How to optimize your Next.js application for production," Next.js Docs, 2024. [Online]. Available: https://nextjs.org/docs/app/guides/production-checklist

[2] Vercel, "Image optimization," Next.js Docs, 2024. [Online]. Available: https://nextjs.org/docs/app/getting-started/images

[3] Vercel, "Font optimization," Next.js Docs, 2024. [Online]. Available: https://nextjs.org/docs/app/getting-started/fonts

[4] Vercel, "How to load and optimize scripts," Next.js Docs, 2024. [Online]. Available: https://nextjs.org/docs/app/guides/scripts

[5] Vercel, "Metadata and OG images," Next.js Docs, 2024. [Online]. Available: https://nextjs.org/docs/app/getting-started/metadata-and-og-images#static-open-graph-images

[6] Vercel, "How to optimize package bundling," Next.js Docs, 2024. [Online]. Available: https://nextjs.org/docs/app/guides/package-bundling

[7] Vercel, "How to lazy load Client Components and libraries," Next.js Docs, 2024. [Online]. Available: https://nextjs.org/docs/app/guides/lazy-loading

[8] Vercel, "public folder," Next.js Docs, 2024. [Online]. Available: https://nextjs.org/docs/app/api-reference/file-conventions/public-folder

[9] Vercel, "How to optimize third-party libraries," Next.js Docs, 2024. [Online]. Available: https://nextjs.org/docs/app/guides/third-party-libraries

[10] Vercel, "How to add analytics to your Next.js application," Next.js Docs, 2024. [Online]. Available: https://nextjs.org/docs/app/guides/analytics

[11] Vercel, "How to set up instrumentation," Next.js Docs, 2024. [Online]. Available: https://nextjs.org/docs/app/guides/instrumentation

[12] Vercel, "How to set up instrumentation with OpenTelemetry," Next.js Docs, 2024. [Online]. Available: https://nextjs.org/docs/app/guides/open-telemetry

[13] Vercel, "How to optimize memory usage," Next.js Docs, 2024. [Online]. Available: https://nextjs.org/docs/app/guides/memory-usage

Knowledge check · Question 1 of 5

What does the next/image component automatically handle?

Comments

Leave a Comment

You must be signed in to comment

0 Comments

No comments yet. Be the first to comment!