Skip to content

Web Canvas (进阶指南)

Web Canvas 的核心价值在于其 Physical-First 架构下的深度协作能力。本指南将深入探讨 Agent 联动、预览引擎原理、版本控制及自定义模板等进阶功能。

Agent 协作工作流

绑定画布

在 LLM 聊天设置中找到 "绑定画布 ID" 配置项,输入项目大厅中显示的画布 ID 即可完成绑定。绑定后,Agent 在生成代码时会直接操作画布文件,而非仅输出文本建议。

Agent 可操作的能力

方法功能典型使用场景
read_canvas_file读取文件(带行号)Agent 审查现有代码
apply_canvas_diff应用 Search/Replace DiffAgent 精准修改指定代码块
write_canvas_file全量写入文件Agent 创建新文件或重写整个文件
commit_changes提交所有更改Agent 完成一轮修改后创建 Git 快照
discard_changes丢弃未提交变更回退 Agent 的修改
list_canvas_files获取文件树Agent 了解项目结构
create_canvas创建新画布Agent 主动新建项目
clear_runtime_errors清空运行时错误修复问题后清理错误记录
open_window打开预览窗口为指定画布开启独立预览

Agent 驱动的代码生成工作流

  1. 在 LLM 聊天中绑定 Web Canvas(设置中填入画布 ID)
  2. 用自然语言描述需求,如"帮我创建一个带有交互式折线图的数据仪表盘"
  3. Agent 会自动创建文件、写入代码
  4. 你可以在预览窗口中实时查看效果
  5. 不满意时直接告诉 Agent 修改,它会使用 apply_canvas_diff 精确调整指定代码块
  6. 满意后 Agent 调用 commit_changes 提交版本

审批系统(Preview → Approve/Reject)

Agent 的操作会经过审批系统:

  1. 预览阶段:Agent 调用的 apply_canvas_diffwrite_canvas_file直接执行到磁盘,让你在预览中实时看到效果
  2. 用户确认:你确认修改是否正确,选择批准拒绝
  3. 拒绝回滚:如果拒绝,系统自动回滚——新文件被物理删除,已有文件通过 Git checkout 恢复

运行时错误自动注入

开启"自动包含运行时错误"设置后,预览中的运行时错误会自动注入到 Agent 上下文中。Agent 获取上下文时能看到类似以下信息:

--- RUNTIME ERRORS ---
TypeError: Cannot read property 'data' of undefined
  at Line 24:12 (index.js)
---

这样 Agent 可以"看见"自己代码的问题并自动修复。你可以在设置中调整最大错误数量(0–50)来控制 token 消耗。

隐式创建

如果当前没有打开的画布,Agent 执行文件操作时会自动创建一个新画布,确保协作流程不会中断。


模板系统

内置模板

系统内置了多分类模板,在创建画布时可选:

分类说明示例模板 ID
基础干净的空 HTML 模板blank-html
动效CSS 动画、Canvas 渲染模板canvas-animation
数据可视化集成 ECharts 等图表库的模板echarts-dashboard
游戏轻量游戏开发模板snake-game
作品集个人展示页模板portfolio-page
工具实用工具类模板json-pretty-viewer
用户自定义用户自己创建的模板自定义存储路径

模板版本管理

模板通过 template.json 中的 version 字段管理版本。应用启动时,内置模板会同步到 AppData/canvases/templates/builtin/ 目录下,仅在版本更新时覆盖旧文件。

自定义模板

你可以将自己的项目目录结构创建为模板。用户自定义模板存放在 {appDataDir}/canvases/templates/user/{templateId}/ 目录下。

创建自定义模板的步骤:

  1. {appDataDir}/canvases/templates/user/ 下创建一个以模板 ID 命名的目录
  2. 在该目录下创建 template.json,定义模板元数据(名称、描述、入口文件、版本)
  3. 在该目录下创建 files/ 子目录,放入所有项目文件
  4. 重启 Web Canvas 或重新加载,在新建画布时就能看到自定义模板选项

TODO: 截图 - 自定义模板目录结构示例

设置默认模板

你可以在 Web Canvas 设置页面的项目管理中配置"默认项目模板"的 ID。创建新项目时会自动预选该模板。


版本控制

每个画布项目内置一个独立的 Git 仓库。当你创建画布时,系统自动执行:

git init → git add <all files> → git commit -m "Initial commit from template: {name}"

提交更改

