Generate a sitemap for your Astro site
npx @tessl/cli install tessl/npm-astrojs--sitemap@3.0.0@astrojs/sitemap is an Astro integration that automatically generates XML sitemaps for Astro websites during the build process. It provides comprehensive sitemap generation capabilities including support for static and dynamic routes, internationalization (i18n) with alternate language links, customizable filtering and serialization of pages, configurable entry limits for large sites with automatic sitemap splitting, and advanced configuration options for changefreq, lastmod, and priority metadata.
npm install @astrojs/sitemapimport sitemap from "@astrojs/sitemap";For type imports when configuring:
import sitemap, { type SitemapOptions, type ChangeFreq, type SitemapItem, type LinkItem, ChangeFreqEnum } from "@astrojs/sitemap";// astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [sitemap()],
});Basic configuration with options:
// astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
filter: (page) => !page.includes('/admin/'),
changefreq: 'weekly',
priority: 0.7,
lastmod: new Date(),
entryLimit: 10000
})
],
});The integration operates within Astro's build lifecycle:
astro:build:done to generate sitemaps after the build completesMain factory function that creates the Astro sitemap integration.
/**
* Creates an Astro integration for sitemap generation
* @param options - Optional configuration for sitemap generation
* @returns AstroIntegration instance
*/
function sitemap(options?: SitemapOptions): AstroIntegration;Filter pages to include or exclude from the sitemap.
interface SitemapOptions {
/**
* Function to filter pages by URL
* @param page - Full URL of the page
* @returns true to include page, false to exclude
*/
filter?(page: string): boolean;
}Include additional pages not generated by Astro.
interface SitemapOptions {
/** Array of custom page URLs to include in sitemap */
customPages?: string[];
}Override the site URL for sitemap generation (alternative to astro.config site option).
interface SitemapOptions {
/** Canonical URL to use instead of astro.config.site */
canonicalURL?: string;
}Configure i18n support with alternate language links.
interface SitemapOptions {
i18n?: {
/** Default locale key that must exist in locales */
defaultLocale: string;
/** Map of locale keys to language codes (e.g., 'en' -> 'en-US') */
locales: Record<string, string>;
};
}Control sitemap file splitting for large sites.
interface SitemapOptions {
/** Maximum number of entries per sitemap file (default: 45000) */
entryLimit?: number;
}Configure global sitemap metadata.
interface SitemapOptions {
/** Change frequency for all pages */
changefreq?: ChangeFreq;
/** Last modification date for all pages */
lastmod?: Date;
/** Priority value for all pages (0-1) */
priority?: number;
}Customize individual sitemap entries before writing.
interface SitemapOptions {
/**
* Function called for each sitemap entry before writing to disk
* @param item - Sitemap item to customize
* @returns Modified item, undefined to exclude, or Promise for async processing
*/
serialize?(item: SitemapItem): SitemapItem | Promise<SitemapItem | undefined> | undefined;
}Complete configuration interface for the sitemap integration.
type SitemapOptions = {
filter?(page: string): boolean;
customPages?: string[];
canonicalURL?: string;
i18n?: {
defaultLocale: string;
locales: Record<string, string>;
};
entryLimit?: number;
changefreq?: ChangeFreq;
lastmod?: Date;
priority?: number;
serialize?(item: SitemapItem): SitemapItem | Promise<SitemapItem | undefined> | undefined;
} | undefined;Represents a single entry in the sitemap.
interface SitemapItem {
/** Absolute URL of the page */
url: string;
/** Last modification date (ISO string) */
lastmod?: string;
/** Change frequency */
changefreq?: ChangeFreq;
/** Priority value (0-1) */
priority?: number;
/** Alternate language links for i18n */
links?: LinkItem[];
}Represents alternate language links for internationalization.
interface LinkItem {
/** Fully-qualified URL for this language version */
url: string;
/** Language code (e.g., 'en-US', 'es-ES') */
lang: string;
}String union type for sitemap changefreq values.
type ChangeFreq = 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never';Enum export for changefreq values (re-exported from 'sitemap' package).
enum ChangeFreqEnum {
ALWAYS = 'always',
HOURLY = 'hourly',
DAILY = 'daily',
WEEKLY = 'weekly',
MONTHLY = 'monthly',
YEARLY = 'yearly',
NEVER = 'never'
}// astro.config.mjs
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
filter: (page) => {
// Exclude admin pages and draft content
return !page.includes('/admin/') &&
!page.includes('/draft/') &&
!page.includes('?preview=');
}
})
],
});// astro.config.mjs
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
i18n: {
defaultLocale: 'en',
locales: {
en: 'en-US',
es: 'es-ES',
fr: 'fr-FR'
}
}
})
],
});// astro.config.mjs
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
serialize(item) {
// Set different priorities based on page type
if (item.url.includes('/blog/')) {
item.priority = 0.8;
item.changefreq = 'weekly';
} else if (item.url.includes('/products/')) {
item.priority = 0.9;
item.changefreq = 'daily';
} else if (item.url.includes('/archive/')) {
// Exclude archive pages
return undefined;
}
// Set last modified date
item.lastmod = new Date().toISOString();
return item;
}
})
],
});// astro.config.mjs
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
entryLimit: 10000, // Split into multiple files
customPages: [
'https://example.com/external-app',
'https://example.com/api-docs'
]
})
],
});// astro.config.mjs
import sitemap from '@astrojs/sitemap';
export default defineConfig({
// No site option required when using canonicalURL
integrations: [
sitemap({
canonicalURL: 'https://example.com',
customPages: [
'https://example.com/spa-pages'
]
})
],
});