You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:24:05