🔍 Add sitemap

This commit is contained in:
LittleSheep 2025-01-08 13:28:56 +08:00
parent 176e636f48
commit 2be8508914
4 changed files with 114 additions and 0 deletions

BIN
bun.lockb

Binary file not shown.

View File

@ -34,6 +34,7 @@
"remark-gfm": "^4.0.0",
"remark-parse": "^11.0.0",
"remark-rehype": "^11.1.1",
"sitemap": "^8.0.0",
"unified": "^11.0.5",
"zustand": "^5.0.2"
},

View File

@ -0,0 +1,49 @@
import { sni } from '@/services/network'
import { SnPost } from '@/services/post'
import { GetServerSideProps } from 'next'
import { EnumChangefreq, SitemapItem, SitemapStream, streamToPromise } from 'sitemap'
import { Readable } from 'stream'
function generateSiteMap(posts: SnPost[]): Promise<string> {
const links: SitemapItem[] = posts.map((p) => ({
url: p.alias && p.aliasPrefix ? `/posts/${p.aliasPrefix}/${p.alias}` : `/posts/${p.id}`,
lastmod: (p.editedAt ?? p.publishedAt ?? p.editedAt)?.toString(),
changefreq: EnumChangefreq.DAILY,
priority: 0.9,
img: [],
video: [],
links: [],
}))
const stream = new SitemapStream({ hostname: 'https://solsynth.dev' })
return streamToPromise(Readable.from(links).pipe(stream)).then((data) => data.toString())
}
export const getServerSideProps: GetServerSideProps = async ({ res, query }) => {
let page: number = parseInt(query.page as string)
if (isNaN(page)) page = 1
const countPerPage = 500
const { data: resp } = await sni.get<{ data: SnPost[] }>('/cgi/co/posts/minimal', {
params: {
take: countPerPage,
offset: (page - 1) * countPerPage,
},
})
const sitemap = await generateSiteMap(resp.data)
res.setHeader('Content-Type', 'text/xml')
res.write(sitemap)
res.end()
return {
props: {},
}
}
export default function PostSiteMap() {
// getServerSideProps will do the heavy lifting
}

64
src/pages/sitemap.xml.ts Normal file
View File

@ -0,0 +1,64 @@
import { GetServerSideProps } from 'next'
import { EnumChangefreq, SitemapItem, SitemapStream, streamToPromise } from 'sitemap'
import { Readable } from 'stream'
function generateSiteMap(): Promise<string> {
const links: SitemapItem[] = [
{
url: '/',
lastmod: new Date().toString(),
changefreq: EnumChangefreq.WEEKLY,
priority: 0.7,
img: [],
video: [],
links: [],
},
{
url: '/products/solar-network',
lastmod: new Date().toString(),
changefreq: EnumChangefreq.WEEKLY,
priority: 0.7,
img: [],
video: [],
links: [],
},
{
url: '/posts',
lastmod: new Date().toString(),
changefreq: EnumChangefreq.HOURLY,
priority: 0.8,
img: [],
video: [],
links: [],
},
{
url: '/posts/sitemap.xml',
lastmod: new Date().toString(),
changefreq: EnumChangefreq.HOURLY,
priority: 0.8,
img: [],
video: [],
links: [],
},
]
const stream = new SitemapStream({ hostname: 'https://solsynth.dev' })
return streamToPromise(Readable.from(links).pipe(stream)).then((data) => data.toString())
}
export const getServerSideProps: GetServerSideProps = async ({ res, query }) => {
const sitemap = await generateSiteMap()
res.setHeader('Content-Type', 'text/xml')
res.write(sitemap)
res.end()
return {
props: {},
}
}
export default function PostSiteMap() {
// getServerSideProps will do the heavy lifting
}