HTML 代码运行器 的工作原理
深入探讨该工具背后的技术架构、安全模型和设计决策。
架构概述
HTML Code Runner 是一个纯粹的客户端应用程序。没有后端服务器处理代码,没有存储片段的数据库,也没有对外部服务的 API 调用。整个工具使用标准 Web 技术(HTML、CSS 和 JavaScript)在用户浏览器中运行。
代码执行管道
单击“运行”按钮时,会发生以下顺序:
- 代码捕获 - 来自文本区域编辑器的 HTML 内容被读取为字符串
- Blob 创建 - 代码字符串包装在 MIME 类型
text/html的Blob对象中 - URL 生成 - 使用
URL.createObjectURL()创建临时 Blob URL - Iframe 加载 - Blob URL 分配给沙盒 iframe 的
src属性 - 渲染 - 浏览器在 iframe 中渲染 HTML 文档,执行任何嵌入的 CSS 和 JavaScript
- 控制台捕获 - iframe 的
console.log、console.error和console.warn方法被重写,以将输出通过管道传输到控制台输出面板 - 清理 - Blob URL 在加载以释放内存后被撤销
安全模型
安全性是一个核心设计考虑因素。我们使用多层隔离:
沙盒内嵌框架
预览 iframe 使用具有以下权限的 HTML5 sandbox 属性:
allow-scripts— 在 iframe 中启用 JavaScript 执行(JS 预览必需)allow-modals— 允许alert()、confirm()和prompt()对话框allow-same-origin— Blob URL 加载所需(内容必须与 Blob URL 共享源)
沙箱明确不包括:
allow-top-navigation— iframe 无法导航父页面allow-forms— 阻止表单提交(防止意外数据泄露)allow-popups— 弹出窗口被阻止
Blob URL 隔离
我们使用 Blob URL,而不是通过 document.write() 或 srcdoc 注入代码。这提供了更好的隔离,因为浏览器将 Blob URL 视为具有自己的执行上下文的单独文档。
无服务器端处理
您的代码永远不会通过网络传输。从您键入它的那一刻起直到您关闭选项卡,它都会保留在浏览器的内存中。没有服务器可供破坏,没有数据库可供破坏,也没有 API 端点可供利用。
编辑器设计
代码编辑器是一个样式化的
- 行号 - 同步的只读面板,显示行号并与编辑器一起滚动
- Tab 支持 - Tab 键插入两个空格而不是移动焦点(标准代码编辑器行为)
- 等宽字体 — 使用 JetBrains Mono 实现最佳代码可读性
- 禁用拼写检查 - 防止浏览器在代码“拼写错误”下划线
性能考虑因素
- 整个工具加载在一个 HTML 文件中,其中包含两个小 JS 文件和一个 CSS 文件
- 不使用 JavaScript 框架或库——所有代码都是普通 JS
- 字体通过
font-display: swap异步加载 - 该工具在页面加载后几毫秒内即可进行交互
- Blob URL 在使用后会被撤销,以防止内存泄漏
无障碍
该工具的设计考虑到了可访问性:
- 所有交互元素都有 ARIA 标签
- FAQ 手风琴使用正确的
aria-expanded状态 - 所有交互元素的焦点都清晰可见
- 颜色对比度符合 WCAG AA 指南
- 该工具完全可以通过键盘导航
- Toast 通知使用
role="status"和aria-live="polite"
响应式设计
该界面适应所有屏幕尺寸:
- 桌面 (1024px+) - 并排编辑器和预览面板
- 平板电脑 (768px–1024px) — 全宽布局的堆叠面板
- 移动设备 (<768px) - 堆叠面板、折叠导航、优化触摸目标
搜索引擎优化实施
本网站的每个页面都包括:
- 独特的标题标签和元描述
- 语义 HTML5 元素(页眉、主要、页脚、导航、部分、文章)
- 规范 URL 可防止重复内容问题
- 用于网页、SoftwareApplication、FAQPage 和 BreadcrumbList 架构的结构化数据 (JSON-LD)
- 用于多语言支持的 Hreflang 标签
- 每页一个 H1,具有适当的标题层次结构