DemoPreview 预览组件
在 Markdown 文档中嵌入可运行的组件演示:上半部分实时渲染组件,下半部分展示对应源码。支持目录引入、文件引入、内联代码三种方式,源码面板自动继承主题代码块视觉(光束边框、语法高亮、折叠)。
特性
- 三种引入方式 — 目录引入、文件引入、内联代码
- 源码面板复用主题样式 — 自动继承光束边框、语法高亮、折叠等代码块视觉
- 多文件 Tab 切换 — 目录模式下多个文件以标签页展示
- 样式隔离 — 运行预览区使用
not-prose隔离,demo 组件原样展示不受文档样式干扰 - 零配置启用 — 随主题自动注册,Markdown 中直接使用
<DemoPreview>
目录引入
适合多文件组成的完整 Demo。指定一个目录,目录内的 index.vue 作为运行组件,其余文件作为源码以 Tab 展示。
md
<DemoPreview dir="demos/alert" />dir路径相对项目根(VitePress 启动目录)- 目录必须包含
index.vue - 目录内所有文件按
index.vue优先、字母序排列
文件引入
引入单个 .vue 文件作为演示。
md
<DemoPreview src="./MyButton.vue" />src路径相对当前 Markdown 文件
内联代码
直接在 Markdown 中编写 Vue 代码,用 <DemoPreview> 标签包起来,无需创建文件。代码会被提取为虚拟模块编译运行(不生成磁盘临时文件)。
md
<DemoPreview>
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>
<button @click="count++">点击 {{ count }} 次</button>
</DemoPreview>写法约定
<DemoPreview> 标签内的代码需遵循以下缩进规则:
- 顶层标签顶格写:
<script setup>、</script>、根元素(如<button>)不要缩进 - 标签内部代码正常缩进:
import、const等按 Vue SFC 惯例缩进
错误写法(会导致源码缩进错乱):
md
<DemoPreview>
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>
<button @click="count++">{{ count }}</button>
</DemoPreview>正确写法:
md
<DemoPreview>
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>
<button @click="count++">{{ count }}</button>
</DemoPreview>实际效果
以下是一个文件引入的实际渲染(内联代码效果请访问 测试页):
工作原理
DemoPreview 由三部分协作:
- Markdown 插件(
fxDemoPreviewPlugin)— 在编译期识别三种写法,统一改写为<DemoPreview>组件调用,自动注入演示组件的import语句 - Vite 虚拟模块插件(
fxDemoVirtualPlugin)— 为内联代码的import 'virtual:fx-demo/<hash>.vue'提供 SFC 内容,交 vue 编译(无磁盘临时文件) - 预览容器组件(
DemoPreview.vue)— 上半用<ClientOnly>+not-prose渲染演示组件,下半PreviewGroup展示源码
源码展示走 VitePress 原生代码块渲染,因此自动继承主题的代码块视觉(暗色模式光束边框、语法高亮、折叠等)。
注意事项
- 演示组件在客户端运行(
ClientOnly),SSG 阶段显示加载占位 - 运行预览区使用
not-prose隔离,不受文档全局样式(vp-doc)影响 - 内联代码的
<script setup>会被提取到虚拟模块顶层编译(Vue 不允许标签内嵌 script setup)
