playground-elements 全面解析:如何用零后端搭建带实时预览的在线代码沙箱
【免费下载链接】playground-elementsServerless coding environments for the web.项目地址: https://gitcode.com/gh_mirrors/pl/playground-elements
playground-elements是 Google 开源的 Web Components 组件库(NPM 包),让你零后端就能在网页里嵌入一个带实时预览的在线代码沙箱:浏览器内的代码编辑器、虚拟文件系统和预览窗口全部在纯前端完成,代码永远不会发送到服务器。只要你能托管静态文件,就能托管一个代码沙箱。
它最适合三类场景:
- 📚 在技术文档中嵌入可编辑的代码示例
- 🎓 构建交互式教程与示例画廊
- 🧪 打造完整功能的在线代码沙箱(类似 JSBin / Glitch)
零后端架构:Service Worker 搭建虚拟文件系统
playground-elements 的"零后端"不是口号,而是靠浏览器的原生能力实现的:
- Service Worker:拦截对特定 URL 空间的请求,用你本地的项目文件响应 HTTP 请求,等于在浏览器里搭了一个虚拟文件系统。预览组件中的
<iframe>指向这个虚拟空间里的index.html。相关逻辑见 playground-service-worker.ts。 - Web Worker:TypeScript 编译在独立线程中进行,页面始终保持流畅响应。编译实现见 typescript-builder.ts。
- 会话隔离:每个
<playground-project>都会生成一个唯一会话 ID,用来隔离来自预览 iframe 的请求,实现见 playground-project.ts。
一键搭建:三步拥有实时预览的代码沙箱
第 1 步,安装依赖:
npm i playground-elements第 2 步,在页面中放置<playground-ide>组件,并用内联<script>标签写入项目文件:
<playground-ide editable-file-system line-numbers resizable> <script type="sample/html" filename="index.html"> <!doctype html><body>Hello<script type="module" src="./index.js"></script></body> </script> <script type="sample/ts" filename="index.ts"> document.body.appendChild(document.createTextNode("World!")) </script> </playground-ide>第 3 步,本地用开发服务器预览(自动处理裸模块导入解析):
npm i -D @web/dev-server npx web-dev-server --node-resolve --watch打开页面,左侧编辑、右侧即时刷新,就是上图中的效果。官方内置了多个可直接运行的示例,如 demo/index.html 和 demo/project-1/project.json。
三种方式定义沙箱项目文件
| 方式 | 适用场景 | 说明 |
|---|---|---|
内联<script>标签 | 文档内嵌示例 | 用type="sample/ts"等属性标注文件类型 |
| JSON 配置文件 | 项目文件较多时 | 通过project-src属性指向 JSON 清单,支持extends继承 |
config属性 | 动态加载项目 | 在 JS 中直接赋值对象,也用于保存/分享项目状态 |
JSON 清单示例(来自 demo/typescript/project.json):
{ "files": { "index.html": {}, "my-element.ts": {} } }files中每个文件名可内联content内容,或省略后由系统按清单 URL 相对路径自动抓取文件。
零构建步骤引入 npm 模块
在沙箱里写import {html} from 'lit'这种裸模块导入,playground-elements 会自动把它改写成特殊的./node_modules/虚拟 URL,并在后台从 CDN(默认 unpkg.com)按最新版本拉取——完全不需要你在页面里打包任何东西。
进阶玩法:
- 在项目里放一个
package.json声明dependencies,即可锁定依赖版本,用法和本地 NPM 完全一致 - 支持 Node 风格的export conditions(
module、import、development、browser`) - 配置import map可完全接管模块解析,例如把 CDN 换成其他源
TypeScript 自动编译:无需本地 tsc
沙箱会自动编译.ts、.tsx、.jsx文件,并自动拉取导入模块的类型声明来显示错误提示。默认编译参数为es2021+nodenext模块解析,与tsc行为保持一致。
注意一个细节:跨文件导入 TS 模块时要写.js扩展名(和本地tsc一样):
import './my-other-module.js';想要类型提示更完整?把@types/*包写进项目package.json的依赖即可。
自定义布局:自由组合编辑器与预览窗
不满足于默认的左右分栏?playground-elements 把 IDE 拆成了可自由组合的小组件:
| 组件 | 作用 |
|---|---|
<playground-project> | 管理虚拟文件系统,协调各类 Worker |
<playground-file-editor> | 文件编辑器,可用filename属性锁定单个文件 |
<playground-preview> | 实时预览窗口 |
<playground-tab-bar> | 文件切换标签栏 |
<playground-code-editor> | 纯文本编辑器(基于 CodeMirror 6) |
如上图这种"编辑器在上、预览在下"的布局,只需把编辑器、预览的project属性都指向同一个<playground-project id>即可;不加标签栏,用户就只能看到你指定的那个文件——非常适合文档里的单文件示例。更棒的是,编辑器基于 CodeMirror 6,可以接入任意 CodeMirror 扩展。
沙箱安全须知 ⚠️
预览中的代码应始终视为不可信代码(尤其实现了"分享"功能时,用户可能通过恶意 URL 执行任意代码)。
默认沙箱基础 URL 是 unpkg.com 上的固定路径,因为该源没有权限、无法篡改宿主页面。如果你要覆盖sandboxBaseUrl,务必确保新地址:
- 与你的站点不同源(防止
window.parent篡改父窗口) - 不能访问任何敏感 Cookie
- 不能访问任何敏感 API 或资源
完整说明见 README.md 的 "Sandbox security" 章节。
主题定制与实用技巧
- 🎨完整主题化:通过 CSS 自定义属性可精确控制从背景色到每种语法高亮 token 的颜色,包内预置了多套主题(如
ayu-mirage),导入对应样式并加一个 class 即可 - 🔍聚焦用户注意力:用
playground-hide注释隐藏样板代码、playground-fold注释折叠代码段,隐藏的代码不参与展示但正常编译 - 📦打包注意:TypeScript 编译依赖 Web Worker,用 Rollup / Webpack 打包时需按 examples/rollup/rollup.config.js、examples/webpack/webpack.config.js 处理 Worker 文件的拷贝
- 📤保存与分享项目:读取
<playground-project>的config属性即可拿到完整项目状态,可做 base64 编码存入 URL,或对接自己的后端
常见问题速查
保存分享怎么做?序列化config属性(JSON + base64url 存入 URL hash 最简单)。
能跑 JSX / SASS 等构建步骤吗?支持构建插件还在路线图上,暂未提供。
模块解析不生效?HTML 文件内的 import 暂不会被转换,import map 的scopes字段也暂不支持。
浏览器兼容如何?支持所有现代浏览器(Chrome / Firefox / Safari / Edge),需要自定义元素、ES 模块、Service Worker 与 Web Worker 能力,不支持 IE。
总结
playground-elements 用 Web Components + Service Worker + Web Worker 的组合,把"编辑器 + 虚拟文件系统 + 实时预览 + TS 编译"整套能力压缩进了纯前端,无需部署任何后端服务就能获得 Glitch 级别的在线代码沙箱体验。无论你是想在文档里放几个可编辑示例,还是从零搭建一个代码演示平台,它都能以最小成本落地。想动手试试,直接参考 demo/ 目录下的完整示例即可。
【免费下载链接】playground-elementsServerless coding environments for the web.项目地址: https://gitcode.com/gh_mirrors/pl/playground-elements
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考