AI Workshop: learn to build apps with AI →
Recipes: How to parse Markdown in Next.js

Join the AI Workshop and learn to build real-world apps with AI. A hands-on, practical program to level up your skills.


I had a field with markdown and I wanted to print it in a Next.js page.

I used marked, dompurify and jsdom. Here’s an example in a Next.js dynamic page, to render an item’s description.

Note that I had to call DOMPurify.sanitize() server-side, as it assumes we’re in a Node.js environment, so I put it into getStaticProps():

import { useState, useEffect } from 'react'
import Head from 'next/head'
import Link from 'next/link'
import { useRouter } from 'next/router'
import { getItem, getItems } from 'lib/data.js'
import prisma from 'lib/prisma'
import marked from 'marked'
import createDOMPurify from 'dompurify'
import { JSDOM } from 'jsdom'

export default function Item({ item }) {
  return <p>{item.description}</p>
}

export async function getStaticPaths() { //data fetching
  const items = await getItems(prisma)

  return {
    paths: items.map(item => ({
      params: {
        id: String(item.id),
      },
    })),
    fallback: false,
  }
}

export async function getStaticProps({ params }) {
  const id = String(params.id)
  const item = await getItem(prisma, id) //unrelated

  const window = new JSDOM('').window
  const DOMPurify = createDOMPurify(window)
  item.description = DOMPurify.sanitize(marked(item.description))

  return { props: { item } }
}

Lessons in this unit:

0: Introduction
1: Using the router to detect the active link in Next.js
2: Next.js Email Authentication using NextAuth
3: How to force a page refresh in Next.js
4: How to add Google Analytics 4 to Next.js
5: Next.js, how to open a link in a new window
6: ▶︎ How to parse Markdown in Next.js
7: How to add ReCaptcha to a Next.js form
8: How to upload files in a Next.js form