この記事は人間が実装を確認したのち、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も必要です- 環境変数やインポートしたモジュールの使用も可能です
- ビルド時に静的に解決される値であれば、動的な値も使用できます
代替案
もし上記の方法で解決しない場合は、以下の代替案があります:
- ビルドスクリプトでsitemap.xmlを生成
- publicディレクトリに静的なsitemap.xmlを配置
まとめ
Next.js 15でoutput: 'export'を使用する場合でも、適切な設定を追加することでsitemap.tsを使用したサイトマップ生成が可能です。この方法により、Next.jsの標準機能を活用しつつ、型安全性を保ったサイトマップ生成が実現できます。