Load .mdx(or other file extensions) as components in Nuxt.
Published on 2020-05-14
🚨 This post is an unpolished thought
Today I learned that you can configure Nuxt to load different file extensions as both as pages and as components.
In order for this to work properly I needed to have Nuxt's builder load the files with extensions I wish to load. This is because, by default, Nuxt's builder will ignore any files that are not .vue
files. This can be achieved by using a Nuxt module
In order for this to work properly you need to have the appropriate webpack loaders for the file extensions you wish to load.
In this example, I'll be importing .mdx
files as routes under the pages
directory. So that means I need to have a webpack loader installed for .mdx
files.
This applies to any other file extension you wish to support. If you with to import Markdown (.md
) files into your components, then you must have a .md
file webpack loader installed as well.
🗂pages
📄index.vue
📄test.mdx
🗂foo
📄contact.vue
📄about.mdx
📄nuxt.config.js
Using modules
Modules are like plugins for plugins in Nuxt. These can be used to extend Nuxt's functionality and add different integrations to your Nuxt application.
First we create a module file. We'll call this load-mdx-module.js
.
// load-mdx-module.jsexport default function (options = {}) { // Add 'mdx' to build extensions this.options.build.additionalExtensions = ['mdx'] if (this.options.extensions) { // Add `mdx` to `extensions` option const extensions = this.options.extensions !extensions.includes('mdx') && extensions.push('mdx') // Add 'mdx' to `build.additionalExtensions` this.options.build.additionalExtensions = ['mdx'] // Extend webpack config this.extendBuild((config) => { // Here we '.mdx' to webpack's `resolve.extensions` option. if (config.resolve.extensions) { config.resolve.extensions.push('.mdx') } else { config.resolve.extensions = ['.mdx'] } // Use `@mdx-js/vue-loader` for `.mdx` files. config.module.rules.push({ test: /\.mdx$/, use: [ 'babel-loader', '@mdx-js/vue-loader' ] }) }) }}
Add module to Nuxt config
Add the path to the load-mdx-module.js
file under the modules
option in your nuxt.config.js
export default { // ... modules: [ 'path/to/load-mdx-module' ] // ...}
Start server
yarn dev
You should be able to visit other routes with .mdx
extension or import .mdx
files in your Vue components.