この記事は人間が実装を確認したのち、AIが記事を執筆しました。

背景

Next.js 15で静的サイト生成(output: 'export')を使用する際、sitemap.tsの実装でエラーが発生する場合があります。

Error: export const dynamic = "force-static"/export const revalidate not configured on route "/sitemap.xml" with "output: export".

解決方法

この問題は、sitemap.tsに以下の2つのエクスポートを追加することで解決できます:

// src/app/sitemap.ts
import { MetadataRoute } from 'next';

export const dynamic = 'force-static';
export const revalidate = false;

export default function sitemap(): MetadataRoute.Sitemap {
  // sitemap生成ロジック
}

実装例

import { MetadataRoute } from 'next';
import { routing } from '@/i18n/routing';

export const dynamic = 'force-static';
export const revalidate = false;

export default function sitemap(): MetadataRoute.Sitemap {
  const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000';

  const staticPages = [
    '', // Home page
    '/about',
    '/example',
  ];

  const sitemapEntries: MetadataRoute.Sitemap = routing.locales.flatMap((locale) =>
    staticPages.map((page) => ({
      url: `${baseUrl}/${locale}${page}`,
      lastModified: new Date(),
      changeFrequency: page === '' ? 'daily' : 'weekly' as const,
      priority: page === '' ? 1 : 0.8,
    }))
  );

  return sitemapEntries;
}

動作確認

この実装により、npm run build実行時に/out/sitemap.xmlが正常に生成されます。

注意点

  • dynamic = 'force-static'のみでは不十分で、revalidate = falseも必要です
  • 環境変数やインポートしたモジュールの使用も可能です
  • ビルド時に静的に解決される値であれば、動的な値も使用できます

代替案

もし上記の方法で解決しない場合は、以下の代替案があります:

  1. ビルドスクリプトでsitemap.xmlを生成
  2. publicディレクトリに静的なsitemap.xmlを配置

まとめ

Next.js 15でoutput: 'export'を使用する場合でも、適切な設定を追加することでsitemap.tsを使用したサイトマップ生成が可能です。この方法により、Next.jsの標準機能を活用しつつ、型安全性を保ったサイトマップ生成が実現できます。

参考資料