feat: SEO overhaul — expanded sitemap, JSON-LD, canonical URLs, search metadata

This commit is contained in:
2026-04-27 16:05:31 +08:00
parent 9a6db98d42
commit 713b309f74
5 changed files with 96 additions and 19 deletions
+27 -14
View File
@@ -1,21 +1,34 @@
import type { MetadataRoute } from "next"
import { db } from "@/lib/db/index"
import { games, hardware } from "@/lib/db/schema"
const BASE_URL = "https://deckyvault.xyz"
export default function sitemap(): MetadataRoute.Sitemap {
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const [allGames, allDevices] = await Promise.all([
db.select({ id: games.id, updatedAt: games.updatedAt }).from(games),
db.select({ slug: hardware.slug, updatedAt: hardware.updatedAt }).from(hardware),
])
const gameEntries: MetadataRoute.Sitemap = allGames.map((game) => ({
url: `${BASE_URL}/game/${game.id}`,
lastModified: game.updatedAt,
changeFrequency: "weekly",
priority: 0.8,
}))
const deviceEntries: MetadataRoute.Sitemap = allDevices.map((device) => ({
url: `${BASE_URL}/devices/${device.slug}`,
lastModified: device.updatedAt,
changeFrequency: "monthly",
priority: 0.6,
}))
return [
{
url: BASE_URL,
lastModified: new Date(),
changeFrequency: "weekly",
priority: 1,
},
// Future dynamic routes can be added here:
// {
// url: `${BASE_URL}/games/${game.slug}`,
// lastModified: game.updatedAt,
// changeFrequency: "weekly",
// priority: 0.8,
// },
{ url: BASE_URL, lastModified: new Date(), changeFrequency: "weekly", priority: 1 },
{ url: `${BASE_URL}/search`, lastModified: new Date(), changeFrequency: "weekly", priority: 0.7 },
{ url: `${BASE_URL}/devices`, lastModified: new Date(), changeFrequency: "monthly", priority: 0.6 },
...gameEntries,
...deviceEntries,
]
}