【Next.js】App Routerを利用した際のStatic Exportsについて整理する

こんにちは、サイオステクノロジーの遠藤です。今回はNext.js 15でApp Routerを利用した際のStatic Exportsについて整理します。

Static Exportsとは?

Static Exportsは、build時に、アプリケーションを静的コンテンツとしてエクスポートできる機能です。Static Exportsを利用せずにNext.jsのアプリケーションを公開する場合はNode.jsランタイムが必要となりますが、Static Exportsを利用してbuildをかけた場合はクライアントサイドだけで動くコードが吐き出されるので、Node.js環境が必要なくなるのがメリットです。

Static Exportsのやり方

公式ガイド : https://nextjs.org/docs/app/building-your-application/deploying/static-exports

next.config.jsにて output: ‘export’, の記述を追加すると、静的エクスポートを利用できるようになります。

import type { NextConfig } from "next";

const nextConfig: NextConfig = {
  output: "export",
};

export default nextConfig;


その後、npm run build を実行すると、out ディレクトリにHTML/CSS/JS assetsが作成されます。

Static ExportsでServer Componentsを利用した場合の挙動

名前にserverとついているためややこしいですが、Static ExportsでServer Componentsを使用することは可能です。ただ、注意点があり、ビルド時にServer Componentsが実行されて生成されたコンテンツに固定されます。

わかりやすく説明するために、ランダムに4桁の数字を返してくれるAPIのFetchのClient Components上で行った場合と、Server Components上で行った場合に分けて考えてみましょう。

通常のデプロイを利用してNode.jsサーバー上にデプロイ

Client Components上で行った場合とServer Components上で行った場の両方でリクエストが来るたびにフェッチを行い、毎回ランダムな値(一回目 : 3592, 二回目 : 5285 …)を表示します。

Static Exportsを利用

  • Client Components上で行った場合
    • リクエストが来るたびにフェッチを行い、毎回ランダムな値(一回目 : 3592, 二回目 : 5285 …)を表示します。
  • Server Components上で行った場合
    • ビルド時にServer Componentsが実行されて一度フェッチが行われます。(値は6472)。サーバーを起動してリクエストを送ると以降6472だけ表示され続けられます。

Dynamic Routesの使用に制限がある

Next.jsにはリクエストに応じて動的データからルートを作成してくれるDynamic Routesという機能があります。以下のように[slug]ディレクトリを作成することで使用することができます。

ルートURLの例params
app/blog/[slug]/page.js/blog/a{ slug: 'a' }
app/blog/[slug]/page.js/blog/b{ slug: 'b' }
app/blog/[slug]/page.js/blog/c{ slug: 'c' }

このDynamic Routesの機能ですが、リクエストごとにサーバーでルートを作成するといった機能のため、基本的にはStatic Exportsでは利用することが出来ません。

ただ、Dynamic Routesに、generateStaticParams という関数を利用することで、ビルド時にfetchを行い、静的にルートを作成することができます。この機能を利用することで、Static Exportsを利用した場合でも静的にルートを作成したページに関してはアクセスできるようになります。

そのほかサポートされていない機能

Static Exportsではサーバーで動く機能は使用できないため、MiddlewareやServer Actionsといった機能を使用することが出来ません。2025/02の段階で使用できない機能は以下の機能です。

公式ガイド : https://nextjs.org/docs/app/building-your-application/deploying/static-exports#unsupported-features

まとめ

今回はNext.jsのStatic Exportsについてまとめました。特にServer Componentsについては曖昧な理解だったため今回実際にコードを書いて挙動を確認したことにより理解を確かにすることが出来ました。「Static ExportsでServer Componentsを利用しているのになぜbuildが通るんだろう?」といった疑問を持っていた方の助けになれば幸いです!

ではまた~

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です