跳转至正文

在线沙箱直达 (StackBlitz WebContainer) ​

在传统技术文档中,代码示例往往只能“静态阅读”或“手动复制到本地运行”。当读者想要调整一个 Props 参数或测试边界用例时,必须经历漫长的本地环境初始化:创建文件夹、安装包依赖、配置构建工具,最终往往因为环境差异或配置繁琐而放弃尝试。

VitePress Zenith 深度整合了全球领先的 StackBlitz WebContainer 浏览器虚拟机技术,为交互演示组件 <VpDemoPreview> 与独立沙箱卡片 <VpPlayground> 注入了一键在线试跑与即时调试能力。读者只需轻点鼠标,当前文档中的代码片段即可瞬间打包并投送至浏览器虚拟 Node.js 容器中极速运行,无需任何本地环境即可享受完整的 Vite + Vue 3 调试体验。


核心设计特性 ​

秒级 WebContainer 启动
利用 WebAssembly 在浏览器客户端沙箱中即时编译并运行 Vite 开发服务器,零远程服务端等待。
动态虚拟工程自动构建
自动将 Markdown 中的代码片段包装为符合规范的微型 Vite + Vue 3 工程模板(含 package.json 与构建配置)。
按需动态载入 (0 首屏负担)
仅在读者实际点击「在 StackBlitz 试跑」时动态载入 SDK,全站首屏体积与 SSR 构建完全不受影响。
精细化开关与自适应
支持通过属性随心开启或关闭试跑按钮,在纯展示代码或受限网络下无缝降级为一键复制代码。

实机效果演示 ​

1. 交互演示工具栏一键投送 (VpDemoPreview) ​

在 <VpDemoPreview> 中,只要提供了 code 属性且未显式关闭试跑,工具栏右侧将自动呈现醒目的闪电试跑按钮:

支持即时投送Vite + Vue 3点击右上角闪电图标即可在沙箱中运行
响应式颜色切换器点击右侧「在 StackBlitz 试跑」,体验在浏览器虚拟机中修改代码并秒级热重载

2. 独立沙箱启动卡片 (VpPlayground) ​

适合在长篇教程末尾作为“实战练习区”或“在线动手实验室”嵌入:

Vue 3 响应式待办清单 (TodoMVC)WebContainer

开箱即用的轻量待办列表应用,点击按钮一键进入独立全屏开发环境,立即开始二次开发

<script setup lang='ts'>
import { ref } from 'vue'
<p>interface Todo {
id: number
text: string
done: boolean
}</p>
<p>const input = ref('')
const todos = ref<Todo[]>([
{ id: 1, text: '学习 VitePress Zenith 核心架构', done: true },
{ id: 2, text: '体验 StackBlitz WebContainer 即时沙箱', done: false },
{ id: 3, text: '配置全站离线 PWA 与暗黑模式', done: false },
])</p>
<p>const addTodo = () => {
if (!input.value.trim()) return
todos.value.push({ id: Date.now(), text: input.value.trim(), done: false })
input.value = ''
}</p>
<p>const toggle = (todo: Todo) => {
todo.done = !todo.done
}
</script></p>
<template>
  <div style='max-width: 480px; margin: 0 auto; padding: 24px; font-family: system-ui, sans-serif;'>
    <h3 style='margin-bottom: 16px; color: #6366f1;'>待办事务清单</h3>
    <div style='display: flex; gap: 8px; margin-bottom: 16px;'>
      <input
        v-model='input'
        placeholder='输入待办事项按回车添加...'
        style='flex: 1; padding: 8px 12px; border-radius: 6px; border: 1px solid #cbd5e1;'
        @keyup.enter='addTodo'
      />
      <button @click='addTodo' style='padding: 8px 16px; border-radius: 6px; background: #6366f1; color: #fff; border: none; cursor: pointer;'>
        添加
      </button>
    </div>
    <ul style='list-style: none; padding: 0; margin: 0;'>
      <li
        v-for='todo in todos'
        :key='todo.id'
        :style='{ display: flex, alignItems: center, gap: 8px, padding: 8px 0, borderBottom: 1px solid #f1f5f9, textDecoration: todo.done ? line-through : none, color: todo.done ? #94a3b8 : #1e293b, cursor: pointer }'
        @click='toggle(todo)'
      >
        <input type='checkbox' :checked='todo.done' />
        <span>{{ todo.text }}</span>
      </li>
    </ul>
  </div>
</template>

底层虚拟工程架构 ​

当读者点击试跑按钮时,Zenith 底层的 openInStackBlitz 工具函数将在毫秒级完成虚拟文件系统的编排:

正在渲染架构图表...

生成的微型工程文件清单 ​

  1. package.json:精简声明 vue、vite、@vitejs/plugin-vue 与 typescript,确保 WebContainer 无缓存冷启动时在 2 秒内完成极速 pnpm install;
  2. vite.config.ts:注入标准 Vue 单文件组件解析插件;
  3. index.html:带有 <div id="app"></div> 根挂载节点与 UTF-8 编码设置;
  4. src/main.ts:标准的 createApp(App).mount('#app') 实例化引导入口;
  5. src/App.vue:智能包装后的组件源码。若传入的代码不包含 <template>,算法会自动注入 <script setup> 与居中弹性容器,防范渲染失败。

组件参数契约与使用规范 ​

<VpDemoPreview> 沙箱增强属性 ​

VpDemoPreview Props (沙箱相关)

参数名称
类型契约
默认值
详细说明
code
类型:string
默认值:-
组件源码文本。提供此项时才会激活代码复制与 StackBlitz 试跑按钮
stackblitz
类型:boolean
默认值:true
是否在工具栏展示「在 StackBlitz 试跑」快捷按钮。设为 false 时将隐藏该按钮
playgroundTitle
类型:string
默认值:-
在 StackBlitz 新窗口中展示的项目自定义标题,缺省时使用 demo title

<VpPlayground> 独立沙箱卡片属性 ​

VpPlayground Props

参数名称
类型契约
默认值
详细说明
code必填
类型:string
默认值:-
待运行的核心源码文本
title
类型:string
默认值:'组件交互沙箱'
沙箱工程标题
desc
类型:string
默认值:-
沙箱工程副标题或补充说明文字
badge
类型:string
默认值:'WebContainer'
右上角显示的特性技术徽标
buttonText
类型:string
默认值:'在 StackBlitz 试跑'
启动按钮文字

最佳实践与注意事项 ​

  1. 样式隔离与作用域:
    建议在代码片段中显式采用 <style scoped>,防止多组件在沙箱中发生样式污染;
  2. 网络隔离兜底:
    若读者身处企业内网防火墙之后导致无法访问 StackBlitz 域名,组件工具栏中的一键复制代码仍然完好可用,确保零阅读阻塞;
  3. 二开引入第三方组件库:
    若您的文档需要为沙箱引入私有组件库或特定 npm 包,只需在 docs/.vitepress/theme/utils/stackblitz.ts 的 createViteVueProjectFiles 中为 package.json 的 dependencies 追加依赖声明即可。

基于 Apache-2.0 协议开源发布