2023/08/06
2023/08/06
このサイトで使っているNext.jsのバージョンをv13に更新し、App Routerという新しいルーティングシステムに移行した。移行時に行なったことをメモしておく。
Next.js公式の移行ガイドがあるのでこれに従う。
_app.tsx
の内容はルートのlayout.tsx
に、その他のファイルの内容はディレクトリごとのpage.tsx
に置く。
v12まではnext/head
のHead
コンポーネントでメタデータを設定していたが、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" } } };
v12まではnext/router
のuseRouter()
を使っていたが、v13からはnext/navigation
のuseRouter()
, usePathname()
, useSearchParams()
を使うことになる。
v12までのuseRouter()
で取得できていたpathname
とquery
がそれぞれ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の公式ガイドを読むとThemeRegistry
を実装すれば良いらしいことが分かるので、実装を追加した。
v12までは next build && next export
で静的HTMLを生成していた。
v13では、next.config.js
に"output: export"
を追加した上でnext build
だけを実行すれば良い。
参考: Deploying: Static Exports | Next.js