JEPA4Japan · 教程
所有教程

课程

Canvas 精通之路

从一张转眼即忘的像素纸开始,逐步构建生产级无限画布编辑器,使它可重放、可测试、可访问、可迁移、可协作,并能安全地接受 AI 辅助修改。

模块
4 模块
课
18 课
预计时长
预计 72 小时
适合
适合: 掌握 HTML、CSS 和 TypeScript 基础,并希望精通生产级 Canvas 编辑器架构的前端工程师。
从第 1 课开始

先看清整条路,再去记 API

  1. 选择表面 决定谁负责渲染,谁负责编辑
  2. 保存记录 对象存在于文档之中
  3. 进行交互 输入经过几何系统与状态机
  4. 让它出错 有意注入贴近现实的故障
  5. 证明它 用测试和追踪完成验收
这门课程不是教你背诵绘图 API,而是逐章修复一个脆弱的编辑器,直到整个系统值得信赖。

五岁的孩子可以看懂一幅画,但生产系统必须回答更多问题。画里的东西叫什么?谁可以移动它们?崩溃后能否恢复?看不见画布的人还能操作它吗?十万个对象同时存在时,它为什么依然流畅?三个人和一个 AI 同时编辑时,究竟听谁的?

这门课程就从这些问题开始。每一章都会先给你一个能够装进脑海的玩具世界,让你可以预测将会发生什么。然后,我们才把这个玩具翻译成正式术语、TypeScript 接口、浏览器行为与测试证据。类比绝不能冒充事实:每一章都会明确指出类比在哪个位置失效。

你将构建什么

你会持续扩展同一个教学项目 Canvas Lab,最终把它变成一个具备以下能力的可视化操作画布:

始终分开这三个层次

  1. 文档 共享且持久的事实
  2. 会话 你设备上的工作状态
  3. 在线状态 来自当前在线成员的临时信号
文档是共享账簿,会话是你自己的背包,在线状态则像举起的一只手。它们拥有不同的生命周期和权限。

渲染同样有边界。DOM 保留文本编辑、语义和无障碍能力;Canvas 2D 驱动高频教学内核;只有基准测试证明存在收益时,GPU 渲染器才会加入。文档永远不依赖某一种渲染器,因此换一把画笔,无须把整本账簿撕掉重写。

每一章的学习循环

  1. **摆弄一个玩具:**通过具体对象、动作和结果,建立可预测的心智模型。
  2. **翻译它:**把每个玩具元素映射到工程概念,并标出类比的边界。
  3. **消灭一个误解:**用最小反例揭示一种只在演示中成立的直觉。
  4. **构建一项能力:**为 Canvas Lab 增加一项可运行、可测试的功能。
  5. **故意让它出错:**记录症状、日志或追踪、根因、修复方案与回归测试。
  6. **用证据验收:**能自动证明的就自动化;仍需人工验证的,则记录环境与验收标准。
  7. **把它讲给别人:**不用术语解释规则,并把它迁移到一个新场景。

开始之前

课程中的所有示例都使用严格模式的 TypeScript。你需要现代浏览器、Node.js 22、一个包管理器、浏览器开发者工具,以及能够运行单元测试和浏览器测试的终端。涉及 React、tldraw、WebGPU 或浏览器兼容性的章节,会固定具体版本或注明验证日期。与时间相关的结论必须根据官方文档重新核验。

你无须预先了解矩阵、空间索引、CRDT 或着色器。只要始终做到三件事:先预测,亲手让系统出错,再用证据解释为什么修复有效。

课程进度

课程大纲

已发布 18/18 课

第一部分:落笔之前先选画布——产品、像素与坐标

