Next.jsのルーティングをApp Routerに移行した

2023/08/06

2023/08/06


このサイトで使っているNext.jsのバージョンをv13に更新し、App Routerという新しいルーティングシステムに移行した。移行時に行なったことをメモしておく。

やったこと


Next.js公式の移行ガイドがあるのでこれに従う。

appディレクトリへの移動

_app.tsxの内容はルートのlayout.tsxに、その他のファイルの内容はディレクトリごとのpage.tsxに置く。

metadataの設定

v12まではnext/headHeadコンポーネントでメタデータを設定していたが、v13からはMetadataオブジェクトをexportすることでメタデータを設定する。

「ページのパスを取得してHeadコンポーネントを動的に生成する」みたいなことができない様子なのでちょっと困った。パスはある程度ハードコードしないといけないらしい。

// 本当はやりたかったこと
export const generateMetadata = () => {
  const url = getUrl();
  return {
    openGraph: {
      url: url
    }
  }
};

// 実際の実装イメージ
export const generateMetadata = () => {
  return {
    openGraph: {
      url: "https://www.a4rcvv.net/blog"
    }
  }
};

Routing Hookの改修

v12まではnext/routeruseRouter()を使っていたが、v13からはnext/navigationuseRouter(), usePathname(), useSearchParams()を使うことになる。

v12までのuseRouter()で取得できていたpathnamequeryがそれぞれusePathname(), useSearchParams()に分離された形。

データフェッチ周りの改修

pagesディレクトリではgetServerSideProps()getStaticProps()をexportしていたが、appディレクトリではこのあたりの記述を全てPageコンポーネントに書けるようになった。

const Page = async ({ params }: { params: { tag: string } }) => {
  const tag = params.tag;
  const metadata = getMetadata();
  return <BlogTagView tag={tag} metadata={metadata} />;
};

また、getStaticPaths()generateStaticParams()に置き換えられた。概ね同じようなAPIだが、戻り値の型が若干シンプルになっている。

export const generateStaticParams = () => {
  const ids = getAllPostIds().filter((id) => {
    return !getArticleMetadata(id).isDraft;
  });

  return ids.map((id) => {
    return {
      id: id,
    };
  });
};

MUIの設定変更

MUIの公式ガイドを読むとThemeRegistryを実装すれば良いらしいことが分かるので、実装を追加した。

ビルドコマンドの変更

v12までは next build && next export で静的HTMLを生成していた。

v13では、next.config.js"output: export"を追加した上でnext buildだけを実行すれば良い。

参考: Deploying: Static Exports | Next.js

参考リンク



Shared on: