remons-render-markdown 1.0.27 → 1.0.28-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ImagePreview/ImageToolbar.d.ts +1 -1
- package/dist/components/RenderMarkdown/index.d.ts +13 -0
- package/dist/components/RenderMarkdown/utils/render-markdown/empty-task-lists.d.ts +2 -0
- package/dist/components/TocSidebar/index.d.ts +15 -0
- package/dist/hooks/useIncrementalRender.d.ts +38 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.mjs +18 -13
- package/package.json +7 -7
- package/readme.md +62 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "remons-render-markdown",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.28-beta.10",
|
|
4
4
|
"description": "一个基于 React 的 Markdown 渲染组件,支持 GFM(GitHub Flavored Markdown)、代码高亮、Mermaid 图表、Tabs 渲染等功能。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.mjs",
|
|
@@ -48,16 +48,16 @@
|
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@ant-design/icons": "^6.3.2",
|
|
50
50
|
"@changesets/cli": "^2.27.0",
|
|
51
|
-
"@types/react": "^18.
|
|
52
|
-
"@types/react-dom": "^18.
|
|
51
|
+
"@types/react": "^18.3.0",
|
|
52
|
+
"@types/react-dom": "^18.3.0",
|
|
53
53
|
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
54
54
|
"@typescript-eslint/parser": "^6.0.0",
|
|
55
55
|
"@vitejs/plugin-react": "^4.3.0",
|
|
56
56
|
"eslint": "^8.0.0",
|
|
57
57
|
"less": "^4.2.0",
|
|
58
58
|
"prettier": "^3.0.0",
|
|
59
|
-
"react": "^18.
|
|
60
|
-
"react-dom": "^18.
|
|
59
|
+
"react": "^18.3.1",
|
|
60
|
+
"react-dom": "^18.3.1",
|
|
61
61
|
"terser": "^5.50.0",
|
|
62
62
|
"typescript": "^5.3.0",
|
|
63
63
|
"vite": "^8.0.0",
|
|
@@ -67,10 +67,9 @@
|
|
|
67
67
|
},
|
|
68
68
|
"publishConfig": {
|
|
69
69
|
"registry": "https://registry.npmjs.org/",
|
|
70
|
-
"access": "public"
|
|
70
|
+
"access": "public"
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
|
-
"@mdit/plugin-alert": "^2.0.0",
|
|
74
73
|
"@mdit/plugin-tab": "^2.0.0",
|
|
75
74
|
"@panzoom/panzoom": "^4.6.2",
|
|
76
75
|
"classnames": "^2.5.1",
|
|
@@ -84,6 +83,7 @@
|
|
|
84
83
|
"markdown-it-task-lists": "^2.1.1",
|
|
85
84
|
"markdown-it-toc-done-right": "^4.2.0",
|
|
86
85
|
"methods-r": "^2.0.0-rc.1",
|
|
86
|
+
"morphdom": "^2.7.8",
|
|
87
87
|
"viewerjs": "^1.11.9"
|
|
88
88
|
},
|
|
89
89
|
"repository": {
|
package/readme.md
CHANGED
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
### 核心功能
|
|
22
22
|
|
|
23
23
|
- **GFM 支持**: 完整的 GitHub Flavored Markdown 渲染
|
|
24
|
+
- **增量渲染**: 基于 morphdom 的 DOM 差异化更新,适用于流式输出场景
|
|
24
25
|
- **代码高亮**: 基于 highlight.js 的代码语法高亮
|
|
25
26
|
- **Mermaid 图表**: 支持 Mermaid 语法渲染流程图、时序图等
|
|
26
27
|
- **Tab 标签页**: 支持 Tab 标签页语法
|
|
@@ -28,6 +29,7 @@
|
|
|
28
29
|
- **目录锚点**: 自动生成文档目录和锚点链接(自行实现目录渲染)
|
|
29
30
|
- **代码复制**: 一键复制代码块
|
|
30
31
|
- **代码折叠**: 支持代码块折叠展开
|
|
32
|
+
- **深色模式**: 自动适配深色/浅色主题
|
|
31
33
|
|
|
32
34
|
## API
|
|
33
35
|
|
|
@@ -40,7 +42,7 @@ npm install remons-render-markdown
|
|
|
40
42
|
### 导出内容
|
|
41
43
|
|
|
42
44
|
```typescript
|
|
43
|
-
import RenderMarkdown, { markdownFormat, languagesCommon, initHighlighter } from 'remons-render-markdown';
|
|
45
|
+
import RenderMarkdown, { markdownFormat, languagesCommon, initHighlighter, useIncrementalRender } from 'remons-render-markdown';
|
|
44
46
|
```
|
|
45
47
|
|
|
46
48
|
#### 默认导出
|
|
@@ -52,6 +54,8 @@ import RenderMarkdown, { markdownFormat, languagesCommon, initHighlighter } fro
|
|
|
52
54
|
- **markdownFormat**: Markdown 解析函数,返回 `{ anchor: AnchorItem[], info: string }`
|
|
53
55
|
- **languagesCommon**: 默认支持的语言包配置(javascript, typescript, css, json, bash, xml, plaintext)
|
|
54
56
|
- **initHighlighter**: 初始化高亮语言包的函数
|
|
57
|
+
- **useIncrementalRender**: 增量渲染 hook,使用 morphdom 进行 DOM 差异化更新,适用于流式输出场景
|
|
58
|
+
- **renderMermaid**: 独立的 Mermaid 图表渲染组件
|
|
55
59
|
|
|
56
60
|
### RenderMarkdown 组件 Props
|
|
57
61
|
|
|
@@ -65,6 +69,7 @@ import RenderMarkdown, { markdownFormat, languagesCommon, initHighlighter } fro
|
|
|
65
69
|
| editButton | React.ReactNode | ❌ | - | 自定义编辑按钮 |
|
|
66
70
|
| backTopTarget | HTMLElement | ❌ | body | 返回顶部按钮监听的容器 |
|
|
67
71
|
| showDriverGuide | boolean | ❌ | false | 是否显示新手引导 |
|
|
72
|
+
| showToc | boolean | ❌ | false | 是否显示目录(TOC)按钮和侧边栏 |
|
|
68
73
|
|
|
69
74
|
### markdownFormat 函数
|
|
70
75
|
|
|
@@ -251,6 +256,62 @@ console.log(x + y);
|
|
|
251
256
|
}
|
|
252
257
|
```
|
|
253
258
|
|
|
259
|
+
### 使用 useIncrementalRender 实现增量渲染
|
|
260
|
+
|
|
261
|
+
`useIncrementalRender` 适用于流式输出场景(如 AI 对话),通过 morphdom 实现高效的 DOM 差异化更新。
|
|
262
|
+
|
|
263
|
+
```tsx
|
|
264
|
+
import { useIncrementalRender } from 'remons-render-markdown';
|
|
265
|
+
|
|
266
|
+
function StreamingContent({ content }) {
|
|
267
|
+
const { anchors, hasContent, setInnerRef } = useIncrementalRender({
|
|
268
|
+
content,
|
|
269
|
+
// 可选:节流时间,默认 16ms
|
|
270
|
+
throttleMs: 16,
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
return (
|
|
274
|
+
<div>
|
|
275
|
+
{hasContent && <div ref={setInnerRef} />}
|
|
276
|
+
{anchors.length > 0 && (
|
|
277
|
+
<ul>
|
|
278
|
+
{anchors.map((item) => (
|
|
279
|
+
<li key={item.href}>
|
|
280
|
+
<a href={`#${item.href}`}>{item.title}</a>
|
|
281
|
+
</li>
|
|
282
|
+
))}
|
|
283
|
+
</ul>
|
|
284
|
+
)}
|
|
285
|
+
</div>
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**参数:**
|
|
291
|
+
|
|
292
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
293
|
+
|------|------|------|--------|------|
|
|
294
|
+
| content | string | ✅ | - | Markdown 内容 |
|
|
295
|
+
| codeType | string | ❌ | - | 代码类型,不传则按 Markdown 渲染 |
|
|
296
|
+
| customRenderers | MarkdownPlugin[] | ❌ | - | 自定义 markdown-it 插件 |
|
|
297
|
+
| throttleMs | number | ❌ | 16 | 节流时间(ms) |
|
|
298
|
+
| onNodeDiscarded | (el: HTMLElement) => void | ❌ | - | 节点被 diff 移除后触发(含被移除子树的子节点),用于清理 React Root 等挂载状态 |
|
|
299
|
+
|
|
300
|
+
**返回值:**
|
|
301
|
+
|
|
302
|
+
| 属性 | 类型 | 说明 |
|
|
303
|
+
|------|------|------|
|
|
304
|
+
| anchors | AnchorItem[] | 文档锚点列表 |
|
|
305
|
+
| hasContent | boolean | 是否有内容 |
|
|
306
|
+
| setInnerRef | (node: HTMLDivElement) => void | 内容容器的 ref 回调 |
|
|
307
|
+
|
|
308
|
+
**增量渲染与自定义插件(customRenderers)的配合约定:**
|
|
309
|
+
|
|
310
|
+
1. 插件产出的容器节点(如 `:::badge` / `:::linkCard` / `<plugin-container>`)按"标签 + className"语义匹配,内容位移时不同类型的块不会被错配到旧节点上。
|
|
311
|
+
2. 元素上 JS 后加的 `data-*` 属性(如初始化守卫位 `data-xxx-inited`)在 diff 后会被保留,"只初始化一次"的守卫逻辑不会在增量渲染中被重复触发。
|
|
312
|
+
3. JS 动态插入的额外子节点(如 React 挂载点、收起按钮)默认会被 diff 移除;若需跨增量渲染保留,请给节点设置 `data-md-persist` 属性(见导出常量 `MD_PERSIST_ATTR`)。
|
|
313
|
+
4. 被 diff 移除的节点会触发 `onNodeDiscarded`,请在此卸载挂载在其上的 React Root,避免内存泄漏。
|
|
314
|
+
|
|
254
315
|
### 关于语法
|
|
255
316
|
|
|
256
317
|
#### mermaid 图表
|
|
@@ -292,8 +353,6 @@ title: 图表标题
|
|
|
292
353
|
|
|
293
354
|
#### Alert 提示框
|
|
294
355
|
|
|
295
|
-
依赖于 `@mdit/plugin-alert` 插件,参考 [mdit-plugin-alert](https://mdit-plugins.github.io/zh/alert.html) 的文档。
|
|
296
|
-
|
|
297
356
|
语法示例:
|
|
298
357
|
|
|
299
358
|
```markdown
|