Agent-skills-standard nextjs-optimization
Optimize images, fonts, scripts, and metadata for Next.js performance and Core Web Vitals. Use when configuring next/image for LCP, next/font for zero layout shift, next/script loading strategies, or generateMetadata for SEO. (triggers: **/layout.tsx, **/page.tsx, next/image, next/font, metadata, generateMetadata)
install
source · Clone the upstream repo
git clone https://github.com/HoangNguyen0403/agent-skills-standard
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/HoangNguyen0403/agent-skills-standard "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/nextjs/nextjs-optimization" ~/.claude/skills/hoangnguyen0403-agent-skills-standard-nextjs-optimization && rm -rf "$T"
manifest:
skills/nextjs/nextjs-optimization/SKILL.mdsource content
Optimization
Priority: P1 (HIGH)
Core optimization primitives provided by Next.js. Monitor First, Optimize Later.
Monitoring (Core Web Vitals)
- LCP (Largest Contentful Paint): Target < 2.5s.
- CLS (Cumulative Layout Shift): Target < 0.1.
- INP (Interaction to Next Paint): Target < 200ms.
- Tools: Chrome DevTools "Performance" tab,
,next/speed-insights
.React Profiler
Images
Always use
next/image to prevent CLS and enable automatic optimization:
Fonts
Use
next/font for zero layout shift — self-hosts fonts and adds font-display: swap:
Metadata (SEO)
Scripts
Use
next/script with appropriate loading strategies:
: Critical scripts (polyfills).beforeInteractive
: Analytics (Google Analytics).afterInteractive
: Chat widgets, social embeds.lazyOnload
Bundle & Components
- Analyze with
. Prune heavy libraries; use ESM-tree-shakable dependencies.@next/bundle-analyzer - Use
imports withdynamic
for large components not needed at initial render.Suspense - Enable
(Partial Prerendering) in Next.js 15+ for static shell + dynamic islands.ppr: true
Anti-Patterns
- No
tag: Use<img>
to prevent CLS and enable automatic optimization.next/image - No Google Fonts CDN link: Use
to self-host and eliminate layout shift.next/font - No metadata in
: Use_document.tsx
orexport const metadata
.generateMetadata() - No 3rd-party scripts in
: Use<head>
with appropriatenext/script
.strategy