---
id: react
title: MDX and React
description: Using the power of React in Docusaurus Markdown documents, thanks to MDX
slug: /markdown-features/react
---
# MDX and React
```mdx-code-block
import BrowserWindow from '@site/src/components/BrowserWindow';
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import styles from './markdown-features-react.module.css';
```
## Using JSX in Markdown {#using-jsx-in-markdown}
Docusaurus has built-in support for [MDX v1](https://mdxjs.com/), which allows you to write JSX within your Markdown files and render them as React components.
:::note
While Docusaurus parses both `.md` and `.mdx` files using MDX, some of the syntaxes are treated slightly differently by third-party tools. For the most accurate parsing and better editor support, we recommend using the `.mdx` extension for files containing MDX syntax.
:::
:::caution
MDX is not [100% compatible with CommonMark](https://github.com/facebook/docusaurus/issues/3018).
Use the **[MDX playground](https://mdx-git-renovate-babel-monorepo-mdx.vercel.app/playground)** to ensure that your syntax is valid MDX.
:::
To define any custom component within an MDX file, you have to export it.
```jsx
export const Highlight = ({children, color}) => (
{children}
);
Docusaurus green and Facebook blue are my favorite colors.
I can write **Markdown** alongside my _JSX_!
```
Notice how it renders both the markup from your React component and the Markdown syntax:
```mdx-code-block
export const Highlight = ({children, color}) => (
{children}
);
Docusaurus green
{` `}and Facebook blue are my favorite colors.
I can write **Markdown** alongside my _JSX_!
```
You can also import your own components defined in other files or third-party components installed via npm.
```md
import TOCInline from '@theme/TOCInline';
import Button from '@mui/material/Button';
import BrowserWindow from '@site/src/components/BrowserWindow';
```
:::tip
The `@site` alias points to your website's directory, where the `docusaurus.config.js` file is. Using an alias instead of relative paths (`'../../src/components/BrowserWindow'`) saves you from updating import paths when moving files around, or when [versioning docs](../docs/versioning.md) and [translating](../../i18n/i18n-tutorial.md).
:::
Check out the [MDX docs](https://mdxjs.com/) to see what other fancy stuff you can do with MDX.
:::caution
Since all doc files are parsed using MDX, any HTML is treated as JSX. Therefore, if you need to inline-style a component, follow JSX flavor and provide style objects. This behavior is different from Docusaurus 1. See also [Migrating from v1 to v2](../../migration/migration-manual.md#convert-style-attributes-to-style-objects-in-mdx).
:::
### Markdown and JSX interoperability
Docusaurus v2 is using MDX v1, which has a lot of known cases where the content fails to be correctly parsed as Markdown. Use the **[MDX playground](https://mdx-git-renovate-babel-monorepo-mdx.vercel.app/playground)** to ensure that your syntax is valid MDX.
Samples of parsing failures
**A paragraph starting with a JSX tag will be seen entirely as a JSX string:**
````mdx-code-block
```jsx
Highlighted text but afterwards _Markdown_ **doesn't work**
```
Highlighted text but afterwards _Markdown_ **doesn't work**
Use JSX for the rest of the line, or prefix the line with some plain text:
```jsx
Use JSX for the paragraph to stop worrying aboutMarkdown
← This is a zero-width space and afterwards Markdownworks
```
Use JSX for the paragraph to stop worrying aboutMarkdown
← This is a zero-width space and afterwards Markdownworks
**Markdown within a JSX tag never works:**
```jsx
**Bold doesn't work**
```
**Bold doesn't work**
Use JSX within JSX tag, or move the Markdown to the outer layer:
```jsx
Bold now works
**Bold now works**
```
Bold now works
**Bold now works**
**Text immediately below a JSX tag will be seen as JSX text:**
```jsx
**Bold still doesn't work**
```
**Bold still doesn't work**
Add an empty new line:
```jsx
**Bold now works**
```
**Bold now works**
**Markdown text indented by four spaces will be seen as a code block:**
```jsx
You may think I'm just some text...
```
You may think I'm just some text...
Don't indent:
```jsx
Now I'm actually just text
```
Now I'm actually just text
````
## Importing code snippets {#importing-code-snippets}
You can not only import a file containing a component definition, but also import any code file as raw text, and then insert it in a code block, thanks to [Webpack raw-loader](https://webpack.js.org/loaders/raw-loader/). In order to use `raw-loader`, you first need to install it in your project:
```bash npm2yarn
npm install --save raw-loader
```
Now you can import code snippets from another file as it is:
```jsx title="myMarkdownFile.mdx"
import CodeBlock from '@theme/CodeBlock';
import MyComponentSource from '!!raw-loader!./myComponent';
{MyComponentSource}
```
```mdx-code-block
import CodeBlock from '@theme/CodeBlock';
import MyComponentSource from '!!raw-loader!@site/src/pages/examples/_myComponent';
{MyComponentSource}
```
See [using code blocks in JSX](./markdown-features-code-blocks.mdx#usage-in-jsx) for more details of the `` component.
:::note
You have to use `` rather than the Markdown triple-backtick ` ``` `, because the latter will ship out any of its content as-is, but you want to interpolate the imported text here.
:::
:::warning
This feature is experimental and might be subject to breaking API changes in the future.
:::
## Importing Markdown {#importing-markdown}
You can use Markdown files as components and import them elsewhere, either in Markdown files or in React pages.
By convention, using the **`_` filename prefix** will not create any doc page and means the markdown file is a **"partial"**, to be imported by other files.
```md title="_markdown-partial-example.mdx"
Hello {props.name}
This is text some content from `_markdown-partial-example.mdx`.
```
```jsx title="someOtherDoc.mdx"
import PartialExample from './_markdown-partial-example.mdx';
;
```
```mdx-code-block
import PartialExample from './_markdown-partial-example.mdx';
```
This way, you can reuse content among multiple pages and avoid duplicating materials.
:::caution
The table of contents does not currently contain the imported Markdown headings. This is a technical limitation that we are trying to solve ([issue](https://github.com/facebook/docusaurus/issues/3915)).
:::
## Available exports
Within the MDX page, the following variables are available as globals:
- `frontMatter`: the front matter as a record of string keys and values;
- `toc`: the table of contents, as a tree of headings. See also [Inline TOC](./markdown-features-inline-toc.mdx) for a more concrete use-case.
- `contentTitle`: the Markdown title, which is the first `h1` heading in the Markdown text. It's `undefined` if there isn't one (e.g. title specified in the front matter).
```jsx
import TOCInline from '@theme/TOCInline';
import CodeBlock from '@theme/CodeBlock';
The table of contents for this page, serialized:
{JSON.stringify(toc, null, 2)}
The front matter of this page:
```
```mdx-code-block
import TOCInline from '@theme/TOCInline';
The table of contents for this page, serialized:
{JSON.stringify(toc, null, 2)}
The front matter of this page: