4. Fetch
Next.jsは、さまざまなタイミン グでデータをフェッチするためのメソッドを提供しています。これにより、ビルド時、リクエスト時、またはクライアントサイドでデータを取得できます。
getStaticProps
getStaticProps
は、ビルド時にデータをフェッチし、静的に生成されたページを提供します。主に静的サイト生成(SSG)に使用されます。
使用例
// pages/index.js
export async function getStaticProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return {
props: {
data,
},
};
}
export default function Home({ data }) {
return (
<div>
<h1>Data from getStaticProps</h1>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
}
getServerSideProps
getServerSideProps
は、リクエストごとにデータをフェッチし、サーバーサイドレンダリング(SSR)されたページを提供します。動的なデータが必要な場合に使用されます。
使用例
// pages/index.js
export async function getServerSideProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return {
props: {
data,
},
};
}
export default function Home({ data }) {
return (
<div>
<h1>Data from getServerSideProps</h1>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
}
getStaticPaths
getStaticPaths
は、動的ルートを持つページで使用され、どのパスが生成されるべきかを指定します。主に静的サイト生成(SSG)で動的ルートを扱う場合に使用されます。
使用例
// pages/posts/[id].js
export async function getStaticPaths() {
const res = await fetch('https://api.example.com/posts');
const posts = await res.json();
const paths = posts.map((post) => ({
params: { id: post.id.toString() },
}));
return {
paths,
fallback: false,
};
}
export async function getStaticProps({ params }) {
const res = await fetch(`https://api.example.com/posts/${params.id}`);
const post = await res.json();
return {
props: {
post,
},
};
}
export default function Post({ post }) {
return (
<div>
<h1>{post.title}</h1>
<p>{post.content}</p>
</div>
);
}
Client-side Fetching
クライアントサイドでデータをフェッチする場合、標準的なReactの手法を使用します。例えば、useEffect
フックとfetch
を組み合わせてデータを取得します。
使用例
import { useEffect, useState } from 'react';
export default function ClientSideData() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch('https://api.example.com/data')
.then((response) => response.json())
.then((data) => {
setData(data);
setLoading(false);
});
}, []);
if (loading) {
return <div>Loading...</div>;
}
return (
<div>
<h1>Data fetched on client-side</h1>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
}
ISR(Incremental Static Regeneration)
ISR(Incremental Static Regeneration)は、静的生成と動的データフェッチを組み合わせ、ビルド後もページのコンテンツを更新する機能です。特定のインターバルで再生成を行います。
使用例
// pages/index.js
export async function getStaticProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return {
props: {
data,
},
revalidate: 60, // 60秒ごとにページを再生成
};
}
export default function Home({ data }) {
return (
<div>
<h1>Data with ISR</h1>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
}
このように進めていきます。他に追加や修正の希望があればお知らせください。