🐕

Next.jsにおけるデータ取得のベストプラクティス: クライアントサイドとサーバーサイドの利点と実装方法

2023/03/24に公開

クライアントサイドとサーバーサイドどっちでデータを取得する?

Next.jsのAPIからデータを取得する方法には、クライアントサイドとサーバーサイドの2つの方法があります。これらの方法はそれぞれ異なる特徴と利点・欠点があるため、プロジェクトの要件に応じて適切な方法を選択する必要があります。

クライアントサイドでAPIを呼び出す場合のメリットとデメリット

メリット:

  • ブラウザで実行されるため、サーバーへの負荷が軽減される
  • サーバーとの通信が少ないため、アプリケーションの応答性が向上する

デメリット:

  • ブラウザで実行されるため、初回表示速度が遅くなる場合がある
  • SEOに影響する可能性があります(検索エンジンがクローリングしにくい場合がある)

サーバーサイドでAPIを呼び出す場合のメリットとデメリット

メリット:

  • SEOに有利である(サーバーサイドでデータを取得し、HTMLを生成するため、検索エンジンがクローリングしやすい)
  • 初回表示速度が向上する場合がある(サーバーでデータを取得し、HTMLを生成してからクライアントに送信するため)

デメリット:

  • サーバーへの負荷が増加する場合がある
  • APIのレート制限に影響を受ける場合がある

クライアントサイドでAPIのデータを取得する方法

クライアントサイドでAPIからデータを取得する方法は、主にfetchaxiosなどのHTTPクライアントを使用してAPIを呼び出します。例えば、fetchを使ってAPIを呼び出す方法は以下のようになります。

async function fetchData() {
  const response = await fetch('https://api.example.com/data');
  const data = await response.json();
  return data;
}

サーバーサイドでデータを取得する方法

サーバーサイドでAPIからデータを取得する方法は、Next.jsではgetStaticPropsgetServerSidePropsの2つの関数が提供されています。これらの関数は、それぞれ異なる目的と使い方があります。

getStaticPropsとgetServerSidePropsの違い

getStaticProps: ビルド時にデータを取得し、静的HTMLを生成します。これにより、アプリケーションのパフォーマンスが向上し、SEOにも有利です。ただし、データの変更が頻繁に行われる場合は、再ビルドが必要になります。
getServerSideProps: リクエストごとにデータを取得し、HTMLを生成します。これにより、常に最新のデータが表示されますが、サーバーへの負荷が増加する場合があります。

getStaticPropsの実装方法

以下は、getStaticPropsを使ってAPIからデータを取得する方法の例です。

export async function getStaticProps() {
  const response = await fetch('https://api.example.com/data');
  const data = await response.json();

  return {
    props: {
      data,
    },
    revalidate: 60, // 60秒ごとに再生成
  };
}

getServerSidePropsの実装方法

以下は、getServerSidePropsを使ってAPIからデータを取得する方法の例です。

export async function getServerSideProps() {
  const response = await fetch('https://api.example.com/data');
  const data = await response.json();

  return {
    props: {
      data,
    },
  };
}

エラーハンドリングとエラーメッセージの表示方法

APIからのデータ取得時にエラーが発生した場合、エラーハンドリングを行い、適切なエラーメッセージを表示することが重要です。以下は、fetchを使ってAPIからデータを取得し、エラーが発生した場合のエラーハンドリングの例です。

async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');

    if (!response.ok) {
      throw new Error(`HTTP error ${response.status}`);
    }

    const data = await response.json();
    return data;
  } catch (error) {
    console.error('Error fetching data:', error);
    return null;
  }
}

ローディングスピナーの実装方法

データを取得する際に、ローディングスピナーを表示してユーザーに待機を示すことが一般的です。ReactのuseStateとuseEffectを使って、ローディングスピナーを実装する方法の例を示します。

import React, { useState, useEffect } from 'react';
import LoadingSpinner from './components/LoadingSpinner';

function MyComponent() {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    async function fetchData() {
      const response = await fetch('https://api.example.com/data');
      const data = await response.json();
      setData(data);
      setLoading(false);
    }

    fetchData();
  }, []);

  return (
    <div>
      {loading ? (
        <LoadingSpinner />
      ) : (
        data && (
          // データを表示するコンポーネント
        )
      )}
    </div>
  );
}

まとめ

この記事では、Next.jsのAPIからデータを取得する2つの方法(クライアントサイドとサーバーサイド)と、それぞれの利点・欠点について説明しました。また、getStaticPropsgetServerSidePropsの使い方や、エラーハンドリングとローディングスピナーの実装方法についても紹介しました。これらの知識を活用して、効果的なデータ取得を行いましょう。

Discussion