Next.js AppRouterにて動的ページをビルドする(SSG)

この記事は約4分で読めます。
スポンサーリンク

はじめに

Next.js13.4の新機能でApp Routerが追加されました。
ファイルシステムベースのRouterのことで、Server Componentなど新機能に対応しています。

AppRouterでは、すべてのコンポーネントがServer Componentになったことから、Client Componentとして利用する場合、ファイルの先頭に”use client”をつける必要があります。

これまで、Next.jsのレンダリングは、SSR(サーバーサイドレンダリング)とSSG(Static Site Generator)が使用されることが一般的でしたが、アップデートにより、ますますSSRファーストなフレームワークになってきています。

SSGの場合、SSRとして開発をしてビルドすると、動的ページでエラーが発生します。アップデート以前の話でもありますが、動的ページ処理は、getServerSidePropsやgetStaticPropsを使用していました。ただ、今回のアップデートにより、それらが廃止されました。

実装しようものなら、以下のようなエラーが発生します。

“getStaticProps” is not supported in app/

そして新たに、generateStaticParamsが追加されました。基本的にgenerateStaticParamsを使用して動的ページを生成していきます。

以下もgenerateStaticParamsを使用して実装します。

環境

  • Next.js:14.0.4
スポンサーリンク

generateStaticParamsを使って動的ページを作成

データの作成

今回は、同じプロジェクト内にデータ用のファイルを作成します。

src/constant/item.ts
type ItemsType = {
id:number,
name:string
}
export const Items:ItemsType[] = [
 {
   id:1,
   name:"あめ"
 },
 {
   id:2,
   name:"めだか"
 }
];

動的ページの作成

パスは、以下のように設定します。

src/app/item/[id]/page.tsx
import { NextPage } from 'next';
import { Items } from '@/constant/items';

type Props = {
  params: {
    id: number;
  };
};
const DynamicView: NextPage = (props) => {
  const item = Items.filter(item => item.id == props.params.id)[0];
  return (
   <>
     {item.name}
   </>
  );
};

export default DynamicView;

export const generateStaticParams = async()=> {
  const paths = await Items.map((item) => ({ 
     params: { id: item.id.toString()}
  }));
  return paths.map((post) => (
   post.params
  ));
}

generateStaticParamsにおいて、ビルド時に動的ページを静的にルートを生成します。
localhost:3000://item/1、item/2が生成され、

それぞれのURLでアクセスすると、ビューには1のとき「あめ」、2のとき「めだか」が表示されます。

おわりに

Remixも然り、基調SSRを使用しフロントエンドからバックエンドまでカバーし、ノンストップでスピーディーに開発できるFWが主流となっています。

また、クライアントのスペックに依存せず、サーバのスケーリングによって対応できるのが魅力的です。

SSRに対応している他言語のバックエンドもあるものの、主流はNode.jsでしょう。
レンタルサーバのような環境であればNode.jsを動かすのは厳しく、SSGが使われることもまだまだ多くあるでしょう。

私も基本SSGで開発をしておりましたが、今後、リアルタイム性の求められるサービスも作成したいので、近いうちにSSRにもチャレンジをしてみたいです。

コメント

スポンサーリンク
スポンサーリンク
タイトルとURLをコピーしました