Không. Chuẩn sitemap giới hạn 50.000 URL hoặc 50MB (chưa nén) mỗi file. Vượt ngưỡng thì Google bỏ qua phần dư. Ngoài ra, dựng một mảng 200.000 phần tử trong một hàm còn dễ hết bộ nhớ lúc build hoặc timeout lúc request.
Cách đúng là chia nhỏ bằng generateSitemaps:
// app/products/sitemap.ts
export async function generateSitemaps() {
const total = await countProducts()
return Array.from({ length: Math.ceil(total / 50000) }, (_, id) => ({ id }))
}
export default async function sitemap({ id }: { id: number }): Promise<MetadataRoute.Sitemap> {
const rows = await getProducts({ offset: id * 50000, limit: 50000 })
return rows.map((p) => ({
url: `https://example.com/products/${p.slug}`,
lastModified: p.updatedAt,
}))
}Next.js sinh ra /products/sitemap/0.xml, /products/sitemap/1.xml... Bạn khai báo chúng trong một sitemap index và trỏ robots.txt tới index đó.
Hai lưu ý thực chiến:
- lastModified phải là thời điểm nội dung thực sự đổi. Nếu cứ trả new Date() mỗi lần build, tín hiệu này mất giá trị và crawler bỏ qua.
- Sitemap chỉ nên chứa URL 200, có thể index, dạng canonical. Nhét URL bị redirect, noindex hay chặn bởi robots vào sẽ làm hao ngân sách thu thập.