# React 安装
使用 pnpm、npm 或 yarn 安装 markstream-react。
::: tip 已经在用 react-markdown?
如果你是从 `react-markdown` 迁过来,先看[迁移指南](/zh/guide/react-markdown-migration)获取整体路径,再看[迁移 Cookbook](/zh/guide/react-markdown-migration-cookbook)查具体场景。
:::
```bash
pnpm add markstream-react
# 或
npm install markstream-react
# 或
yarn add markstream-react
```
## 要求
markstream-react 需要:
- **React 18+** 和 **ReactDOM 18+**
- **stream-markdown-parser**(作为依赖自动安装)
## 可选的对等依赖
markstream-react 通过可选的对等依赖支持各种功能。只安装你需要的功能:
| 功能 | 所需包 | 安装命令 |
|---------|------------------|-----------------|
| Shiki 代码块(`MarkdownCodeBlockNode`) | `stream-markdown` | `pnpm add stream-markdown` |
| Monaco 编辑器(完整代码块功能) | `stream-monaco` | `pnpm add stream-monaco` |
| Mermaid 图表 | `mermaid` | `pnpm add mermaid` |
| D2 图表 | `@terrastruct/d2` | `pnpm add @terrastruct/d2` |
| 数学公式渲染(KaTeX) | `katex` | `pnpm add katex` |
## 可选:启用线程外 Worker(Mermaid / KaTeX)
安装后会自动加载 Mermaid/KaTeX。如需线程外解析/渲染,可在入口注入 Worker:
```tsx
import { setKaTeXWorker, setMermaidWorker } from 'markstream-react'
import KatexWorker from 'markstream-react/workers/katexRenderer.worker?worker'
import MermaidWorker from 'markstream-react/workers/mermaidParser.worker?worker'
setMermaidWorker(new MermaidWorker())
setKaTeXWorker(new KatexWorker())
```
同时记得导入必需的 CSS:
```tsx
import 'markstream-react/index.css'
import 'katex/dist/katex.min.css'
```
Monaco(`stream-monaco`)不需要单独导入 CSS。
注意:`markstream-react/index.css` 的样式被限制在内部的 `.markstream-react` 容器下,以减少全局样式冲突。`MarkdownRender` 默认在该容器内渲染。如果你单独渲染节点组件,请用 `
...
` 包裹它们。
## Tailwind CSS 支持
如果你的项目使用 Tailwind,并希望避免重复注入 Tailwind utilities,请改用 Tailwind-ready 输出:
```tsx
import 'markstream-react/index.tailwind.css'
```
并在 `tailwind.config.js` 的 `content` 中加入该包导出的 class 列表:
```js
module.exports = {
content: [
'./src/**/*.{js,ts,jsx,tsx}',
require('markstream-react/tailwind'),
],
}
```
这种方式可以确保 Tailwind 在清除未使用的样式时包含 markstream-react 使用的所有工具类,从而获得更小的最终打包体积。
### 快速安装:所有功能
一次性启用所有功能:
```bash
pnpm add stream-markdown stream-monaco mermaid @terrastruct/d2 katex
# 或
npm install stream-markdown stream-monaco mermaid @terrastruct/d2 katex
```
### 功能详情
#### 代码语法高亮
需要安装 `stream-markdown`:
```bash
pnpm add stream-markdown
```
`stream-markdown` 已内置 `MarkdownCodeBlockNode` 所需的 Shiki runtime。若要在 `MarkdownRender` 中使用 Shiki,请覆盖 `code_block` 渲染器(或直接使用 `MarkdownCodeBlockNode`)。
```tsx
import MarkdownRender, { MarkdownCodeBlockNode, setCustomComponents } from 'markstream-react'
setCustomComponents({
code_block: ({ node, isDark, ctx }: any) => (
),
})
```
#### Monaco 编辑器
完整的代码块功能(复制按钮、字体大小控制、展开/折叠):
```bash
pnpm add stream-monaco
```
如果不安装 `stream-monaco`,代码块仍会渲染,但交互式按钮可能无法工作。
#### Mermaid 图表
渲染 Mermaid 图表:
```bash
pnpm add mermaid
```
#### D2 图表
渲染 D2 图表:
```bash
pnpm add @terrastruct/d2
```
#### KaTeX 数学公式渲染
数学公式渲染:
```bash
pnpm add katex
```
同时在应用入口文件中导入 KaTeX CSS:
```tsx
import 'katex/dist/katex.min.css'
```
## 快速测试
导入并渲染一个简单的 markdown 字符串:
```tsx
import MarkdownRender from 'markstream-react'
import 'markstream-react/index.css'
function App() {
const md = '# Hello from markstream-react!'
return
}
export default App
```
## TypeScript 支持
markstream-react 使用 TypeScript 编写,并包含完整的类型定义,无需额外配置:
```tsx
import type { NodeRendererProps } from 'markstream-react'
import MarkdownRender from 'markstream-react'
const props: NodeRendererProps = {
content: '# Hello TypeScript!',
}
function App() {
return
}
```
## Next.js 集成
在 Next.js 中,优先使用专门的 SSR 双入口:
```tsx
import MarkdownRender from 'markstream-react/next'
import 'markstream-react/index.css'
export default function MarkdownPage() {
return
}
```
如果你需要一条纯 server、只输出稳定 fallback 的路径:
```tsx
import MarkdownRender from 'markstream-react/server'
export default function MarkdownPage() {
return
}
```
更完整的 App Router、Pages Router、自定义组件和验证说明见 [React Next SSR](/zh/guide/react-next-ssr)。
## Vite 集成
对于 Vite 项目,只需导入组件和样式:
```tsx
// src/main.tsx
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
import 'markstream-react/index.css'
ReactDOM.createRoot(document.getElementById('root')!).render(
)
```
```tsx
// src/App.tsx
import MarkdownRender from 'markstream-react'
function App() {
const content = `# Hello Vite!
这是 markstream-react 与 **Vite** 配合使用。`
return
}
export default App
```
## Webpack 集成
对于使用 Webpack 的项目,确保你的配置处理 CSS 导入:
```js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
}
]
}
}
```
## 自定义组件设置
要使用自定义节点组件,你需要创建自定义渲染器。详情请参阅 [组件文档](/zh/guide/react-components)。