Playground 演练场容器

::: playground 容器将静态代码示例转化为交互式、自包含的代码演练场。读者可以直接在浏览器中实时编辑代码,通过一键点击或快捷键执行代码,查看结构化的控制台输出,在实时渲染视图与底层代码之间无缝切换,并即时预览 HTML/CSS 组件。

Zero-Config 零配置极简架构

演练场运行时采用原生标准 JavaScript 与 CSS 构建,无需 Monaco 或 React 等重型框架。未引用演练场的页面加载 0 KB 额外资源。

容器语法

演练场容器支持包含代码块的普通容器、直接引用代码库外部脚本文件的自闭合容器,以及标准代码围栏语法。

1. 包含代码块的普通容器

使用 ::: playground 块将普通代码包裹起来:

::: playground title="响应式变量探索器" icon:code live
```js
const buildYear = docmd.var.get("docmd.buildYear");
const siteTitle = docmd.var.get("site.title");

console.log("站点标题:", siteTitle);
console.log("构建年份:", buildYear);

// 修改客户端响应式页面变量
docmd.var.set("user.plan", "Enterprise");
console.info("已将用户方案更新为:", docmd.var.get("user.plan"));
return `当前年份: ${buildYear}`;
```
:::

以下是由 docmd 直接渲染的实时可交互演练场:

::: playground title=“响应式变量探索器” icon:code live

const buildYear = docmd.var.get("docmd.buildYear");
const siteTitle = docmd.var.get("site.title");

console.log("站点标题:", siteTitle);
console.log("构建年份:", buildYear);

// 修改客户端响应式页面变量
docmd.var.set("user.plan", "Enterprise");
console.info("已将用户方案更新为:", docmd.var.get("user.plan"));
return `当前年份: ${buildYear}`;

:::

2. Live 与 Code 选项卡切换 (tabs)

当在容器配置中启用 tabs(或 mode="tabs")时,顶栏会渲染交互式的 Live(实时)与 Code(代码)选项卡,允许读者在运行效果与底层源码之间即时切换:

::: playground tabs title="交互式组件(Live 与 Code 切换)" icon:layout live
```html
<div style="padding: 18px; border-radius: 10px; background: #0f172a; color: #38bdf8; font-family: system-ui, sans-serif; border: 1px solid #1e293b;">
  <div style="display:flex; align-items:center; gap:8px; margin-bottom:8px;">
    <span style="display:inline-block; width:10px; height:10px; border-radius:50%; background:#10b981;"></span>
    <strong style="color:#f8fafc; font-size:14px;">选项卡预览模式已激活</strong>
  </div>
  <p style="margin:0 0 12px 0; font-size:13px; color:#94a3b8; line-height:1.5;">
    通过顶部工具栏的选项卡在 <strong>Live</strong> 实时渲染与 <strong>Code</strong> 源代码视图之间自由切换。
  </p>
  <button style="padding:6px 14px; background:#0284c7; color:#fff; border:none; border-radius:6px; font-size:12px; font-weight:600; cursor:pointer;" onclick="console.log('在选项卡预览中触发了操作!')">
    触发控制台日志
  </button>
</div>
```
:::

支持选项卡切换的实时运行演练场:

::: playground tabs title=“交互式组件(Live 与 Code 切换)” icon:layout live

<div style="padding: 18px; border-radius: 10px; background: #0f172a; color: #38bdf8; font-family: system-ui, sans-serif; border: 1px solid #1e293b;">
  <div style="display:flex; align-items:center; gap:8px; margin-bottom:8px;">
    <span style="display:inline-block; width:10px; height:10px; border-radius:50%; background:#10b981;"></span>
    <strong style="color:#f8fafc; font-size:14px;">选项卡预览模式已激活</strong>
  </div>
  <p style="margin:0 0 12px 0; font-size:13px; color:#94a3b8; line-height:1.5;">
    通过顶部工具栏的选项卡在 <strong>Live</strong> 实时渲染与 <strong>Code</strong> 源代码视图之间自由切换。
  </p>
  <button style="padding:6px 14px; background:#0284c7; color:#fff; border:none; border-radius:6px; font-size:12px; font-weight:600; cursor:pointer;" onclick="console.log('在选项卡预览中触发了操作!')">
    触发控制台日志
  </button>
</div>

:::

3. 初始展示代码的选项卡容器 (tabs:code)

如果希望默认向读者展示代码,同时提供即刻切换到实时输出的选项,可指定 tabs:code 或 tabs view="code":

::: playground tabs:code title="选项卡容器(代码优先)" icon:code live
```js
// 递归计算阶乘
function factorial(n) {
  if (n <= 1) return 1;
  return n * factorial(n - 1);
}

const num = 5;
const result = factorial(num);
console.log(`${num} 的阶乘为:`, result);
return result;
```
:::

代码优先的实时工作演练场:

::: playground tabs:code title=“选项卡容器(代码优先)” icon:code live

// 递归计算阶乘
function factorial(n) {
  if (n <= 1) return 1;
  return n * factorial(n - 1);
}

const num = 5;
const result = factorial(num);
console.log(`${num} 的阶乘为:`, result);
return result;

:::

4. 动态引用代码文件的自闭合容器

