跳转到内容

StackBlitz

npm versionnpm monthly downloadsnpm sizenpm license

StackBlitz 项目嵌入到 VitePress 页面中。支持通过 StackBlitz ID、GitHub 仓库或本地项目文件来嵌入在线编辑器,也可以显示为按钮在新标签页中打开。

安装

sh
pnpm add vitepress-plugin-stackblitz
sh
npm install vitepress-plugin-stackblitz
sh
bun add vitepress-plugin-stackblitz
sh
deno add vitepress-plugin-stackblitz
sh
yarn add vitepress-plugin-stackblitz

使用

vitepress-tuck 模式 推荐

.vitepress/config.ts
ts
import { defineConfig } from 'vitepress-tuck'
import stackblitz from 'vitepress-plugin-stackblitz'

export default defineConfig({
  plugins: [stackblitz()],
})

查看 vitepress-tuck 了解更多

传统模式

.vitepress/config.ts
ts
import { defineConfig } from 'vitepress'
import { stackblitzMarkdownPlugin } from 'vitepress-plugin-stackblitz'

export default defineConfig({
  markdown: {
    config: (md) => {
      md.use(stackblitzMarkdownPlugin)
    },
  },
})
.vitepress/theme/index.ts
ts
import type { Theme } from 'vitepress'
import { enhanceAppWithStackBlitz } from 'vitepress-plugin-stackblitz/client'
import DefaultTheme from 'vitepress/theme'

export default {
  extends: DefaultTheme,
  enhanceApp(ctx) {
    enhanceAppWithStackBlitz(ctx)
  },
} satisfies Theme

语法

插件提供两种语法来嵌入 StackBlitz 项目:用于引用外部项目的嵌入语法,以及将项目文件直接内联在 Markdown 中的容器语法。

从 StackBlitz ID 嵌入

md
@[stackblitz](sdk-github-project)

从 GitHub 仓库嵌入

md
@[stackblitz github](user/repo)

嵌入本地项目

在项目目录中放置 stackblitz.config.json(或 .yaml.yml)配置文件,然后使用 local 属性:

md
@[stackblitz local](path/to/your/project)

path 支持以下路径前缀:

前缀说明
@相对于 VitePress srcDir
/相对于 VitePress 项目根目录
-相对于当前 markdown 文件所在目录

查看 本地项目配置 了解更多。

按钮模式

显示为按钮,点击后在新标签页中打开项目:

md
@[stackblitz button](stackblitz-id)

也可以结合 github 使用:

md
@[stackblitz github button](user/repo)

容器语法

将项目文件直接内联在 Markdown 中,适合简单项目的快速书写和演示:

md
::: stackblitz title="Project" description="Project description" template="javascript"

```yml [config]
title: Project
template: javascript
description: Project description
```

```json [package.json]
{
  "name": "project",
  "version": "1.0.0"
}
```

```js [index.js]
console.log('Hello StackBlitz!');
```

```html [index.html]
<!DOCTYPE html>
<html lang="en">
<body>
  <h1>Hello StackBlitz!</h1>
  <script src="./index.js"></script>
</body>
</html>
```

:::

属性说明

嵌入 / 打开选项

适用于嵌入语法和按钮模式:

属性类型默认值说明
theme'dark' | 'light' | 'default'自动主题,自动跟随 VitePress 暗色模式
view'default' | 'preview' | 'editor''default'初始视图模式
heightnumber400嵌入高度(仅嵌入模式)
widthnumber-嵌入宽度(仅嵌入模式)
clickToLoadbooleanfalse显示"点击运行"提示
openFilestring | string[]-默认打开的文件
hideExplorerbooleanfalse隐藏文件浏览器
hideDevToolsbooleanfalse隐藏开发者工具
showSidebarbooleanfalse显示侧边栏
terminalHeightnumber (0-100)-终端高度百分比
devToolsHeightnumber (0-100)-开发者工具高度百分比
newWindowbooleanfalse在新标签页中打开
forceEmbedLayoutbooleanfalse强制嵌入布局(已弃用)
originstring-StackBlitz EE 实例地址

项目选项

仅用于本地项目嵌入模式和容器语法:

属性类型默认值说明
titlestring-项目标题(必填)
descriptionstring-项目描述(必填)
template'angular-cli' | 'create-react-app' | 'html' | 'javascript' | 'typescript' | 'polymer' | 'vue' | 'node'-项目模板(必填)
dependenciesRecord<string, string>-npm 依赖
filesRecord<string, string>-项目文件(本地模式自动加载)

构建设置

通过 settings 前缀属性设置,仅用于本地项目嵌入模式和容器语法:

属性类型默认值说明
settingsTrigger'auto' | 'save' | 'keystroke''auto'编译触发时机
settingsAction'hmr' | 'refresh''hmr'编译更新方式
settingsClearConsolebooleantrue编译后是否清除控制台
md
@[stackblitz local title="Demo" description="A demo" template="html" settingsTrigger="save" settingsAction="refresh"](path/to/project)

本地项目配置

使用 @[stackblitz local](path) 嵌入本地项目时,插件会自动:

  1. 加载指定目录下的所有文件(排除 node_modules
  2. 按顺序查找 stackblitz.config.jsonstackblitz.config.yamlstackblitz.config.yml 配置文件
  3. 将配置文件中的选项与加载的文件合并

示例 stackblitz.config.json

json
{
  "$schema": "https://unpkg.com/vitepress-plugin-stackblitz/schema.json",
  "title": "Project",
  "description": "Project description",
  "template": "javascript",
  "dependencies": {
    "lodash": "^4.17.0"
  },
  "settings": {
    "trigger": "save"
  }
}

TIP

使用 $schema 字段可以在编辑器中获得配置文件的智能提示和校验支持。

json
{
  "$schema": "https://unpkg.com/vitepress-plugin-stackblitz/schema.json"
}

示例

StackBlitz ID 嵌入

md
@[stackblitz](sdk-github-project)

按钮模式

md
@[stackblitz button](sdk-github-project)

容器语法

md
::: stackblitz button

```yml [config]
title: Project
template: javascript
description: Project description
```

```json [package.json]
{
  "name": "project",
  "version": "1.0.0",
  "description": "Project description",
  "main": "index.js",
  "keywords": ["project"],
  "author": "Project Author",
  "license": "MIT"
}
```

```js [index.js]
console.log('Hello StackBlitz!');
```

```html [index.html]
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Project</title>
</head>
<body>
  <h1>Hello StackBlitz!</h1>
  <script src="./index.js"></script>
</body>
</html>
```

:::

本地项目嵌入

index.html
html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <h1>StackBlitz</h1>
  <script src="./index.js"></script>
</body>
</html>
index.js
js
// eslint-disable-next-line no-console
console.log('StackBlitz')
package.json
json
{
  "name": "stackblitz",
  "type": "module",
  "private": true
}
stackblitz.config.json
json
{
  "$schema": "https://unpkg.com/vitepress-plugin-stackblitz/schema.json",
  "title": "Project",
  "description": "Project description",
  "template": "javascript",
  "dependencies": {}
}
md
@[stackblitz local](@/snippets/stack)

基于 MIT 许可发布