markview-vue 0.1.3 → 0.1.6
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/README.md +653 -59
- package/dist/index.cjs +111 -103
- package/dist/index.d.ts +106 -23
- package/dist/index.js +5650 -5523
- package/dist/style.css +1 -1
- package/package.json +6 -5
package/README.md
CHANGED
|
@@ -1,115 +1,709 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Markview Vue
|
|
2
2
|
|
|
3
|
-
Vue 3
|
|
3
|
+
现代化的 Vue 3 Markdown/MDX 渲染组件,提供完整的文档渲染解决方案。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 特性
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- **MDX 支持** - 在 Markdown 中嵌入 Vue 组件,支持完整的响应式交互
|
|
8
|
+
- **语法高亮** - 基于 Shiki 引擎,与 VS Code 共享相同的语法着色逻辑
|
|
9
|
+
- **数学公式** - KaTeX 渲染,支持 LaTeX 语法
|
|
10
|
+
- **GFM 扩展** - 表格、任务列表、删除线、自动链接等
|
|
11
|
+
- **自定义容器** - Semi Design 风格的提示框组件
|
|
12
|
+
- **主题系统** - 内置亮色/暗色主题,支持 CSS 变量定制
|
|
13
|
+
- **目录导航** - 自动提取标题生成 TOC,支持滚动高亮
|
|
14
|
+
- **交互增强** - 代码一键复制、图片点击预览、标题锚点链接
|
|
15
|
+
- **无障碍** - 遵循 ARIA 标准,支持键盘导航
|
|
16
|
+
- **TypeScript** - 完整的类型定义
|
|
8
17
|
|
|
9
|
-
|
|
18
|
+
## 技术栈
|
|
10
19
|
|
|
11
|
-
|
|
20
|
+
| 技术 | 用途 | 说明 |
|
|
21
|
+
|------|------|------|
|
|
22
|
+
| MDX | 编译引擎 | 支持在 Markdown 中嵌入组件 |
|
|
23
|
+
| Shiki | 代码高亮 | VS Code 同款引擎,支持 100+ 语言 |
|
|
24
|
+
| KaTeX | 数学公式 | 快速的 LaTeX 渲染引擎 |
|
|
25
|
+
| remark-gfm | GFM 扩展 | GitHub Flavored Markdown 支持 |
|
|
26
|
+
| Vue 3 | UI 框架 | Composition API + TypeScript |
|
|
12
27
|
|
|
13
|
-
|
|
14
|
-
- **Shiki** - 代码高亮,VS Code 同款,支持上百种语言和多套主题
|
|
15
|
-
- **KaTeX** - 数学公式渲染
|
|
16
|
-
- **remark-gfm** - GitHub 风格扩展(表格、任务列表、删除线等)
|
|
17
|
-
- **CSS Variables** - 样式系统,便于主题定制和暗黑模式切换
|
|
28
|
+
## 安装
|
|
18
29
|
|
|
19
|
-
|
|
30
|
+
```bash
|
|
31
|
+
npm install markview-vue
|
|
32
|
+
# 或
|
|
33
|
+
pnpm add markview-vue
|
|
34
|
+
# 或
|
|
35
|
+
yarn add markview-vue
|
|
36
|
+
```
|
|
20
37
|
|
|
21
|
-
|
|
38
|
+
## 快速开始
|
|
22
39
|
|
|
23
|
-
|
|
40
|
+
### 基础用法
|
|
24
41
|
|
|
25
|
-
|
|
42
|
+
```vue
|
|
43
|
+
<template>
|
|
44
|
+
<MarkdownRender :raw="content" />
|
|
45
|
+
</template>
|
|
26
46
|
|
|
27
|
-
|
|
47
|
+
<script setup>
|
|
48
|
+
import { MarkdownRender } from 'markview-vue'
|
|
49
|
+
import 'markview-vue/style.css'
|
|
28
50
|
|
|
29
|
-
|
|
51
|
+
const content = `
|
|
52
|
+
# Hello World
|
|
30
53
|
|
|
31
|
-
|
|
32
|
-
|
|
54
|
+
这是一段 **Markdown** 内容。
|
|
55
|
+
|
|
56
|
+
\`\`\`javascript
|
|
57
|
+
console.log('Hello Markview!');
|
|
58
|
+
\`\`\`
|
|
59
|
+
`
|
|
60
|
+
</script>
|
|
33
61
|
```
|
|
34
62
|
|
|
35
|
-
|
|
63
|
+
### 加载外部文件
|
|
36
64
|
|
|
37
65
|
```vue
|
|
38
66
|
<template>
|
|
39
|
-
<MarkdownRender :raw="
|
|
67
|
+
<MarkdownRender :raw="mdContent" />
|
|
40
68
|
</template>
|
|
41
69
|
|
|
42
70
|
<script setup>
|
|
43
71
|
import { MarkdownRender } from 'markview-vue'
|
|
44
72
|
import 'markview-vue/style.css'
|
|
73
|
+
import mdContent from './document.md?raw'
|
|
74
|
+
</script>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 核心功能
|
|
78
|
+
|
|
79
|
+
### 1. 代码高亮
|
|
80
|
+
|
|
81
|
+
支持 100+ 编程语言的语法高亮,基于 Shiki 引擎:
|
|
82
|
+
|
|
83
|
+
```markdown
|
|
84
|
+
\`\`\`typescript
|
|
85
|
+
interface User {
|
|
86
|
+
id: number;
|
|
87
|
+
name: string;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const user: User = {
|
|
91
|
+
id: 1,
|
|
92
|
+
name: 'Alice'
|
|
93
|
+
};
|
|
94
|
+
\`\`\`
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
特性:
|
|
98
|
+
- 代码块标题显示
|
|
99
|
+
- 一键复制功能
|
|
100
|
+
- 行号显示(可配置)
|
|
101
|
+
- 主题定制
|
|
102
|
+
|
|
103
|
+
### 2. 数学公式
|
|
104
|
+
|
|
105
|
+
支持 LaTeX 语法的数学公式渲染:
|
|
106
|
+
|
|
107
|
+
**行内公式:** 使用单个 `$` 符号
|
|
108
|
+
|
|
109
|
+
```markdown
|
|
110
|
+
当 $a \ne 0$ 时,方程 $ax^2 + bx + c = 0$ 的解为 $x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$。
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**块级公式:** 使用双 `$$` 符号
|
|
114
|
+
|
|
115
|
+
```markdown
|
|
116
|
+
$$
|
|
117
|
+
\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
|
|
118
|
+
$$
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 3. 表格
|
|
122
|
+
|
|
123
|
+
支持 GFM 表格语法,包括对齐方式:
|
|
124
|
+
|
|
125
|
+
```markdown
|
|
126
|
+
| 列名 | 左对齐 | 居中对齐 | 右对齐 |
|
|
127
|
+
|------|:-------|:--------:|-------:|
|
|
128
|
+
| 数据 | 内容A | 内容B | 123 |
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
特性:
|
|
132
|
+
- 表头固定(可配置)
|
|
133
|
+
- 表格复制功能
|
|
134
|
+
- 响应式布局
|
|
135
|
+
- 斑马纹样式
|
|
136
|
+
|
|
137
|
+
### 4. 自定义容器
|
|
138
|
+
|
|
139
|
+
支持 VitePress 兼容的容器语法,采用 Semi Design 视觉风格:
|
|
140
|
+
|
|
141
|
+
```markdown
|
|
142
|
+
::: tip
|
|
143
|
+
这是一个提示框。提示框通常用于展示有用的建议或小技巧。
|
|
144
|
+
:::
|
|
145
|
+
|
|
146
|
+
::: warning
|
|
147
|
+
这是一个警告框。警告框用于提醒用户注意某些重要事项。
|
|
148
|
+
:::
|
|
149
|
+
|
|
150
|
+
::: danger
|
|
151
|
+
这是一个危险提示框。用于标记可能导致问题的操作或配置。
|
|
152
|
+
:::
|
|
153
|
+
|
|
154
|
+
::: info
|
|
155
|
+
这是一个信息框。用于展示一般性的补充信息。
|
|
156
|
+
:::
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
自定义标题:
|
|
160
|
+
|
|
161
|
+
```markdown
|
|
162
|
+
::: tip 最佳实践
|
|
163
|
+
你可以自定义容器的标题文字。
|
|
164
|
+
:::
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
支持的类型:
|
|
168
|
+
- `tip` - 提示(绿色)
|
|
169
|
+
- `warning` - 警告(橙色)
|
|
170
|
+
- `danger` - 危险(红色)
|
|
171
|
+
- `info` - 信息(蓝色)
|
|
172
|
+
|
|
173
|
+
### 5. 自定义 Vue 组件
|
|
174
|
+
|
|
175
|
+
Markview Vue 基于 MDX,支持在 Markdown 中嵌入 Vue 组件。
|
|
45
176
|
|
|
46
|
-
|
|
177
|
+
#### 方式 1:预注册组件
|
|
178
|
+
|
|
179
|
+
```vue
|
|
180
|
+
<template>
|
|
181
|
+
<MarkdownRender :raw="content" :components="{ MyButton, MyCard }" />
|
|
182
|
+
</template>
|
|
183
|
+
|
|
184
|
+
<script setup>
|
|
185
|
+
import { MarkdownRender } from 'markview-vue'
|
|
186
|
+
import MyButton from './components/MyButton.vue'
|
|
187
|
+
import MyCard from './components/MyCard.vue'
|
|
47
188
|
</script>
|
|
48
189
|
```
|
|
49
190
|
|
|
50
|
-
|
|
191
|
+
在 Markdown 中使用:
|
|
192
|
+
|
|
193
|
+
```markdown
|
|
194
|
+
# 文档标题
|
|
195
|
+
|
|
196
|
+
<MyButton text="点击我" />
|
|
197
|
+
|
|
198
|
+
<MyCard title="卡片标题">
|
|
199
|
+
卡片内容支持完整的 Markdown 语法。
|
|
200
|
+
</MyCard>
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
#### 方式 2:MDX 中直接定义
|
|
204
|
+
|
|
205
|
+
```mdx
|
|
206
|
+
export const Alert = ({ type, children }) => (
|
|
207
|
+
<div class={`alert alert-${type}`}>
|
|
208
|
+
{children}
|
|
209
|
+
</div>
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
<Alert type="success">操作成功!</Alert>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
#### 方式 3:组件嵌套
|
|
216
|
+
|
|
217
|
+
```markdown
|
|
218
|
+
::: tip
|
|
219
|
+
<MyButton text="容器内的按钮" />
|
|
220
|
+
:::
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
详细说明请参考 [自定义组件指南](./CUSTOM_COMPONENTS.md)。
|
|
224
|
+
|
|
225
|
+
### 6. 目录导航(TOC)
|
|
226
|
+
|
|
227
|
+
自动提取文档标题生成目录:
|
|
228
|
+
|
|
229
|
+
```vue
|
|
230
|
+
<MarkdownRender
|
|
231
|
+
:raw="content"
|
|
232
|
+
:show-toc="true"
|
|
233
|
+
:toc-min-level="2"
|
|
234
|
+
:toc-max-level="4"
|
|
235
|
+
:toc-mode="'sidebar'"
|
|
236
|
+
@toc-change="handleTocChange"
|
|
237
|
+
/>
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
特性:
|
|
241
|
+
- 自动提取 H1-H6 标题
|
|
242
|
+
- 滚动时高亮当前位置
|
|
243
|
+
- 点击跳转到对应章节
|
|
244
|
+
- 支持侧边栏和嵌入式两种布局
|
|
245
|
+
|
|
246
|
+
### 7. 图片预览
|
|
247
|
+
|
|
248
|
+
点击图片自动弹出预览窗口,支持缩放、旋转等操作。
|
|
249
|
+
|
|
250
|
+
### 8. 回到顶部
|
|
251
|
+
|
|
252
|
+
长文档自动显示回到顶部按钮:
|
|
253
|
+
|
|
254
|
+
```vue
|
|
255
|
+
<MarkdownRender
|
|
256
|
+
:raw="content"
|
|
257
|
+
:show-back-top="true"
|
|
258
|
+
:back-top-threshold="300"
|
|
259
|
+
/>
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## API 文档
|
|
51
263
|
|
|
52
264
|
### Props
|
|
53
265
|
|
|
54
266
|
| 属性 | 类型 | 默认值 | 说明 |
|
|
55
267
|
|------|------|--------|------|
|
|
56
|
-
| `raw` | `string` | `''` | Markdown/MDX
|
|
268
|
+
| `raw` | `string` | `''` | Markdown/MDX 原始内容 |
|
|
57
269
|
| `format` | `'md' \| 'mdx'` | `'mdx'` | 内容格式 |
|
|
58
|
-
| `
|
|
59
|
-
| `
|
|
270
|
+
| `components` | `Record<string, Component>` | `{}` | 自定义组件映射表 |
|
|
271
|
+
| `theme` | `'light' \| 'dark'` | `'light'` | 主题模式 |
|
|
272
|
+
| `remarkGfm` | `boolean` | `true` | 是否启用 GFM 扩展 |
|
|
60
273
|
| `remarkPlugins` | `PluggableList` | `[]` | 自定义 remark 插件 |
|
|
61
274
|
| `rehypePlugins` | `PluggableList` | `[]` | 自定义 rehype 插件 |
|
|
62
|
-
| `
|
|
63
|
-
| `
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
66
|
-
| `
|
|
67
|
-
| `
|
|
275
|
+
| `style` | `CSSProperties` | - | 自定义样式对象 |
|
|
276
|
+
| `className` | `string` | - | 自定义 CSS 类名 |
|
|
277
|
+
| `prefix` | `string` | `'md'` | CSS 类名前缀 |
|
|
278
|
+
| `height` | `string` | - | 固定高度(如 `'500px'`) |
|
|
279
|
+
| `maxHeight` | `string` | - | 最大高度(如 `'80vh'`) |
|
|
280
|
+
| `showToc` | `boolean` | `false` | 是否显示目录 |
|
|
281
|
+
| `tocMinLevel` | `number` | `2` | 目录最小层级(H2) |
|
|
282
|
+
| `tocMaxLevel` | `number` | `4` | 目录最大层级(H4) |
|
|
283
|
+
| `docTitle` | `string` | - | 文档标题(显示在 TOC 顶部) |
|
|
284
|
+
| `tocMode` | `'sidebar' \| 'embedded'` | `'sidebar'` | 目录布局模式 |
|
|
285
|
+
| `showBackTop` | `boolean` | `false` | 是否显示回到顶部按钮 |
|
|
286
|
+
| `backTopThreshold` | `number` | `300` | 回到顶部按钮显示阈值(像素) |
|
|
68
287
|
|
|
69
288
|
### Events
|
|
70
289
|
|
|
71
|
-
|
|
|
72
|
-
|
|
73
|
-
| `rendered` |
|
|
74
|
-
| `error` |
|
|
75
|
-
| `toc-change` |
|
|
76
|
-
| `toc-click` |
|
|
290
|
+
| 事件名 | 参数 | 说明 |
|
|
291
|
+
|--------|------|------|
|
|
292
|
+
| `rendered` | - | 渲染完成时触发 |
|
|
293
|
+
| `error` | `(error: Error)` | 渲染出错时触发 |
|
|
294
|
+
| `toc-change` | `(toc: TocItem[])` | 目录数据变化时触发 |
|
|
295
|
+
| `toc-click` | `(item: TocItem)` | 点击目录项时触发 |
|
|
296
|
+
| `scroll-to-top` | - | 点击回到顶部按钮时触发 |
|
|
297
|
+
|
|
298
|
+
### 类型定义
|
|
299
|
+
|
|
300
|
+
```typescript
|
|
301
|
+
interface TocItem {
|
|
302
|
+
level: number; // 标题层级 (1-6)
|
|
303
|
+
text: string; // 标题文本
|
|
304
|
+
id: string; // 锚点 ID
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
interface MarkdownRenderProps {
|
|
308
|
+
raw?: string;
|
|
309
|
+
format?: 'md' | 'mdx';
|
|
310
|
+
components?: Record<string, any>;
|
|
311
|
+
theme?: 'light' | 'dark';
|
|
312
|
+
remarkGfm?: boolean;
|
|
313
|
+
remarkPlugins?: PluggableList;
|
|
314
|
+
rehypePlugins?: PluggableList;
|
|
315
|
+
style?: Record<string, any>;
|
|
316
|
+
className?: string;
|
|
317
|
+
prefix?: string;
|
|
318
|
+
height?: string;
|
|
319
|
+
maxHeight?: string;
|
|
320
|
+
showToc?: boolean;
|
|
321
|
+
tocMinLevel?: number;
|
|
322
|
+
tocMaxLevel?: number;
|
|
323
|
+
docTitle?: string;
|
|
324
|
+
tocMode?: 'sidebar' | 'embedded';
|
|
325
|
+
showBackTop?: boolean;
|
|
326
|
+
backTopThreshold?: number;
|
|
327
|
+
}
|
|
328
|
+
```
|
|
77
329
|
|
|
78
|
-
###
|
|
330
|
+
### 导出内容
|
|
79
331
|
|
|
80
|
-
```
|
|
332
|
+
```typescript
|
|
81
333
|
// 主组件
|
|
82
|
-
import { MarkdownRender
|
|
334
|
+
import { MarkdownRender } from 'markview-vue'
|
|
335
|
+
|
|
336
|
+
// 子组件(可选)
|
|
337
|
+
import {
|
|
338
|
+
CodeBlock,
|
|
339
|
+
Table,
|
|
340
|
+
Blockquote,
|
|
341
|
+
Container,
|
|
342
|
+
Heading,
|
|
343
|
+
Toc
|
|
344
|
+
} from 'markview-vue'
|
|
83
345
|
|
|
84
346
|
// 基础组件
|
|
85
|
-
import {
|
|
347
|
+
import {
|
|
348
|
+
Icon,
|
|
349
|
+
Tooltip,
|
|
350
|
+
Toast,
|
|
351
|
+
ImagePreview,
|
|
352
|
+
Tag
|
|
353
|
+
} from 'markview-vue'
|
|
86
354
|
|
|
87
355
|
// 工具函数
|
|
88
|
-
import {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
356
|
+
import {
|
|
357
|
+
toast,
|
|
358
|
+
copyToClipboard,
|
|
359
|
+
highlightCode,
|
|
360
|
+
preprocessContainers
|
|
361
|
+
} from 'markview-vue'
|
|
362
|
+
|
|
363
|
+
// 类型定义
|
|
364
|
+
import type {
|
|
365
|
+
TocItem,
|
|
366
|
+
MarkdownRenderProps,
|
|
367
|
+
IconName,
|
|
368
|
+
ContainerType
|
|
369
|
+
} from 'markview-vue'
|
|
96
370
|
```
|
|
97
371
|
|
|
98
|
-
##
|
|
372
|
+
## 高级用法
|
|
373
|
+
|
|
374
|
+
### 主题定制
|
|
99
375
|
|
|
100
|
-
|
|
376
|
+
通过 CSS 变量自定义主题:
|
|
101
377
|
|
|
102
378
|
```css
|
|
103
379
|
:root {
|
|
104
|
-
|
|
105
|
-
--md-color-
|
|
106
|
-
--md-
|
|
107
|
-
|
|
108
|
-
|
|
380
|
+
/* 文本颜色 */
|
|
381
|
+
--md-color-text: #1f2937;
|
|
382
|
+
--md-color-text-secondary: #6b7280;
|
|
383
|
+
|
|
384
|
+
/* 链接颜色 */
|
|
385
|
+
--md-color-link: #0064fa;
|
|
386
|
+
--md-color-link-hover: #005dd6;
|
|
387
|
+
|
|
388
|
+
/* 代码块 */
|
|
389
|
+
--md-code-header-bg: #f9fafb;
|
|
390
|
+
--md-code-body-bg: #ffffff;
|
|
391
|
+
--md-code-border: #e5e7eb;
|
|
392
|
+
|
|
393
|
+
/* 表格 */
|
|
394
|
+
--md-table-border: #e5e7eb;
|
|
109
395
|
--md-table-header-bg: #f9fafb;
|
|
396
|
+
--md-table-row-hover-bg: #f9fafb;
|
|
397
|
+
|
|
398
|
+
/* 引用块 */
|
|
399
|
+
--md-blockquote-border: #0064fa;
|
|
400
|
+
--md-blockquote-bg: rgba(0, 100, 250, 0.06);
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### 自定义插件
|
|
405
|
+
|
|
406
|
+
```vue
|
|
407
|
+
<script setup>
|
|
408
|
+
import { MarkdownRender } from 'markview-vue'
|
|
409
|
+
import remarkDirective from 'remark-directive'
|
|
410
|
+
import rehypeAutolinkHeadings from 'rehype-autolink-headings'
|
|
411
|
+
|
|
412
|
+
const remarkPlugins = [remarkDirective]
|
|
413
|
+
const rehypePlugins = [rehypeAutolinkHeadings]
|
|
414
|
+
</script>
|
|
415
|
+
|
|
416
|
+
<template>
|
|
417
|
+
<MarkdownRender
|
|
418
|
+
:raw="content"
|
|
419
|
+
:remark-plugins="remarkPlugins"
|
|
420
|
+
:rehype-plugins="rehypePlugins"
|
|
421
|
+
/>
|
|
422
|
+
</template>
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### 响应式高度
|
|
426
|
+
|
|
427
|
+
```vue
|
|
428
|
+
<template>
|
|
429
|
+
<!-- 固定高度,内部滚动 -->
|
|
430
|
+
<MarkdownRender :raw="content" height="500px" />
|
|
431
|
+
|
|
432
|
+
<!-- 最大高度,超出滚动 -->
|
|
433
|
+
<MarkdownRender :raw="content" max-height="80vh" />
|
|
434
|
+
|
|
435
|
+
<!-- 视口高度计算 -->
|
|
436
|
+
<MarkdownRender :raw="content" height="calc(100vh - 60px)" />
|
|
437
|
+
</template>
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
### 目录配置
|
|
441
|
+
|
|
442
|
+
```vue
|
|
443
|
+
<template>
|
|
444
|
+
<MarkdownRender
|
|
445
|
+
:raw="content"
|
|
446
|
+
:show-toc="true"
|
|
447
|
+
:toc-min-level="2"
|
|
448
|
+
:toc-max-level="3"
|
|
449
|
+
:doc-title="'文档标题'"
|
|
450
|
+
:toc-mode="'sidebar'"
|
|
451
|
+
@toc-change="handleTocChange"
|
|
452
|
+
@toc-click="handleTocClick"
|
|
453
|
+
/>
|
|
454
|
+
</template>
|
|
455
|
+
|
|
456
|
+
<script setup>
|
|
457
|
+
const handleTocChange = (toc) => {
|
|
458
|
+
console.log('目录更新:', toc)
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
const handleTocClick = (item) => {
|
|
462
|
+
console.log('点击目录:', item)
|
|
110
463
|
}
|
|
464
|
+
</script>
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
### 完整配置示例
|
|
468
|
+
|
|
469
|
+
```vue
|
|
470
|
+
<template>
|
|
471
|
+
<MarkdownRender
|
|
472
|
+
:raw="content"
|
|
473
|
+
format="mdx"
|
|
474
|
+
:components="customComponents"
|
|
475
|
+
:theme="isDark ? 'dark' : 'light'"
|
|
476
|
+
:remark-gfm="true"
|
|
477
|
+
:remark-plugins="remarkPlugins"
|
|
478
|
+
:rehype-plugins="rehypePlugins"
|
|
479
|
+
:show-toc="true"
|
|
480
|
+
:toc-min-level="2"
|
|
481
|
+
:toc-max-level="4"
|
|
482
|
+
:toc-mode="'sidebar'"
|
|
483
|
+
:show-back-top="true"
|
|
484
|
+
:back-top-threshold="300"
|
|
485
|
+
height="calc(100vh - 80px)"
|
|
486
|
+
class-name="custom-markdown"
|
|
487
|
+
@rendered="onRendered"
|
|
488
|
+
@error="onError"
|
|
489
|
+
@toc-change="onTocChange"
|
|
490
|
+
/>
|
|
491
|
+
</template>
|
|
492
|
+
|
|
493
|
+
<script setup>
|
|
494
|
+
import { ref } from 'vue'
|
|
495
|
+
import { MarkdownRender } from 'markview-vue'
|
|
496
|
+
import 'markview-vue/style.css'
|
|
497
|
+
|
|
498
|
+
const isDark = ref(false)
|
|
499
|
+
const customComponents = { /* 自定义组件 */ }
|
|
500
|
+
const remarkPlugins = []
|
|
501
|
+
const rehypePlugins = []
|
|
502
|
+
|
|
503
|
+
const onRendered = () => {
|
|
504
|
+
console.log('渲染完成')
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
const onError = (error) => {
|
|
508
|
+
console.error('渲染错误:', error)
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
const onTocChange = (toc) => {
|
|
512
|
+
console.log('目录更新:', toc)
|
|
513
|
+
}
|
|
514
|
+
</script>
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
## 组件库导出
|
|
518
|
+
|
|
519
|
+
除主组件外,还导出以下可复用组件:
|
|
520
|
+
|
|
521
|
+
### 核心组件
|
|
522
|
+
|
|
523
|
+
```typescript
|
|
524
|
+
import {
|
|
525
|
+
CodeBlock, // 代码块
|
|
526
|
+
Table, // 表格
|
|
527
|
+
Blockquote, // 引用块
|
|
528
|
+
Container, // 自定义容器
|
|
529
|
+
Heading, // 标题
|
|
530
|
+
Toc, // 目录
|
|
531
|
+
} from 'markview-vue'
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
### 基础组件
|
|
535
|
+
|
|
536
|
+
```typescript
|
|
537
|
+
import {
|
|
538
|
+
Icon, // 图标
|
|
539
|
+
Tooltip, // 工具提示
|
|
540
|
+
Toast, // 提示消息
|
|
541
|
+
ImagePreview, // 图片预览
|
|
542
|
+
Tag, // 标签
|
|
543
|
+
Skeleton, // 骨架屏
|
|
544
|
+
} from 'markview-vue'
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
### 工具函数
|
|
548
|
+
|
|
549
|
+
```typescript
|
|
550
|
+
import {
|
|
551
|
+
toast, // 显示提示消息
|
|
552
|
+
copyToClipboard, // 复制到剪贴板
|
|
553
|
+
highlightCode, // 代码高亮
|
|
554
|
+
preprocessContainers, // 容器语法预处理
|
|
555
|
+
} from 'markview-vue'
|
|
556
|
+
|
|
557
|
+
// 使用示例
|
|
558
|
+
toast.success('操作成功')
|
|
559
|
+
await copyToClipboard('复制的内容')
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
## 浏览器支持
|
|
563
|
+
|
|
564
|
+
- Chrome >= 90
|
|
565
|
+
- Firefox >= 88
|
|
566
|
+
- Safari >= 14
|
|
567
|
+
- Edge >= 90
|
|
568
|
+
|
|
569
|
+
## 性能优化
|
|
570
|
+
|
|
571
|
+
### 按需加载
|
|
572
|
+
|
|
573
|
+
Shiki 语言包采用动态 import,仅在使用时加载:
|
|
574
|
+
|
|
575
|
+
```typescript
|
|
576
|
+
// 预设语言:javascript, typescript, python, vue 等
|
|
577
|
+
// 其他语言首次使用时自动下载
|
|
111
578
|
```
|
|
112
579
|
|
|
113
|
-
|
|
580
|
+
### 虚拟滚动
|
|
581
|
+
|
|
582
|
+
大型文档(1000+ 行)建议启用虚拟滚动(规划中)。
|
|
583
|
+
|
|
584
|
+
### 缓存策略
|
|
585
|
+
|
|
586
|
+
MDX 编译结果会缓存,相同内容不会重复编译。
|
|
587
|
+
|
|
588
|
+
## 开发指南
|
|
589
|
+
|
|
590
|
+
### 本地开发
|
|
591
|
+
|
|
592
|
+
```bash
|
|
593
|
+
# 克隆仓库
|
|
594
|
+
git clone https://github.com/your-repo/markview-vue.git
|
|
595
|
+
cd markview-vue
|
|
596
|
+
|
|
597
|
+
# 安装依赖
|
|
598
|
+
pnpm install
|
|
599
|
+
|
|
600
|
+
# 启动开发服务器
|
|
601
|
+
pnpm dev
|
|
602
|
+
# 访问 http://localhost:3002
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
### 构建
|
|
606
|
+
|
|
607
|
+
```bash
|
|
608
|
+
# 构建库文件
|
|
609
|
+
pnpm build
|
|
610
|
+
|
|
611
|
+
# 构建演示站点
|
|
612
|
+
pnpm build:demo
|
|
613
|
+
|
|
614
|
+
# 预览演示站点
|
|
615
|
+
pnpm preview
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
### 项目结构
|
|
619
|
+
|
|
620
|
+
```
|
|
621
|
+
markview-vue/
|
|
622
|
+
├── src/ # 源代码
|
|
623
|
+
│ ├── components/ # 核心组件
|
|
624
|
+
│ ├── base/ # 基础组件
|
|
625
|
+
│ ├── utils/ # 工具函数
|
|
626
|
+
│ ├── styles/ # 样式文件
|
|
627
|
+
│ └── index.ts # 入口文件
|
|
628
|
+
├── dev/ # 开发环境
|
|
629
|
+
│ ├── components/ # 演示组件
|
|
630
|
+
│ ├── content/ # 演示内容
|
|
631
|
+
│ └── App.vue # 演示应用
|
|
632
|
+
├── dist/ # 构建输出
|
|
633
|
+
└── demo-dist/ # 演示站点输出
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
详细开发指南请参考 [DEVELOPMENT.md](./DEVELOPMENT.md)。
|
|
637
|
+
|
|
638
|
+
## 常见问题
|
|
639
|
+
|
|
640
|
+
### 1. 如何修改代码块主题?
|
|
641
|
+
|
|
642
|
+
目前使用 `github-light` 主题。自定义主题支持计划中。
|
|
643
|
+
|
|
644
|
+
### 2. 是否支持服务端渲染(SSR)?
|
|
645
|
+
|
|
646
|
+
暂不支持。MDX 编译依赖浏览器环境。
|
|
647
|
+
|
|
648
|
+
### 3. 如何处理大型文档?
|
|
649
|
+
|
|
650
|
+
建议:
|
|
651
|
+
- 使用 `height` 或 `maxHeight` 启用内部滚动
|
|
652
|
+
- 拆分文档为多个小文件
|
|
653
|
+
- 禁用不需要的功能(如 TOC)
|
|
654
|
+
|
|
655
|
+
### 4. 数学公式不显示?
|
|
656
|
+
|
|
657
|
+
确保引入了 KaTeX 样式:
|
|
658
|
+
|
|
659
|
+
```javascript
|
|
660
|
+
import 'markview-vue/style.css' // 已包含 KaTeX 样式
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
### 5. 组件在 Markdown 中不工作?
|
|
664
|
+
|
|
665
|
+
检查:
|
|
666
|
+
- 是否设置 `format="mdx"`
|
|
667
|
+
- 组件名是否使用 PascalCase
|
|
668
|
+
- 组件是否通过 `components` prop 注册
|
|
669
|
+
|
|
670
|
+
## 更新日志
|
|
671
|
+
|
|
672
|
+
查看 [CHANGELOG.md](./CHANGELOG.md) 了解版本历史。
|
|
673
|
+
|
|
674
|
+
## 贡献指南
|
|
675
|
+
|
|
676
|
+
欢迎提交 Issue 和 Pull Request。
|
|
677
|
+
|
|
678
|
+
贡献前请阅读:
|
|
679
|
+
- [开发指南](./DEVELOPMENT.md)
|
|
680
|
+
- [代码规范](./CODE_OF_CONDUCT.md)
|
|
681
|
+
|
|
682
|
+
## 许可证
|
|
683
|
+
|
|
684
|
+
MIT License
|
|
685
|
+
|
|
686
|
+
Copyright (c) 2024-present
|
|
687
|
+
|
|
688
|
+
## 相关链接
|
|
689
|
+
|
|
690
|
+
- [在线演示](https://your-demo-site.com)
|
|
691
|
+
- [GitHub 仓库](https://github.com/your-repo/markview-vue)
|
|
692
|
+
- [npm 包](https://www.npmjs.com/package/markview-vue)
|
|
693
|
+
- [问题反馈](https://github.com/your-repo/markview-vue/issues)
|
|
694
|
+
|
|
695
|
+
## 致谢
|
|
696
|
+
|
|
697
|
+
本项目基于以下优秀的开源项目:
|
|
698
|
+
|
|
699
|
+
- [MDX](https://mdxjs.com/) - Markdown 扩展格式
|
|
700
|
+
- [Shiki](https://shiki.style/) - 语法高亮引擎
|
|
701
|
+
- [KaTeX](https://katex.org/) - 数学公式渲染
|
|
702
|
+
- [remark](https://github.com/remarkjs/remark) - Markdown 处理器
|
|
703
|
+
- [rehype](https://github.com/rehypejs/rehype) - HTML 处理器
|
|
704
|
+
- [lucide-vue-next](https://lucide.dev/) - 图标库
|
|
705
|
+
- [Semi Design](https://semi.design/) - 设计系统参考
|
|
706
|
+
|
|
707
|
+
---
|
|
114
708
|
|
|
115
|
-
|
|
709
|
+
**如有问题或建议,欢迎提交 Issue。**
|