在编辑器左侧的待更改面板中点击 Commit All,输入提交信息即可。提交操作:

  1. 通过 Git 内部服务检查所有文件的状态矩阵
  2. 添加未跟踪文件(new)和修改过的文件(modified)
  3. 执行 Git commit
  4. 更新元数据文件的 updatedAt 时间戳
  5. 更新项目索引
  6. 刷新状态栏

TODO: 截图 - 待更改面板上的 Commit 按钮和提交信息输入

丢弃更改

点击 Discard 按钮会通过 git checkout 恢复到最近一次提交的状态。这是一个不可逆操作——所有未提交的修改都会丢失,请谨慎操作。

查看变更

左侧文件树中的每个文件都会显示 Git 状态标识:

  • new(绿色):新创建但未提交的文件
  • modified(橙色):已有文件被修改
  • deleted(红色):文件被删除

预览引擎深入

架构原理

预览引擎使用 iframe 通过 srcdoc 属性渲染入口文件。它会自动在 HTML 中注入:

  • <base> 标签:确保相对路径资源(图片、CSS、JS 文件)正确加载
  • 错误捕获脚本:劫持 console 方法(warn/error)和全局错误事件(window.onerrorunhandledrejection

预览通信机制:预览 iframe 通过 window.parent.postMessage() 将运行时错误回传到主窗口,主窗口的去重和限流机制确保不会淹没日志。

预览配置

设置项说明默认值
自动打开预览创建或打开项目后自动开启独立预览窗口开启
预览刷新延迟文件保存后等待多久刷新预览500ms

独立预览窗口

预览窗口是一个由 Rust 后端创建的系统级 WebviewWindow,独立于主应用运行。这意味着:

  • 预览窗口关闭后不会影响编辑器状态
  • 可以同时打开多个画布的预览窗口
  • 预览窗口独立于主应用窗口,不会被遮挡

外部编辑器协同

你可以在 Web Canvas 中配置 VSCode 路径,然后在项目操作菜单中选择 在 VSCode 中打开

配置 VSCode 路径

进入 Web Canvas 设置,在外部编辑器配置项中填入 code.execode.cmd 的完整路径。系统会自动扫描常见的 VSCode 安装目录(点击扫描按钮)。

协同工作流

  1. VSCode 中编辑:享受完整的 IDE 体验(代码补全、调试、Git 历史)
  2. Web Canvas 中预览:回到 Web Canvas 查看实时预览效果
  3. Web Canvas 感知变更:Physical-First 架构通过 Git 状态自动感知 VSCode 中的修改,打开项目时自动刷新

TODO: 截图 - 在 VSCode 中编辑画布项目


健康检查与项目修复

Web Canvas 会定期对所有项目执行健康检查,对比磁盘目录和索引文件。可能的状态:

状态含义修复方式
健康索引与磁盘一致无需操作
索引异常索引存在但磁盘缺失移除孤儿索引
未索引磁盘存在但索引缺失重新建立索引
元数据损坏.canvas.json 文件不可读尝试从索引恢复元数据

鼠标悬停在异常状态标签上会显示修复选项。你也可以在项目大厅中点击刷新按钮手动触发全量健康检查。


Diff 引擎的智能匹配

当 Agent 使用 apply_canvas_diff 时,底层的 Diff 引擎采用降级匹配策略

精确匹配 → 忽略末尾空格 → 完全忽略缩进 → 模糊匹配(≥85% 相似度)

这意味着 Agent 可以容忍代码中的缩进差异和空格变化,有效提高修改成功率。模糊匹配基于 Bigram Dice 系数,对行级别的相似度进行计算,首尾行还有额外加权。

Diff 操作会返回匹配策略和范围信息,让你了解匹配的准确度:

Applied diff to index.html [fuzzy matched (confidence: 92%)] at lines 15-22

常见高级问题

Q:Agent 操作被拒绝后文件会怎样?

Agent 的操作被拒绝后:

  • 修改已有文件:通过 Git checkout 恢复到修改前的状态
  • 新建文件:从磁盘物理删除
  • 多个连续操作:被拒绝的操作会尝试回滚,但建议在审批前仔细确认预览效果

如果误拒绝了正确修改,可通过编辑器重新手动修改。

Q:如何强制刷新健康检查?

在项目大厅中点击右上角的刷新按钮,触发全量健康检查。系统会重新扫描 AppData/canvases/projects/ 目录下的所有项目,更新索引和元数据。

Q:预览窗口能展示非 HTML 文件吗?

预览引擎默认加载入口文件(通常为 index.html)。如果需要预览其他类型的文件(如 SVG 或服务端渲染页面),你需要创建一个包装 HTML 文件来引用它们。

Released under the Apache-2.0 License.