rich-text
rich-text copied to clipboard
ReferenceError when using `richTextFromMarkdown` in Next.js production build
Hi!
I'm experiencing an issue when using richTextFromMarkdown in my Next.js application.
When I run richTextFromMarkdown with a rich text string (no matter how simple string), I get two types of errors: A Next.js hydration error, and a ReferenceError. This only occurs when running an optimized Next.js build (next build + next start) - it works fine with next dev.
I can go around the hydration error by dynamically importing the @contentful/rich-text-from-markdown (even though I of course would prefer not having to).
What I'm having trouble with is the ReferenceError, however. It reads: ReferenceError: locate$1 is not defined. I've tried to read up on the issues in this repo, but I can't find any similar issue. Am I doing anything wrong, or is this a bug?
Steps to reproduce
- Start a fresh next.js app (see my dependencies below)
- Create the following function inside pages/index.tsx
const testRichTextFromMarkdown = async () => {
const richText = await richTextFromMarkdown(`test string`)
console.log(richText)
}
- Call the function (e.g through a button click)
npm run build(next build)npm run start(next start)
My dependencies
"@contentful/rich-text-from-markdown": "^15.16.2", "@next/font": "13.1.1", "@types/node": "18.11.18", "@types/react": "18.0.26", "@types/react-dom": "18.0.10", "eslint": "8.31.0", "eslint-config-next": "13.1.1", "next": "13.1.1", "react": "18.2.0", "react-dom": "18.2.0", "typescript": "4.9.4"
This is happening to me as well. Simply importing the package onto a page breaks the page.
@swcolegrove Yeah, really frustrating. I ended up using Marked instead. Not sure if it's a solid replacer for everyone experiencing this issue, but their function lexer was exactly what I was trying to achieve with Contentful's richTextFromMarkdown (this package).
I ran into the hydration issue mentioned above when trying to use richTextFromMarkdown in the render function of a page component. The workaround I used was to process the markdown serverside - in either getStaticProps or getServerSideProps, depending on your need:
export const getStaticProps = async (context) => {
const { slug } = context.params;
const res = await client.getEntries({
content_type: 'post',
"fields.slug": slug,
});
// get your markdown text field into a variable
const someRichTextValue = res.items[0].body;
const rt = await richTextFromMarkdown(
someRichTextValue
);
return {
props: {
body: rt,
},
};
};
then in the render function,
return (
<>
<h1>Some page title</h1>
{renderContentfulRichText(props.body)}
</>
);
Hope that helps!