架构概述

HTML Code Runner 是一个纯粹的客户端应用程序。没有后端服务器处理代码,没有存储片段的数据库,也没有对外部服务的 API 调用。整个工具使用标准 Web 技术(HTML、CSS 和 JavaScript)在用户浏览器中运行。

代码执行管道

单击“运行”按钮时,会发生以下顺序:

  1. 代码捕获 - 来自文本区域编辑器的 HTML 内容被读取为字符串
  2. Blob 创建 - 代码字符串包装在 MIME 类型 text/htmlBlob 对象中
  3. URL 生成 - 使用 URL.createObjectURL() 创建临时 Blob URL
  4. Iframe 加载 - Blob URL 分配给沙盒 iframe 的 src 属性
  5. 渲染 - 浏览器在 iframe 中渲染 HTML 文档,执行任何嵌入的 CSS 和 JavaScript
  6. 控制台捕获 - iframe 的 console.logconsole.errorconsole.warn 方法被重写,以将输出通过管道传输到控制台输出面板
  7. 清理 - 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,具有适当的标题层次结构

尝试 HTML 代码运行器 →