Data Fetching
fetch()
Learn how Next.js extends fetch for server data fetching, caching, revalidation, and request-time freshness.
1. Learning Objectives
By the end of this lesson, you will be able to:
fetch() inside Server Components.Difficulty: Beginner.
2. Prerequisites
3. Overview
Next.js builds on the standard Web fetch() API with server-aware caching and revalidation options. In Server Components, you can fetch data before rendering and let Next.js decide whether the result should be cached, revalidated, or fetched fresh.
4. Why This Topic Matters
Most Next.js pages are shaped by data fetching decisions. The same UI can behave like SSG, ISR, or SSR depending on how its data is fetched and cached.
5. Real-World Analogy
Using fetch() in Next.js is like choosing how a store restocks shelves. Some items are pre-stocked, some refresh every hour, and some are fetched from the back room only when a customer asks.
6. Core Concepts
| Option | Meaning |
|---|---|
| Default fetch | May be cached depending on route and framework behavior. |
cache: 'no-store' | Fetch fresh data for each request. |
next: { revalidate: n } | Cache and refresh after n seconds. |
| Error handling | Non-2xx responses should be checked explicitly. |
| Parallel fetch | Start independent requests together to reduce waiting. |
7. Syntax & API Reference
Always check important responses:
8. Visual Diagram
9. Live Example - Full Working Code
What just happened? Posts can be cached and refreshed every five minutes instead of fetched fresh for every request.
10. Interactive Playground
Try this:
next: { revalidate: 300 } to cache: 'no-store'.Promise.all for two independent requests.res.ok is false and observe the route error boundary.11. Common Mistakes
| Mistake | Why It Happens | Correct Approach |
|---|---|---|
Not checking res.ok | fetch only rejects on network failures. | Throw for bad HTTP responses. |
| Fetching sequentially when requests are independent | Async code is written top-down. | Use Promise.all for independent requests. |
Using no-store everywhere | Freshness feels safest. | Cache public data when freshness allows. |
12. Best Practices
13. Browser Compatibility
| Feature | Browser Impact | Notes |
|---|---|---|
| Server fetch | No direct browser dependency | Runs on server. |
| Browser fetch | Modern browser API | Used in Client Components. |
| Cache/revalidate options | Next.js server feature | Framework-specific behavior. |
14. Interview Questions
Easy: Can you usefetch() directly in a Server Component?
Answer: Yes.
Medium: What doescache: 'no-store' mean?
Answer: Fetch fresh data instead of using a shared cached response.
Hard: Why does fetch configuration affect rendering strategy?Answer: Cached fetches can support static or revalidated output, while uncached request-time fetches make the route dynamic.
15. Debugging Exercise
Bug report: "The page shows broken data but no error boundary appears."
Solution
Check res.ok and throw an error for failed HTTP statuses. fetch() does not automatically throw for 404 or 500 responses.
16. Practice Exercises
17. Scenario-Based Challenge
A homepage fetches hero copy, trending products, and user-specific recommendations. How should caching differ?
Walkthrough
Cache or revalidate public hero and trending product data. Fetch user-specific recommendations per request or in a private client/server path.
18. Quick Quiz
1. Does fetch throw on HTTP 500 automatically? Answer: No.
2. What option forces fresh data? Answer: cache: 'no-store'.
3. What option refreshes after time? Answer: next: { revalidate: n }.
4. Where should initial SEO data usually be fetched? Answer: On the server.
5. What helps independent fetches finish faster? Answer: Promise.all.
19. Summary & Key Takeaways
fetch() with caching and revalidation.no-store favors freshness.revalidate balances static speed and freshness.20. Cheat Sheet
| Need | Fetch Option |
|---|---|
| Always fresh | cache: 'no-store' |
| Refresh every 5 min | next: { revalidate: 300 } |
| Public stable data | Cached/static-friendly fetch |
| Private user data | Request-scoped fetch |
| Independent requests | Promise.all |
21. Further Reading
22. Next Lesson Preview
Next, you will learn Route Handlers for building server endpoints inside the App Router.