无需手动将代码复制粘贴到文档中,您可以通过 src 属性直接引用代码库中的实际脚本或组件文件:

::: playground src="./snippets/counter.js" title="动态引用脚本文件" icon:cpu live /:::

引用本地代码文件 [./snippets/counter.js](file:///Users/mac/Workspace/GitHub/docmd-io/docs/docmd-main/v09/zh/content/containers/snippets/counter.js) 的实时演练场:

::: playground src=“./snippets/counter.js” title=“动态引用脚本文件” icon:cpu live /:::

代码库持续同步

使用 src="./path/to/file" 时,docmd 会在构建时自动相对于文档所在页面或工作区根目录解析该文件。当项目源码更新时,文档中的示例将在下次构建时自动同步更新。

5. 源码丢失时的优雅警告降级

如果指定的脚本文件路径无效或已被重命名,docmd 会展示醒目的警告提示栏并在编辑器中整洁打印备用代码,而不会导致构建中断:

::: playground src="./snippets/missing-script.js" title="缺少脚本文件的友好警告" icon:alert-triangle /:::

优雅错误降级的实时演练场:

::: playground src=“./snippets/missing-script.js” title=“缺少脚本文件的友好警告” icon:alert-triangle /:::

6. 代码围栏语法

对于无需容器嵌套的快速示例,只需在 Markdown 代码围栏后添加 playground:

```js playground title="斐波那契快速执行器" icon:zap
function fib(n) {
  return n <= 1 ? n : fib(n - 1) + fib(n - 2);
}

console.log("Fib(10) =", fib(10));
return fib(10);
```

实时可运行代码围栏示例:

function fib(n) {
  return n <= 1 ? n : fib(n - 1) + fib(n - 2);
}

console.log("Fib(10) =", fib(10));
return fib(10);

容器属性说明

::: playground 容器支持丰富的元数据配置属性:

属性 类型 默认值 描述
title string 自动推导或 "Playground" 工具栏显示的标题。支持 title:"标题文本" 或引号包裹。
src / file string 无 要内联载入演练场编辑器的本地代码文件的相对路径。
icon string "play" 标题前渲染的 Lucide 图标名称(如 icon:code, icon:cpu, icon:layout)。
live boolean false 声明后在页面加载时自动运行代码。
tabs / mode string | boolean false 启用在“Live”与“Code”之间切换的选项卡。支持 tabs:code 默认显示代码。
readonly boolean false 锁定代码编辑器禁止修改,但允许点击运行。
layout string "split" 布局形式:"split"(左右分栏)或 "stacked"(上下堆叠)。
lang string 自动推导 ("js") 明确指定代码语言(js, html, css)。从文件扩展名或内部代码围栏推导。

交互能力

title="JavaScript
title="HTML
title="docmd-runtime

演练场在隔离的沙盒上下文中执行 JavaScript。控制台实时捕获:

  • console.log(...) — 带有高亮语法色彩的标准日志
  • console.info(...) — 带有蓝色指示器的信息性输出
  • console.warn(...) — 带有琥珀色指示器的警告日志
  • console.error(...) — 带有红色指示器和调用堆栈的错误跟踪
  • 表达式返回值 — 脚本末尾的求值结果自动显示为:=> 30
console.log("来自 docmd 的问候!");
console.info("状态数据:", { status: "active", version: "0.9.9" });
console.warn("注意: 测试警告提示");
return "执行圆满完成";

当演练场语言设为 html(通过 ```html playground 或 ::: playground lang:html)时,演练场会自动激活预览选项卡,并在隔离的沙箱框架中渲染 HTML/CSS:

<button style="padding: 10px 20px; background: #6366f1; color: white; border: none; border-radius: 8px; font-weight: 600; cursor: pointer; transition: transform 0.2s;" onmouseover="this.style.transform='scale(1.05)'" onmouseout="this.style.transform='scale(1)'" onclick="alert('组件被成功点击!')">
  交互式组件按钮
</button>

演练场可直接访问全局 window.docmd 运行时对象以及响应式页面变量:

  • docmd.var.get('docmd.version') — 读取构建期或客户端动态变量
  • docmd.var.set('key', 'value') — 实时更新变量并驱动页面 DOM 自动重新渲染
  • docmd.theme.get() / docmd.theme.toggle() — 获取或切换当前明暗主题
console.log("当前主题:", window.docmd?.theme?.get() || "light");
console.log("Docmd 引擎版本:", window.docmd?.var?.get("docmd.version") || "0.9.9");
console.log("Git 分支:", window.docmd?.var?.get("docmd.gitBranch") || "main");
return "SDK 调用正常";

:::
:::

键盘快捷键

演练场编辑器提供主流 IDE 标准快捷键,提升操作效率:

  • Cmd + Enter (macOS) 或 Ctrl + Enter (Windows/Linux): 即刻执行当前代码块 * Tab: 插入 2 个空格缩进,避免浏览器焦点失焦 * Shift + Tab: 消除当前行或选区的缩进

关联插件技术文档

有关 AST 解析钩子、构建期脚本安全解析、异常容错机制以及全局插件配置选项的深入技术说明,请参阅 Playground 插件技术架构与参考指南。