typescriptintermediate

Dynamic Sitemap Generation

Generate dynamic XML sitemaps from data sources with priority, changefreq, and sitemap index support.

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

const BASE_URL = process.env.NEXT_PUBLIC_SITE_URL ?? 'https://example.com';

// Simulated data fetchers
async function getAllCategories() {
  return [
    { slug: 'react', updatedAt: '2024-01-15' },
    { slug: 'nodejs', updatedAt: '2024-01-14' },
    { slug: 'python', updatedAt: '2024-01-13' },
  ];
}

async function getAllSnippets() {
  return [
    { category: 'react', slug: 'use-fetch-hook', updatedAt: '2024-01-15' },
    { category: 'react', slug: 'error-boundary', updatedAt: '2024-01-14' },
    { category: 'nodejs', slug: 'jwt-verify', updatedAt: '2024-01-13' },
  ];
}

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const [categories, snippets] = await Promise.all([
    getAllCategories(),
    getAllSnippets(),
  ]);

  // Static pages
  const staticPages: MetadataRoute.Sitemap = [
    {
      url: BASE_URL,
      lastModified: new Date(),
      changeFrequency: 'daily',
      priority: 1.0,
    },
    {
      url: `${BASE_URL}/search`,
      lastModified: new Date(),
      changeFrequency: 'weekly',
      priority: 0.5,
    },
  ];

  // Category pages
  const categoryPages: MetadataRoute.Sitemap = categories.map((cat) => ({
    url: `${BASE_URL}/${cat.slug}`,
    lastModified: new Date(cat.updatedAt),
    changeFrequency: 'weekly' as const,
    priority: 0.8,
  }));

  // Snippet pages (highest priority — money pages)
  const snippetPages: MetadataRoute.Sitemap = snippets.map((s) => ({
    url: `${BASE_URL}/${s.category}/${s.slug}`,
    lastModified: new Date(s.updatedAt),
    changeFrequency: 'monthly' as const,
    priority: 0.9,
  }));

  return [...staticPages, ...categoryPages, ...snippetPages];
}

// app/robots.ts
// import { MetadataRoute } from 'next';
// export default function robots(): MetadataRoute.Robots {
//   return {
//     rules: { userAgent: '*', allow: '/', disallow: '/api/' },
//     sitemap: `${BASE_URL}/sitemap.xml`,
//   };
// }

Use Cases

  • Automated sitemap generation
  • SEO crawl optimization
  • Search engine indexing

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.