Next.js + MDX
Use MDX with Next.js
Installation
For usage with the app directory see the section below.
npm install @next/mdx @mdx-js/loader
or
yarn add @next/mdx @mdx-js/loader
Usage
Create a next.config.js in your project
const withMDX = require('@next/mdx')()
module.exports = withMDX()
Optionally you can provide MDX plugins:
const withMDX = require('@next/mdx')({
options: {
remarkPlugins: [],
rehypePlugins: [],
},
})
module.exports = withMDX()
Optionally you can add your custom Next.js configuration as parameter
const withMDX = require('@next/mdx')()
module.exports = withMDX({
webpack(config, options) {
return config
},
})
By default MDX will only match and compile MDX files with the .mdx extension.
However, it can also be optionally configured to handle markdown files with the .md extension, as shown below:
const withMDX = require('@next/mdx')({
extension: /\.(md|mdx)$/,
})
module.exports = withMDX()
In addition, MDX can be customized with compiler options, see the mdx documentation for details on supported options.
Top level .mdx pages
Define the pageExtensions option to have Next.js handle .md and .mdx files in the pages directory as pages:
const withMDX = require('@next/mdx')({
extension: /\.mdx?$/,
})
module.exports = withMDX({
pageExtensions: ['js', 'jsx', 'ts', 'tsx', 'md', 'mdx'],
})
TypeScript
Follow this guide from the MDX docs.
App directory
Installation
For usage with the app directory see below.
npm install @next/mdx
or
yarn add @next/mdx
Usage
Create an mdx-components.js file at the root of your project with the following contents:
const components = {
}
export function useMDXComponents() {
return components
}
Create a next.config.js in your project
const withMDX = require('@next/mdx')({
options: {
remarkPlugins: [],
rehypePlugins: [],
},
})
const nextConfig = {
pageExtensions: ['ts', 'tsx', 'js', 'jsx', 'md', 'mdx'],
reactStrictMode: true,
}
module.exports = withMDX(nextConfig)
TypeScript
Follow this guide from the MDX docs.