Open3
Next.js
src/app/data-feching.tsx
を作成してpnpm build
する。
src/app/data-feching.tsx
type Blog = {
id: number;
title: string;
content: string;
author: string;
date: string;
category: string;
};
export default async function DataFetching() {
const res = await fetch("https://api.vercel.app/blog");
const blogs: Blog[] = await res.json();
console.log({ blogs });
return (
<>
<h1>Data fetching</h1>
<ul>
{blogs.map((blog) => (
<li key={blog.id}>{blog.title}</li>
))}
</ul>
</>
);
}
data-feching.html
が作られる。
fetch("https://api.vercel.app/blog", { cache: "no-store" });
またはexport const dynamic = 'force-dynamic'
を追加するとpnpm build
時にdata-feching.html
は生成されずにリクエストごとに毎回作られる。cookiesやheadersなどを触った時もHTMLが動的に作られる。
fetchが二つ呼ばれていて片方だけ"no-store"がついていた場合
type Blog = {
id: number;
title: string;
content: string;
author: string;
date: string;
category: string;
};
export default async function DataFetching() {
const recentPostResponse = await fetch("https://api.vercel.app/blog/1");
const recentPost: Blog = await recentPostResponse.json();
const blogsResponse = await fetch("https://api.vercel.app/blog", {
cache: "no-store",
});
const blogs: Blog[] = await blogsResponse.json();
return (
<>
<h1>Data fetching</h1>
<h2>Recent post</h2>
<div>{recentPost.title}</div>
<h2>Blog List</h2>
<ul>
{blogs.map((blog) => (
<li key={blog.id}>{blog.title}</li>
))}
</ul>
</>
);
}
data-feching.html
は生成されない。
コンポーネントに切り出しても同じ。
async function BlogList() {
const blogsResponse = await fetch("https://api.vercel.app/blog", {
cache: "no-store",
});
const blogs: Blog[] = await blogsResponse.json();
return (
<>
<h2>Blog List</h2>
<ul>
{blogs.map((blog) => (
<li key={blog.id}>{blog.title}</li>
))}
</ul>
</>
);
}
fetchパターン