import fs from 'fs' import { Feed } from 'feed' import BLOG from '@/blog.config' import ReactDOMServer from 'react-dom/server' import { getPostBlocks } from './notion' import NotionPage from '@/components/NotionPage' /** * 生成RSS内容 * @param {*} post * @returns */ const createFeedContent = async post => { // 加密的文章内容只返回摘要 if (post.password && post.password !== '') { return post.summary } const blockMap = await getPostBlocks(post.id, 'rss-content') if (blockMap) { post.blockMap = blockMap const content = ReactDOMServer.renderToString() const regexExp = /
.*?<\/svg>
.*?<\/div><\/div>
.*?<\/div><\/div><\/div><\/div>/g return content.replace(regexExp, '') } } export async function generateRss(posts) { const year = new Date().getFullYear() const feed = new Feed({ title: BLOG.TITLE, description: BLOG.DESCRIPTION, link: `${BLOG.LINK}/${BLOG.SUB_PATH}`, language: BLOG.LANG, favicon: `${BLOG.LINK}/favicon.png`, copyright: `All rights reserved ${year}, ${BLOG.AUTHOR}`, author: { name: BLOG.AUTHOR, email: BLOG.CONTACT_EMAIL, link: BLOG.LINK } }) for (const post of posts) { feed.addItem({ title: post.title, link: `${BLOG.LINK}/${post.slug}`, description: post.summary, content: await createFeedContent(post), date: new Date(post?.publishDay) }) } try { fs.mkdirSync('./public/rss', { recursive: true }) fs.writeFileSync('./public/rss/feed.xml', feed.rss2()) fs.writeFileSync('./public/rss/atom.xml', feed.atom1()) fs.writeFileSync('./public/rss/feed.json', feed.json1()) } catch (error) { // 在vercel运行环境是只读的,这里会报错; // 但在vercel编译阶段、或VPS等其他平台这行代码会成功执行 // RSS被高频词访问将大量消耗服务端资源,故作为静态文件 } }