To render markdown content, we’ll use the remark library. First, let’s install it:
npm install remark remark-html
Import them in lib/posts.js:
import remark from 'remark' import html from 'remark-html'
And update getPostData() as follows to use remark:
export async function getPostData(id) { const fullPath = path.join(postsDirectory, `${id}.md`) const fileContents = fs.readFileSync(fullPath, 'utf8') // Use gray-matter to parse the post metadata section const matterResult = matter(fileContents) // Use remark to convert markdown into HTML string const processedContent = await remark() .use(html) .process(matterResult.content) const contentHtml = processedContent.toString() // Combine the data with the id and contentHtml return { id, contentHtml, ...matterResult.data } }
Important: We added the
asynckeyword togetPostDatabecause we need to useawaitforremark.async/awaitallow you to fetch data asynchronously.
That means we need to update getStaticProps in pages/posts/[id].js to use await when calling getPostData:
export async function getStaticProps({ params }) { // Add the "await" keyword like this: const postData = await getPostData(params.id) // ... }
Finally, update the Post component to render contentHtml using dangerouslySetInnerHTML:
export default function Post({ postData }) { return ( <Layout> {postData.title} <br /> {postData.id} <br /> {postData.date} <br /> <div dangerouslySetInnerHTML={{ __html: postData.contentHtml }} /> </Layout> ) }
Try visiting these pages again:
You should now see the blog content:
We’re almost done! Let’s polish each page next.