技術ブログをApp Router から Pages Router に移行した話

Next.js で Markdown ベースのブログを作り、
Google Cloud Storage に静的ホスティングする構成を作りました。

当初は App Router(app/) を使っていましたが、
結果的に Pages Router(pages/)に移行することになりました。

この記事では、
「なぜ App Router をやめて Pages Router にしたのか?」
「何が問題で、どう解決したのか?」
をまとめます。


1. Next.js + Markdown で静的ブログ構築

App Router と Pages Router の違いと、今回 Pages Router に移行した理由

Next.js で静的ブログを作る際、仕組みとしてはシンプルで、

  • Markdown (.md) を読み込む
  • FrontMatter(title/date/tags)を解析
  • 静的 HTML を生成 (output: export)
  • GCS にアップロードして公開

という流れです。

しかし、App Router(app/) を使っていた時に、以下の問題が実際に発生しました。


■ App Router と Pages Router の違い

項目 App Router Pages Router
導入 Next.js 13〜 の新方式 従来の方式
データ取得 Server Components / fetch getStaticProps が安定
静的エクスポート クセあり 非常に安定
fs 利用 環境により不安定 普通に使える
相対リンクの扱い 壊れやすい そのまま出力される

🚫 1. fs が安定しない(Markdown 読み込み問題)

App Router は Server Components が基本のため、
dev と export で挙動が異なり、Markdown が読めない場面が発生しました。


🚫 2. 相対パスリンクが壊れる(タグページ・記事ページ)

posts/xxx.htmltags/yyy.html にしたかったが、
App Router は URL の扱いが特殊でリンクが正しく生成されませんでした。

Pages Router に移行すると 相対パスがそのまま出るため安定 しました。


🚫 3. output: "export" との相性問題

Next.js 14 で next export 廃止後、
App Router は静的エクスポートと相性が悪く、SSR/RSC が混在しエラーが出やすい。

Pages Router では完全静的 HTML が安定して生成されました。


■ 結論:静的ブログは Pages Router が最適

  • ファイル読み込み(fs)が確実に動く
  • 相対リンクが壊れない
  • GCS のような静的ホスティングと相性が良い

という理由で Pages Router へ移行したことで全て解決 しました。