使用 SvelteKit 的 RSS 提要
RSS feed with SvelteKit
我一直在尝试为我的网站生成 RSS 提要。虽然它在开发环境中完美运行,但在为生产环境构建时不会生成 xml 文件。
由于我以相同的方式创建了一些 json 文件并且这些文件已正确生成,我怀疑 xml.ts 格式可能不会被视为构建目标。
有人知道解决办法吗?
源代码(src/routes/rss.xml.ts)
import { getPosts } from '../lib/posts/getPosts';
const xml = (posts: postMeta[]) => `<?xml version="1.0" encoding="UTF-8" ?>
<rss xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:atom="https://www.w3.org/2005/Atom" version="2.0">
<channel>
<title>Kota Yatagai</title>
<link>https://kota-yata.com</link>
<description><![CDATA[Personal Blog & Stuffs by Kota Yatagai]]></description>
${posts.map(
post => `
<item>
<title><![CDATA[${post.meta.title}]]></title>
<description><![CDATA[${post.meta.description}]]></description>
<category>${post.meta.category}</category>
<link>https://kota-yata.com/posts/${post.path}</link>
<guid isPermaLink="true">https://kota-yata.com/posts/${post.path}</guid>
<pubDate><![CDATA[ ${post.meta.date}]]></pubDate>
<enclosure url="${post.meta.ogp || `https://kota-yata.com/ogp.webp`}" length="0" type="image/webp"/>
<dc:creator>Kota Yatagai</dc:creator>
</item>
`
).join('')}
</channel>
</rss>`;
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export const get = () => {
const headers = {
'Cache-Control': 'max-age=0, s-maxage=600',
'Content-Type': 'application/xml',
};
const posts = getPosts();
const body = xml(posts);
return { body, headers };
};
svelte.config.js(以防万一)
import adapter from '@sveltejs/adapter-static';
import preprocess from 'svelte-preprocess';
/** @type {import('@sveltejs/kit').Config} */
const config = {
// Consult https://github.com/sveltejs/svelte-preprocess
// for more information about preprocessors
preprocess: preprocess(),
kit: {
// hydrate the <div id="svelte"> element in src/app.html
target: '#svelte',
adapter: adapter({
pages: 'build',
assets: 'build',
fallback: null
})
},
};
export default config;
一个可能的原因是您没有link发送到此端点的任何内容。
当 SvelteKit 构建您的静态页面时,它将从主页 (index.svelte) 开始并抓取您的整个网站,“点击”每个 link,呈现页面并将其写入文件系统.但这意味着将不会呈现任何 non-linked 个页面。
这可能是你的问题,如果只是在 rss.xml
的某处添加一个 link,它也会正确生成该页面。
我一直在尝试为我的网站生成 RSS 提要。虽然它在开发环境中完美运行,但在为生产环境构建时不会生成 xml 文件。
由于我以相同的方式创建了一些 json 文件并且这些文件已正确生成,我怀疑 xml.ts 格式可能不会被视为构建目标。
有人知道解决办法吗?
源代码(src/routes/rss.xml.ts)
import { getPosts } from '../lib/posts/getPosts';
const xml = (posts: postMeta[]) => `<?xml version="1.0" encoding="UTF-8" ?>
<rss xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:atom="https://www.w3.org/2005/Atom" version="2.0">
<channel>
<title>Kota Yatagai</title>
<link>https://kota-yata.com</link>
<description><![CDATA[Personal Blog & Stuffs by Kota Yatagai]]></description>
${posts.map(
post => `
<item>
<title><![CDATA[${post.meta.title}]]></title>
<description><![CDATA[${post.meta.description}]]></description>
<category>${post.meta.category}</category>
<link>https://kota-yata.com/posts/${post.path}</link>
<guid isPermaLink="true">https://kota-yata.com/posts/${post.path}</guid>
<pubDate><![CDATA[ ${post.meta.date}]]></pubDate>
<enclosure url="${post.meta.ogp || `https://kota-yata.com/ogp.webp`}" length="0" type="image/webp"/>
<dc:creator>Kota Yatagai</dc:creator>
</item>
`
).join('')}
</channel>
</rss>`;
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export const get = () => {
const headers = {
'Cache-Control': 'max-age=0, s-maxage=600',
'Content-Type': 'application/xml',
};
const posts = getPosts();
const body = xml(posts);
return { body, headers };
};
svelte.config.js(以防万一)
import adapter from '@sveltejs/adapter-static';
import preprocess from 'svelte-preprocess';
/** @type {import('@sveltejs/kit').Config} */
const config = {
// Consult https://github.com/sveltejs/svelte-preprocess
// for more information about preprocessors
preprocess: preprocess(),
kit: {
// hydrate the <div id="svelte"> element in src/app.html
target: '#svelte',
adapter: adapter({
pages: 'build',
assets: 'build',
fallback: null
})
},
};
export default config;
一个可能的原因是您没有link发送到此端点的任何内容。
当 SvelteKit 构建您的静态页面时,它将从主页 (index.svelte) 开始并抓取您的整个网站,“点击”每个 link,呈现页面并将其写入文件系统.但这意味着将不会呈现任何 non-linked 个页面。
这可能是你的问题,如果只是在 rss.xml
的某处添加一个 link,它也会正确生成该页面。