SvelteKit 服务端渲染:生成 XML 及其他非 HTML 格式响应的方法
SvelteKit 输出非HTML格式内容的实现方法
SvelteKit 专门提供了服务端路由(+server.js/+server.ts)来处理任意格式的响应输出,你要生成sitemap.xml、RSS 订阅源这类 XML 内容,直接用这套路由规则即可。
1. 生成 sitemap.xml 示例
首先在项目的src/routes目录下创建路径为sitemap.xml/+server.js的文件,代码示例如下:
// 引入你自己的博客内容查询方法,比如从CMS、本地markdown文件读取文章列表 import { getAllBlogPosts } from '$lib/server/posts.js' export async function GET() { const posts = await getAllBlogPosts() // 拼接 sitemap 标准XML内容 const sitemap = `<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>https://你的博客域名/</loc> <lastmod>2024-01-01</lastmod> <changefreq>daily</changefreq> <priority>1.0</priority> </url> ${posts.map(post => ` <url> <loc>https://你的博客域名/posts/${post.slug}</loc> <lastmod>${post.updateTime}</lastmod> <changefreq>weekly</changefreq> <priority>0.8</priority> </url> `).join('')} </urlset>` // 返回XML响应,指定正确的MIME类型 return new Response(sitemap, { headers: { 'Content-Type': 'application/xml', // 可选:配置缓存,降低服务器压力 'Cache-Control': 'max-age=86400' } }) }
部署后访问你的站点域名/sitemap.xml即可拿到正常的站点地图文件。
2. 生成 RSS 订阅源示例
和站点地图逻辑一致,创建src/routes/rss.xml/+server.js文件,代码示例如下:
import { getAllBlogPosts } from '$lib/server/posts.js' export async function GET() { const posts = await getAllBlogPosts() const rss = `<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> <channel> <title>你的博客名称</title> <link>https://你的博客域名/</link> <description>你的博客描述</description> <atom:link href="https://你的博客域名/rss.xml" rel="self" type="application/rss+xml" /> ${posts.map(post => ` <item> <title>${post.title}</title> <link>https://你的博客域名/posts/${post.slug}</link> <description>${post.excerpt}</description> <pubDate>${new Date(post.publishTime).toUTCString()}</pubDate> <guid>https://你的博客域名/posts/${post.slug}</guid> </item> `).join('')} </channel> </rss>` return new Response(rss, { headers: { 'Content-Type': 'application/xml', 'Cache-Control': 'max-age=86400' } }) }
3. 其他非HTML格式的通用输出方法
如果需要输出其他格式,只需要修改返回的Response内容和对应的Content-Type即可,常见场景:
- 输出纯文本:
Content-Type设为text/plain - 输出JSON:
Content-Type设为application/json,可以直接返回SvelteKit内置的json(你的JSON对象)(需要从@sveltejs/kit引入json辅助函数) - 输出CSV:
Content-Type设为text/csv
注意事项
- 生成XML内容时要注意特殊字符转义(比如
<、&这类字符要转义为实体编码),避免XML格式校验失败 - 动态内容可以按需调整缓存时间,静态内容可以设置更长的缓存周期提升访问速度
- 以上写法适配SvelteKit 1.0及以上的正式版本,旧版本的endpoint逻辑和核心思路一致,仅文件路径规则有区别
内容的提问来源于stack exchange,提问作者Mikko Ohtamaa
相关产品推荐
相关产品推荐

