Добавляем поддержку MDX в Next.js приложение

Инструкция по добавлению поддержки MDX в Next.js приложение.

Добавляем поддержку MDX в Next.js приложение
Дата публикации
23.06.24
Дата обновления
16.05.26
Время чтения
3 мин.

Сегодня расскажем как можно добавить базовую поддержку MDX в Next.js приложение и использовать .mdx файлы в качестве страниц.

Что такое MDX?

MDX - это синтаксис, который позволяет использовать JSX-синтаксис в markdown контенте, ну или наоборот. Подробнее можно почитать тут.

Вот простой пример MDX синтаксиса:

import ComplexComponent from "@/app/_components/ComplexComponent";
import ImageWrap from "@/app/_components/ImageWrap";

# Тут заголовок

обычный текст

и React-компоненты:

- например, для картинок

<ImageWrap src={"путь к картинке"}/>

- или что-нибудь сложное

<ComplexComponent />

Описание процесса

Итак, для того чтобы добавить поддержку MDX в Next.js приложение необходимо:

Установка необходимых пакетов

Нам понадобятся пакеты:

  • @next/mdx - основной пакет, который дружит Next.js и MDX;
  • @mdx-js/loader - webpack loader для MDX файлов;
  • @types/mdx - необходим для нормальной работы с typescript;

Установим их следующими командами:

npm i -S @next/mdx
npm install -D @mdx-js/loader @types/mdx

Создание файла mdx-components.tsx

Теперь необходимо создать файл mdx-components.tsx и положить его в src/.

Файл mdx-components.tsx необходим, для того чтобы подружить MDX и Next.js приложение использующее App Router.

import type { MDXComponents } from "mdx/types";

export function useMDXComponents(components: MDXComponents): MDXComponents {
  return {
    ...components,
  };
}

Включение обработки .mdx файлов в next.config.js

Осталось только подправить конфиг (файл next.config.js) нашего приложения.

const withMDX = require("@next/mdx")();

/** @type {import('next').NextConfig} */
const nextConfig = {
  // Добавляем `mdx` в pageExtensions
  pageExtensions: ["js", "jsx", "mdx", "ts", "tsx"],
};

module.exports = withMDX(nextConfig);

Теперь вместо page.tsx для страниц можно использовать page.mdx! 🎉

Расширение для VSCode

Бонус для тех кто использует VSCode, есть неплохое расширение для поддержки MDX синтаксиса - MDX for Visual Studio Code;

На этом всё! 🎉

Расскажите о вашем проекте

Связаться иначе

Часто задаваемые вопросы

Расширение Markdown: в тексте можно вставлять React-компоненты и обычный JSX — картинки, виджеты, интерактив. Подробнее на mdxjs.com и в разделе что такое MDX.

В .md — только разметка и код в блоках. В .mdx — ещё импорты и теги компонентов прямо в статье. Для простых постов хватает Markdown; MDX — когда нужны свои блоки без отдельного шаблона страницы.

@next/mdx, @mdx-js/loader и @types/mdx (для TypeScript). Команды установки — в разделе пакеты.

Он обязателен для App Router: через useMDXComponents задаёте, как рендерятся теги Markdown (h1, a, img) и можно подставить свои компоненты по умолчанию. См. создание файла.

В next.config оберните конфиг в withMDX и добавьте mdx в pageExtensions — тогда в app/ можно использовать page.mdx вместо page.tsx. Пример — в разделе конфиг.

Отдельно от MDX: на этапе сборки или в компонентах поста — как в статье про Prism и rehype. MDX лишь даёт страницу с разметкой; подсветку подключаете в своём пайплайне.

Да: для VS Code — расширение MDX (подсветка и подсказки). Проверка орфографии в черновиках — markdown-spellcheck. Раздел расширение.

Вам может быть интересно

Борьба с грамматическими ошибками в markdown файлах
Борьба с грамматическими ошибками в markdown файлах

Борьба с грамматическими ошибками в markdown файлах

3 мин.

Инструкция по использованию LTеX для борьбы с грамматическими ошибками в .md файлах...

Пост#инструменты
Добавляем подсветку кода (синтаксиса) в статический блог на Next.js
Добавляем подсветку кода (синтаксиса) в статический блог на Next.js

Добавляем подсветку кода (синтаксиса) в статический блог на Next.js

4 мин.

Инструкция по добавлению подсветки кода (синтаксиса) в статическом блоге на Next.js...

Пост#туториалы#nextjs
Добавляем JSON-LD разметку к блогу на Next.js
Добавляем JSON-LD разметку к блогу на Next.js

Добавляем JSON-LD разметку к блогу на Next.js

9 мин.

Инструкция по добавлению JSON-LD разметки к блогу на Next.js...

Пост#nextjs#seo
Добавляем robots.txt в Next.js приложение
Добавляем robots.txt в Next.js приложение

Добавляем robots.txt в Next.js приложение

5 мин.

Инструкция по добавлению robots.txt в Next.js приложение...

Пост#nextjs#seo
Добавляем RSS-фид к статическому Next.js приложению
Добавляем RSS-фид к статическому Next.js приложению

Добавляем RSS-фид к статическому Next.js приложению

5 мин.

Инструкция по добавлению RSS фида к статическому Next.js приложению...

Пост#nextjs#фиды
Добавляем поиск по тегам в статический блог на Next.js
Добавляем поиск по тегам в статический блог на Next.js

Добавляем поиск по тегам в статический блог на Next.js

5 мин.

Инструкция по добавлению простейшего поиска по тегам в статическом Next.js блоге...

Пост#туториалы#nextjs
Как посчитать время чтения текста (и добавить индикатор на сайт)
Как посчитать время чтения текста (и добавить индикатор на сайт)

Как посчитать время чтения текста (и добавить индикатор на сайт)

4 мин.

Инструкция по добавлению индикатора времени чтения текста на сайт...

Пост#туториалы
Frontend разработка
Frontend разработка

Frontend разработка

Разрабатываем интерфейсы, которые быстро работают, удобно используются и масштабируются вместе с продуктом.

Услуга#frontend#веб-разработка
Разработка вебсайтов
Разработка вебсайтов

Разработка вебсайтов

Сайт под ваш бизнес: от структуры и дизайна до запуска и масштабирования. Быстро, продуманно и с фокусом на результат.

Услуга#веб-разработка#сайты