Чи можна робити await fetch прямо в компоненті?
Коротко: так, можна - але тільки в серверних компонентах.
Розберемось детальніше, щоб не було плутанини.
Коли await fetch у компоненті - це нормально
У Next.js (App Router) усі компоненти серверні типово, а отже:
- компонент може бути
async - можна писати
await fetch(...)прямо в тілі компонента - запит виконається на сервері
- браузер отримає вже готовий HTML з даними
Приклад за змістом:
js
export default async function Page() {
const res = await fetch("https://api.example.com/posts")
const posts = await res.json()
return (
<ul>
{posts.map(post => (
<li key={post.id}>{post.title}</li>
))}
</ul>
)
}Тут:
- немає
useEffect - немає завантаження після рендеру
- дані вже є при показі сторінки
Чому це працює саме в Server Components
Server Component:
- виконується тільки на сервері
- не потрапляє в JS-бандл браузера
- може бути
async - може звертатися до API, БД, секретів
По суті, це React-компонент + серверна логіка в одному місці.
Коли await fetch не можна робити прямо в компоненті
Якщо компонент клієнтський, тобто на початку є:
js
"use client"- тоді не можна писати
await fetchпрямо в тілі компонента.
Причини:
- клієнтські компоненти мають бути синхронними
- рендер у браузері не може «зачекати»
await
У такому випадку дані отримують:
- через
useEffect - або через бібліотеки на кшталт SWR / React Query
Як зрозуміти, де виконається fetch
Просте правило:
- Server Component →
await fetchвиконається на сервері - Client Component (
"use client") → fetch тільки:- в
useEffect - в обробниках подій
- в
Чи можна комбінувати
Так, і так роблять найчастіше:
- Server Component:
- робить
await fetch - передає дані вниз
- робить
- Client Component:
- відповідає за інтерактивність
Це вважається правильною архітектурою в App Router.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.