将无限画布的产品模型与渲染技术分开,再用统一坐标构建清晰、可重放的教学内核。

  1. 01 第 1 章:先别画——Canvas 不是产品架构 分别用 DOM、SVG、Canvas 和 GPU 方案渲染同一张业务图,并记录第一份渲染器选型 ADR。 已发布
  2. 02 第 2 章:一张会遗忘的像素纸 理解位图、CSS 像素、物理像素和 DPR,再构建一个既不重复订阅也不会丢失状态的 CanvasHost。 已发布
  3. 03 第 3 章:把绘制变成可重放的配方 以确定性的多阶段渲染器取代增量绘制,让它可以根据文档重建完整视图。 已发布
  4. 04 第 4 章:四张地图与一台相机 统一局部、父级、世界、视口和屏幕坐标,同时构建可逆相机、缩放、旋转与小地图。 已发布

第二部分:给像素世界装上大脑——模型、调度、输入与工具

让文档成为唯一事实来源,将 React 与高频引擎分开,并围绕规范化输入、几何查询和状态机组织交互。

  1. 05 第 5 章:给像素世界建立档案库 定义稳定 ID、场景图、形状/资产/绑定记录,以及独立于渲染器的领域适配器边界。 已发布
  2. 06 第 6 章:灯亮时才重绘——渲染调度与 React 边界 通过失效标记驱动渲染,并确保 React Strict Mode 下始终只有一个活动引擎、一组观察器与监听器,以及一个 rAF 循环。 已发布
  3. 07 第 7 章:鼠标、触控与触控笔说同一种语言 把指针、滚轮、键盘和手势输入转换成供工具层使用的规范化世界坐标事件。 已发布
  4. 08 第 8 章:检查边缘之前,先找到大盒子 构建独立于 Canvas 的 GeometryKernel,并组合宽阶段与窄阶段查询,实现精确命中测试。 已发布
  5. 09 第 9 章:工具是交通灯,不是一袋布尔值 用显式状态、守卫条件、取消、提交和命令实现选择、抓手、矩形、自由绘制与橡皮擦工具。 已发布

第三部分:从“能拖动”到“值得信赖”——交互、文字、资产与恢复

加入专业的交互手感、原生文本编辑、安全资产管线、时间旅行、迁移、测试、无障碍与可观测性。

  1. 10 第 10 章:让编辑器用起来顺手 实现多选、缩放、旋转、吸附、连接线、剪贴板、拖动复制和边缘滚动,并在每个缩放级别保持稳定阈值。 已发布
  2. 11 第 11 章:画出来的文字,不等于可编辑文字 让 Canvas 负责预览、DOM 负责编辑,并正确处理字体、换行、字素、双向文本、输入法、光标与选择区。 已发布
  3. 12 第 12 章:借来的图片不能毫无规矩地打包 设计覆盖上传、解码、CORS、源清洁性、SVG 净化、内存预算和多格式导出的资产协议。 已发布
  4. 13 第 13 章:时间机器与旧箱子 用事务实现撤销/重做,用验证和幂等迁移处理版本化数据,并将文档、会话与在线状态分离。 已发布
  5. 14 第 14 章:看起来正确,不代表真的正确 从模型、状态机、浏览器、视觉、无障碍、性能和生产遥测等层面验证 Canvas 编辑器。 已发布

第四部分:大师级决策——性能、Worker、GPU、SDK、协作与 AI

先用追踪找出瓶颈,再升级线程或渲染器;随后明确做出自研、采购、混合方案及协作协议的决策。

  1. 15 第 15 章:不要逐个搜索一万个孩子 建立可重复基准,衡量失效标记、剔除、空间索引、缓存、LOD 与内存限制带来的提升。 已发布
  2. 16 第 16 章:别让前台挤进厨房——Worker 与 GPU 升级 比较主线程 Canvas 2D、OffscreenCanvas Worker 和 GPU 原型,并处理乱序、背压、崩溃、设备丢失与降级。 已发布
  3. 17 第 17 章:自己造车,还是购买成熟底盘? 固定使用 tldraw 5.x 版本,在原生 Canvas、SVG、Konva、GPU、Three.js 与 tldraw 之间编写自研/采购/混合方案 ADR。 已发布
  4. 18 第 18 章:人与 AI 编辑同一本账簿 比较服务器权威同步与 CRDT,再将 AI 限制在经过验证、可预览、可撤销、可审计的类型化操作内。 已发布