記事

Next.jsでsitemapの実装を進める

#tech

{
        url: `${domain}`,
        lastModified: new Date(),
        changeFrequency: 'daily',
        priority: 1,
      },

目標はこのjsonの形にできたらいい

sitemapとは

静的なページは手書きするのはしんどいので、pathベースでファイルやディレクトリを切っているので、shellスクリプトとかで自動的にしたい

  • 動的なページはAPIを叩いて、パスを取得してくるしかない

できた

// src/tools/generateSitemapUrl.sh
#!/bin/bash

# 環境によってドメインを変更
if [ "$1" = "production" ]; then
  domain="https://example.com"  # 本番環境のドメインに置き換えてください
else
  domain="https://staging.example.com"  # ステージング環境のドメインに置き換えてください
fi

# Next.jsのページディレクトリ(ルートディレクトリからの相対パス)
pages_dir="./src/pages"

# 出力ファイルのパス(toolsディレクトリ内に保存)
output_dir="./src/tools"
output_file="$output_dir/sitemap.json"

# 出力ディレクトリが存在しない場合は作成
mkdir -p "$output_dir"

# URLリストを格納する配列
urls=()

# ファイルを再帰的に探索してURLを生成
generate_urls() {
    local dir=$1
    local base_url=$2

    for entry in "$dir"/*; do
        if [ -d "$entry" ]; then
            # ディレクトリの場合、再帰的に呼び出す
            generate_urls "$entry" "$base_url$(basename "$entry")/"
        elif [ -f "$entry" ]; then
            # ファイルの場合、URLを生成
            filename=$(basename -- "$entry")
            extension="${filename##*.}"
            name="${filename%.*}"

            if [[ ("$extension" = "js" || "$extension" = "tsx") && ("$name" != "_app" && "$name" != "_document") ]]; then
                # indexファイルの場合、ディレクトリ名のみを使用
                if [ "$name" = "index" ]; then
                    urls+=("${base_url}")
                else
                    urls+=("${base_url}${name}/")
                fi
            fi
        fi
    done
}

# URL生成を開始
generate_urls "$pages_dir" "$domain/"

# 出力ファイルを初期化
echo "[" > "$output_file"

# 結果を出力ファイルに書き込む
for url in "${urls[@]}"; do
    echo "{
        \"url\": \"${url}\",
        \"lastModified\": \"$(date -u +"%Y-%m-%dT%H:%M:%SZ")\",
        \"changeFrequency\": \"daily\",
        \"priority\": 1
    }," >> "$output_file"
done

# 最後のカンマを削除して閉じる
truncate -s-2 "$output_file"
echo "]" >> "$output_file"

echo "Sitemap has been generated and saved to $output_file."
    "generate-sitemap:staging": "sh ./src/tools/generateSitemapUrl.sh staging",
    "generate-sitemap:production": "sh ./src/tools/generateSitemapUrl.sh production"

© 2026 Shotaro Kinjo