https://github.com/md2docx/react-markdown
SSR-ready React Markdown renderer with MDAST reuse, JSX support, and unified plugin pipeline.
https://github.com/md2docx/react-markdown
docx jsx markdown mdast react rehype remark renderer ssr unified
Last synced: about 1 month ago
JSON representation
SSR-ready React Markdown renderer with MDAST reuse, JSX support, and unified plugin pipeline.
- Host: GitHub
- URL: https://github.com/md2docx/react-markdown
- Owner: md2docx
- License: mpl-2.0
- Created: 2025-06-20T03:10:48.000Z (12 months ago)
- Default Branch: main
- Last Pushed: 2026-04-26T16:47:52.000Z (about 2 months ago)
- Last Synced: 2026-04-26T18:23:48.109Z (about 2 months ago)
- Topics: docx, jsx, markdown, mdast, react, rehype, remark, renderer, ssr, unified
- Language: TypeScript
- Homepage:
- Size: 737 KB
- Stars: 11
- Watchers: 0
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- Contributing: contributing.md
- Funding: .github/FUNDING.yml
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
- Security: SECURITY.md
Awesome Lists containing this project
README
# MDX Renderer [`@m2d/react-markdown`] 
[](https://github.com/md2docx/react-markdown/actions/workflows/test.yml)
[](https://codeclimate.com/github/md2docx/react-markdown/maintainability)
[](https://codecov.io/gh/md2docx/react-markdown)
[](https://www.npmjs.com/package/@m2d/react-markdown)
[](https://www.npmjs.com/package/@m2d/react-markdown)

> โจ A modern, SSR-compatible Markdown renderer for React with full MDAST/HAST access โ built for **customization**, **performance**, and **document generation** - **docx/pdf**.
---
## ๐ฅ Why `@m2d/react-markdown`?
`@m2d/react-markdown` goes beyond traditional React Markdown libraries by focusing on:
- โ
**Server-side rendering (SSR)** without hooks
- โ
**Full JSX children support** (not just strings)
- โ
**Access to raw MDAST & HAST trees**
- โ
**Drop-in plugin support** via Unified (`remark`, `rehype`, etc.)
- โ
**Custom component overrides** per tag
- โ
**Integration with tools like [`mdast2docx`](https://github.com/md2docx/mdast2docx)**
Compared to `react-markdown`, this library offers:
| Feature | `@m2d/react-markdown` โ
| `react-markdown` โ |
| -------------------------------------- | ------------------------ | ------------------- |
| Full JSX support (not just strings) | โ
| โ |
| SSR-safe (no hooks) | โ
| โ
|
| Client Side component with memoization | โ
| โ |
| MDAST + HAST access via `astRef` | โ
| โ |
| Component-level overrides | โ
| โ
|
| Unified plugin support | โ
| โ
|
| Tiny bundle (minzipped) | **~35 kB** | ~45 kB |
| Built-in DOCX-friendly AST output | โ
| โ |
---
## ๐ฆ Installation
```bash
pnpm add @m2d/react-markdown
```
**_or_**
```bash
npm install @m2d/react-markdown
```
**_or_**
```bash
yarn add @m2d/react-markdown
```
---
## ๐ Server vs Client
By default, this package is SSR-safe and has **no client-specific hooks**.
### โ
Server (default):
```tsx
import { Md } from "@m2d/react-markdown";
```
### ๐ Client (for dynamic reactivity/memoization):
```tsx
import { Md } from "@m2d/react-markdown/client";
```
This version supports client-side behavior with memoization and dynamic JSX rendering.
---
## โก Example: Rendering + Exporting DOCX
```tsx
import { Md } from "@m2d/react-markdown/client";
import { toDocx } from "mdast2docx";
import { useRef } from "react";
const astRef = useRef([]);
export default function Page() {
return (
<>
{`# Hello\n\nThis is **Markdown**.`}
{
const doc = toDocx(astRef.current[0].mdast);
// Save or download doc
}}>
Export to DOCX
>
);
}
```
> Note for Server Component use you can replace useRef with custom ref object `const astRef = {current: undefined} as AstRef`
---
## ๐ง JSX-Aware Parsing
Unlike most markdown renderers, `@m2d/react-markdown` supports **arbitrary JSX as children**:
```tsx
import { Mdx } from "@m2d/react-markdown/server";
// ...
{"# Markdown Heading\n\nSome **rich** content."}
;
```
> `astRef.current` is an array โ one per Markdown string โ each with `{ mdast, hast }`.
> The default `` export accepts only string children for better optimization.
---
## ๐จ Component Overrides
```tsx
import { Md } from "@m2d/react-markdown";
import { Unwrap, Omit } from "@m2d/react-markdown/server";
,
}}>
{`*em is unwrapped*\n\n> blockquote is removed`}
;
```
Use the built-in helpers:
- `Unwrap` โ renders only children
- `Omit` โ removes element and content entirely
- `CodeBlock` - it is your custom component
---
## ๐ Plugin Support (Unified)
Use any `remark` or `rehype` plugin:
```tsx
{markdown}
```
---
## ๐ Accessing MDAST + HAST
```ts
type astRef = {
current: { mdast: Root; hast: HastRoot }[];
};
```
Useful for:
- ๐ DOCX export (`mdast2docx`)
- ๐งช AST testing or analysis
- ๐ ๏ธ Custom tree manipulation
---
## ๐ Performance
> **TL;DR:** `@m2d/react-markdown` performs competitively with `react-markdown`, especially on medium and large documents.
>
> ๐ [See full benchmarks โ](./benchmark.md)
Benchmarks include:
- Multiple markdown fixture types (short, long, complex, deeply nested)
- Plugin configurations like `remark-gfm`, `remark-math`, `rehype-raw`
- Visual comparisons using interactive Mermaid `xychart-beta` charts
- Ops/sec, ยฑ%, and future memory profiling
---
## ๐ฌ Upcoming Changes โ Seeking Feedback
We're proposing a **major change** to the internal `astRef` structure to better support MDX-style custom components and rendering flexibility:
๐ [Join the discussion โ](https://github.com/md2docx/react-markdown/discussions/3)
Key goals:
- Allow `` to embed child components like JSX/MDX
- Simplify recursive rendering model
- Improve performance and reduce abstraction overhead
## ๐งญ Roadmap
- [ ] ๐ Merge JSX + `` segments into unified AST
- [x] ๐งช Structural test utilities
- [x] ๐งโ๐ซ Next.js + DOCX example
---
## ๐ Related Projects
- [`mdast2docx`](https://github.com/md2docx/mdast2docx) โ Convert MDAST โ `.docx`
- [`unified`](https://unifiedjs.com/) โ Syntax tree ecosystem
- [`react-markdown`](https://github.com/remarkjs/react-markdown) โ Popular alternative (less customizable)
---
## ๐ Acknowledgements
We are deeply grateful to the open-source community whose work made this project possible.
- ๐ฑ **[react-markdown](https://github.com/remarkjs/react-markdown)** โ For pioneering a React-based Markdown renderer. This library builds on its ideas while extending flexibility and SSR-readiness.
- ๐ **[unified](https://github.com/unifiedjs/unified)** โ The brilliant engine powering our markdown-to-AST transformations.
- โจ **[remark](https://github.com/remarkjs/remark)** and **[rehype](https://github.com/rehypejs/rehype)** โ For their modular ecosystems that make parsing and rendering delightful.
- ๐งพ **[mdast2docx](https://github.com/md2docx/mdast2docx)** โ Our sister project that inspired the MDAST-first architecture of this library.
> ๐ To the maintainers, contributors, and communities behind these projects โ thank you for your generosity, vision, and dedication to making the web better for everyone.
---
## ๐ License
Licensed under the [MPL-2.0](https://www.mozilla.org/en-US/MPL/2.0/).
> ๐ก Want to support this project? [Sponsor](https://github.com/sponsors/mayank1513) or check out our [courses](https://mayank-chaudhari.vercel.app/courses)!
---
Built with โค๏ธ by Mayank Kumar Chaudhari