I'm building a website using Next.js with (local) MDX files for content. Whenever I add a .MDX file to my source tree and try to navigate to it, Next.js throws a parsing error either after '#' signs (# Heading), the front-matter, or JSX content. It simply attempts to interpret the file as plain JavaScript and fails.
I'm using Next.js version 14.0.4 and have installed the following dependencies:
@next/mdx @mdx-js/loader @mdx-js/react @types/mdx gray-matter
"@mdx-js/loader": "^3.0.0",
"@mdx-js/react": "^3.0.0",
"@next/mdx": "^14.0.4",
"@types/mdx": "^2.0.10",
"gray-matter": "^4.0.3",
Here's my next.config.js:
/** @type {import('next').NextConfig} */
const nextConfig = {
pageExtensions: ['js', 'jsx', 'mdx', 'ts', 'tsx'],
reactStrictMode: true,
}
module.exports = nextConfig
This is the file I'm trying to parse:
---
Title: Test Post
---
# This is just a test post
Hello!
The error messages I get look like this:
Module parse failed: Assigning to rvalue (1:2)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
I've installed the MDX loader as per the Next.js docs. I have also tried the following next.config.js, but the errors remained:
/** @type {import('next').NextConfig} */
const nextConfig = {
pageExtensions: ['js', 'jsx', 'mdx', 'ts', 'tsx'],
webpack: (config, {defaultLoaders}) => {
config.module.rules.push({
test: '/\.mdx$/',
use: [
defaultLoaders.babel, {
loader: '@mdx-js/loader'
}
]
});
return config;
}
}
module.exports = nextConfig
I've figured it out, the issue was the config file. I wasn't importing
withMDXfrom the@next/mdxpackage and wrapping the config object in it.Here's the corrected version:
Note that it doesn't work without the
()at the end of therequirestatement.