# Next.js Optimization Guide for United Tattoo ## Improving Developer Experience & Site Performance **Last Updated:** 2025-11-27 **Target Framework:** Next.js 14 (App Router) **Deployment:** Cloudflare Workers via OpenNext --- ## Table of Contents 1. [Quick Wins (This Week)](#quick-wins-this-week) 2. [Developer Experience Improvements](#developer-experience-improvements) 3. [Performance Optimizations](#performance-optimizations) 4. [Code Quality & Maintainability](#code-quality--maintainability) 5. [Implementation Priority Matrix](#implementation-priority-matrix) 6. [Measuring Success](#measuring-success) --- ## Quick Wins (This Week) ### 1.1 Add MDX Support for Content Pages **Problem:** Editing content pages requires React boilerplate and components. **Solution:** Add MDX to write pages in markdown with optional React components. **Implementation:** ```bash npm install @next/mdx @mdx-js/loader @mdx-js/react ``` **Create `mdx-components.tsx` in root:** ```typescript import type { MDXComponents } from 'mdx/types' export function useMDXComponents(components: MDXComponents): MDXComponents { return { h1: ({ children }) =>
{children}
, a: ({ href, children }) => {children}, ...components, } } ``` **Update `next.config.mjs`:** ```javascript import createMDX from '@next/mdx' const withMDX = createMDX({ extension: /\.mdx?$/, options: { remarkPlugins: [], rehypePlugins: [], }, }) export default withMDX({ pageExtensions: ['ts', 'tsx', 'js', 'jsx', 'md', 'mdx'], // ... rest of config }) ``` **Convert pages to MDX:** ```bash # Example: app/aftercare/page.tsx → app/aftercare/page.mdx ``` **Benefits:** - ✅ Write content in markdown (much faster) - ✅ Drop in React components when needed - ✅ No boilerplate for simple pages - ⏱️ **Time saved:** 5-10 minutes per content edit --- ### 1.2 Create Content Component Library **Problem:** Repeating the same UI patterns across pages. **Solution:** Pre-built, reusable content components. **Create `components/content/` directory:** ```typescript // components/content/Section.tsx export function Section({ title, children, className = "" }: { title?: string children: React.ReactNode className?: string }) { return ({subtitle}
} {cta && ( )}{description}
)}{error.message}
// After
import Image from 'next/image'