Bird
Raised Fist0
NextJSframework~8 mins

Not-found.tsx customization in NextJS - Performance & Optimization

Choose your learning style10 modes available
Performance: Not-found.tsx customization
MEDIUM IMPACT
This affects the page load speed and user experience when a user navigates to a non-existent route, impacting the Largest Contentful Paint (LCP) and Interaction to Next Paint (INP).
Customizing the 404 Not Found page in Next.js
NextJS
export default function NotFound() {
  return <div><h1>Page Not Found</h1><p>Sorry, we couldn't find that page.</p></div>;
}
Static content renders immediately without waiting for data, improving load speed and user experience.
📈 Performance GainInstant render, reduces LCP by 300-500ms, no blocking
Customizing the 404 Not Found page in Next.js
NextJS
export default async function NotFound() {
  const data = await fetch('https://api.example.com/slow-endpoint').then(res => res.json());
  return <div>{data.message}</div>;
}
Fetching data with await (blocking) in the NotFound component blocks rendering and delays page load.
📉 Performance CostBlocks rendering for 300-500ms depending on network, increases LCP
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Blocking data fetch in NotFoundModerate (due to data rendering)1+ reflows triggered by delayed contentHigh paint cost due to delayed render[X] Bad
Static simple NotFound componentLow (minimal DOM nodes)Single reflowLow paint cost with immediate render[OK] Good
Rendering Pipeline
When the NotFound component renders, the browser processes style calculation, layout, paint, and composite. Heavy or async operations in NotFound delay these stages, especially layout and paint.
→Style Calculation
→Layout
→Paint
→Composite
⚠️ BottleneckLayout and Paint stages due to blocking data fetching or large components
Core Web Vital Affected
LCP
This affects the page load speed and user experience when a user navigates to a non-existent route, impacting the Largest Contentful Paint (LCP) and Interaction to Next Paint (INP).
Optimization Tips
1Avoid blocking data fetching in Not-found.tsx to prevent blocking rendering.
2Keep Not-found.tsx content static and lightweight for faster load times.
3Use DevTools Performance tab to verify Not-found.tsx renders quickly without delays.
Performance Quiz - 3 Questions
Test your performance knowledge
What is the main performance risk of fetching data with await (blocking) inside Not-found.tsx?
AIt increases bundle size significantly
BIt blocks rendering and delays Largest Contentful Paint
CIt causes excessive CSS recalculations
DIt improves user experience by showing dynamic content
DevTools: Performance
How to check: Open DevTools > Performance tab > Record page load on a non-existent route > Look for long tasks or delayed paint events
What to look for: Check LCP timing and if the NotFound component blocks rendering or causes layout shifts

Practice

(1/5)
1. What is the main purpose of the not-found.tsx file in a Next.js app?
easy
A. To define the main layout of the website
B. To handle user authentication
C. To customize the page shown when a user visits a missing URL
D. To manage API routes

Solution

  1. Step 1: Understand the role of not-found.tsx

    This file is specifically for customizing the page shown when a user tries to access a page that does not exist.
  2. Step 2: Compare with other options

    Other options like layout, authentication, or API routes are handled by different files or folders in Next.js.
  3. Final Answer:

    To customize the page shown when a user visits a missing URL -> Option C
  4. Quick Check:

    Missing page display = Custom not-found.tsx [OK]
Hint: Remember: not-found.tsx shows missing page content [OK]
Common Mistakes:
  • Confusing not-found.tsx with layout or API files
  • Thinking it handles authentication
  • Assuming it manages site navigation
2. Which of the following is the correct way to export a default React component in not-found.tsx?
easy
A. default export function NotFound() { return

Page Not Found

; }
B. function NotFound() { return

Page Not Found

; } export NotFound;
C. export function NotFound() { return

Page Not Found

; }
D. export default function NotFound() { return

Page Not Found

; }

