使用 Node JS 的 `rss` 模块时,将 RSS 添加到 Next.js MDX 博客。如何将 MDX 转换为 HTML?
Add RSS to Next.js MDX Blog while using `rss` module for Node JS . How do I convert MDX to HTML?
目前,我在将 MDX 转换为 HTML 时遇到问题。
我这样做是为了 Tailwind Blog
完整代码在Github→https://github.com/tailwindlabs/blog.tailwindcss.com
相关代码如下:
scripts/build-rss.js
import fs from 'fs'
import path from 'path'
import getAllPostPreviews from '../src/getAllPostPreviews'
import RSS from 'rss'
const siteUrl = 'https://blog.tailwindcss.com'
const feed = new RSS({
title: 'Blog – Tailwind CSS',
site_url: siteUrl,
feed_url: `${siteUrl}/feed.xml`,
})
getAllPostPreviews().forEach(({ link, module: { meta, default: html } }) => {
console.log(html)
const postText = `<div style="margin-top=55px; font-style: italic;">(The post <a href="${siteUrl + link}">${meta.title}</a> appeared first on <a href="${siteUrl}">Tailwind CSS Blog</a>.)</div>`;
feed.item({
title: meta.title,
guid: link,
url: `https://blog.tailwindcss.com${link}`,
date: meta.date,
description: meta.description,
custom_elements: [{
"content:encoded": html + postText
}].concat(meta.authors.map((author) => ({ author: [{ name: author.name }] }))),
})
})
fs.writeFileSync('./out/feed.xml', feed.xml({ indent: true }))
html
变量记录到控制台:
[Function: MDXContent] { isMDXComponent: true }
如何获得纯文本 HTML?
这比我想象的要复杂一些。无论如何,这是我为获得 HTML:
所做的更改
我将 resourceQuery: /rss/
添加到 next.config.js
,例如:
next.config.js
{
resourceQuery: /rss/,
use: [
...mdx,
createLoader(function (src) {
return this.callback(null, src)
}),
],
},
通过添加新函数 getAllPosts
在 getAllPostPreviews.js
中使用上述 rss
查询,例如:
getAllPostPreviews.js
export function getAllPosts() {
return importAll(require.context('./pages/?rss', true, /\.mdx$/)).sort((a, b) =>
dateSortDesc(a.module.meta.date, b.module.meta.date)
)
}
我从 Post.js
导出了 mdxComponents
,例如:
Post.js
export const mdxComponents = {
...
}
最后,将 scripts/build-rss.js
更改为使用 ReactDOMServer.renderToStaticMarkup()
,将其包装在 MDXProvider
中,例如:
import ReactDOMServer from 'react-dom/server'
import { MDXProvider } from '@mdx-js/react'
import { mdxComponents } from '../src/components/Post'
import { getAllPosts } from '../src/getAllPostPreviews'
getAllPosts().forEach(({ link, module: { meta, default: Content } }, i) => {
const mdx = <MDXProvider components={mdxComponents}><Content /></MDXProvider>
const html = ReactDOMServer.renderToStaticMarkup(mdx)
...
}
灵感来自 https://ianmitchell.dev/blog/building-a-nextjs-blog-rss & https://github.com/IanMitchell/ianmitchell.dev
目前,我在将 MDX 转换为 HTML 时遇到问题。
我这样做是为了 Tailwind Blog
完整代码在Github→https://github.com/tailwindlabs/blog.tailwindcss.com
相关代码如下:
scripts/build-rss.js
import fs from 'fs'
import path from 'path'
import getAllPostPreviews from '../src/getAllPostPreviews'
import RSS from 'rss'
const siteUrl = 'https://blog.tailwindcss.com'
const feed = new RSS({
title: 'Blog – Tailwind CSS',
site_url: siteUrl,
feed_url: `${siteUrl}/feed.xml`,
})
getAllPostPreviews().forEach(({ link, module: { meta, default: html } }) => {
console.log(html)
const postText = `<div style="margin-top=55px; font-style: italic;">(The post <a href="${siteUrl + link}">${meta.title}</a> appeared first on <a href="${siteUrl}">Tailwind CSS Blog</a>.)</div>`;
feed.item({
title: meta.title,
guid: link,
url: `https://blog.tailwindcss.com${link}`,
date: meta.date,
description: meta.description,
custom_elements: [{
"content:encoded": html + postText
}].concat(meta.authors.map((author) => ({ author: [{ name: author.name }] }))),
})
})
fs.writeFileSync('./out/feed.xml', feed.xml({ indent: true }))
html
变量记录到控制台:
[Function: MDXContent] { isMDXComponent: true }
如何获得纯文本 HTML?
这比我想象的要复杂一些。无论如何,这是我为获得 HTML:
所做的更改我将 resourceQuery: /rss/
添加到 next.config.js
,例如:
next.config.js
{
resourceQuery: /rss/,
use: [
...mdx,
createLoader(function (src) {
return this.callback(null, src)
}),
],
},
通过添加新函数 getAllPosts
在 getAllPostPreviews.js
中使用上述 rss
查询,例如:
getAllPostPreviews.js
export function getAllPosts() {
return importAll(require.context('./pages/?rss', true, /\.mdx$/)).sort((a, b) =>
dateSortDesc(a.module.meta.date, b.module.meta.date)
)
}
我从 Post.js
导出了 mdxComponents
,例如:
Post.js
export const mdxComponents = {
...
}
最后,将 scripts/build-rss.js
更改为使用 ReactDOMServer.renderToStaticMarkup()
,将其包装在 MDXProvider
中,例如:
import ReactDOMServer from 'react-dom/server'
import { MDXProvider } from '@mdx-js/react'
import { mdxComponents } from '../src/components/Post'
import { getAllPosts } from '../src/getAllPostPreviews'
getAllPosts().forEach(({ link, module: { meta, default: Content } }, i) => {
const mdx = <MDXProvider components={mdxComponents}><Content /></MDXProvider>
const html = ReactDOMServer.renderToStaticMarkup(mdx)
...
}
灵感来自 https://ianmitchell.dev/blog/building-a-nextjs-blog-rss & https://github.com/IanMitchell/ianmitchell.dev