Solution

  1. Step 1: Recall correct default export syntax

    In React with Next.js, the correct way is to write export default function ComponentName() { ... }.
  2. Step 2: Check each option

    export default function NotFound() { return

    Page Not Found

    ; } matches the correct syntax. function NotFound() { return

    Page Not Found

    ; } export NotFound; has incorrect export syntax. export function NotFound() { return

    Page Not Found

    ; } exports a named function, not default. default export function NotFound() { return

    Page Not Found

    ; } uses invalid syntax.
  3. Final Answer:

    export default function NotFound() { return <h1>Page Not Found</h1>; } -> Option D
  4. Quick Check:

    Default export = export default function [OK]
Hint: Default export uses 'export default function' syntax [OK]
Common Mistakes:
  • Using named export instead of default
  • Incorrect export keyword placement
  • Missing 'default' keyword
3. Given this not-found.tsx component, what will be displayed when a user visits a missing page?
export default function NotFound() {
  return (
    <main role="main">
      <h1>Oops! Page not found.</h1>
      <p>Try going back or visit the homepage.</p>
      <a href="/">Home</a>
    </main>
  );
}
medium
A. A page with a heading 'Oops! Page not found.', a paragraph, and a link to Home
B. A blank page with no content
C. An error message in the browser console only
D. A redirect to the homepage without showing any message

Solution

  1. Step 1: Read the returned JSX

    The component returns a main section with a heading, paragraph, and a link to the homepage.
  2. Step 2: Understand what renders on missing page

    When a page is missing, this component renders the content exactly as coded, showing the heading, paragraph, and link.
  3. Final Answer:

    A page with a heading 'Oops! Page not found.', a paragraph, and a link to Home -> Option A
  4. Quick Check:

    JSX content renders as visible page elements [OK]
Hint: JSX inside return shows on missing page [OK]
Common Mistakes:
  • Thinking it redirects automatically
  • Assuming no content shows
  • Confusing console errors with UI output
4. Identify the error in this not-found.tsx code snippet:
export default function NotFound() {
  return (
    <div>
      <h1>Page Not Found</h1>
      <a href="/">Go Home</a>
    </div>
  )
}
medium
A. Using <div> instead of <main> for accessibility
B. No error; code is valid and works correctly
C. Missing semicolon after return statement
D. Missing parentheses around JSX

Solution

  1. Step 1: Check JSX syntax

    The JSX is correctly wrapped and returned; no syntax errors or missing semicolons needed after return.
  2. Step 2: Consider accessibility best practices

    Using <main> instead of <div> improves accessibility by defining the main content region.
  3. Final Answer:

    Using <div> instead of <main> for accessibility -> Option A
  4. Quick Check:

    Use <main> for main content in error pages [OK]
Hint: Use <main> tag for main content, not just <div> [OK]
Common Mistakes:
  • Thinking semicolons are required after return
  • Ignoring accessibility tags
  • Assuming JSX needs extra parentheses
5. You want your not-found.tsx page to show a custom message only if the user is on a mobile device, otherwise show a default message. Which approach fits Next.js best?
hard
A. Create two separate not-found.tsx files, one for mobile and one for desktop
B. Use a React hook like useEffect with window.navigator.userAgent to detect device and conditionally render
C. Use CSS media queries to hide/show different messages in the same component
D. Write server-side code in not-found.tsx to detect device from request headers and render accordingly

Solution

  1. Step 1: Understand client vs server rendering

    Device detection using window.navigator.userAgent works only on client side, so use React hooks like useEffect.
  2. Step 2: Evaluate other options

    Server-side detection is complex and not typical in not-found.tsx. CSS media queries only style but don't change content. Multiple files for one route is invalid.
  3. Final Answer:

    Use a React hook like useEffect with window.navigator.userAgent to detect device and conditionally render -> Option B
  4. Quick Check:

    Client detection with hooks = best for device-specific UI [OK]
Hint: Detect device client-side with hooks, not server or multiple files [OK]
Common Mistakes:
  • Trying to detect device server-side in this file
  • Using multiple not-found.tsx files
  • Relying only on CSS for content changes
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard