Excalidraw:当手绘风遇上AI,技术文档的表达革命
你有没有过这样的经历?在写一份系统架构文档时,打开 Figma 或 Visio,调色板、对齐线、图层管理……还没开始画,就已经被工具的复杂性劝退。或者,在远程会议中想快速勾勒一个微服务调用流程,却因为协作延迟和权限问题卡住节奏。
这正是许多技术团队面临的现实困境:我们有强大的绘图工具,但它们太“完美”了——以至于让人不敢下笔。
而就在这类痛点日益凸显的背景下,Excalidraw悄然走红。它不像传统工具那样追求像素级精准,反而刻意“画歪一点”,用一种看似随意的手绘风格,打破了技术图表的冰冷感。更关键的是,随着 AI 的接入,它正从“白板”进化为“协作者”——一句话就能生成架构草图,多人实时共绘如同面对面交流。
这不是简单的界面美化,而是一场关于“如何更好地表达技术意图”的范式转变。
为什么是“手绘风”?
很多人第一次看到 Excalidraw 的图表,第一反应是:“这也能用?” 毕竟线条不直、矩形不方、箭头还带抖动,完全不像正式文档该有的样子。
但恰恰是这种“不完美”,成了它的最大优势。
Excalidraw 的手绘效果并非使用图片素材或滤镜实现,而是通过算法在 SVG 和 Canvas 上动态生成带有扰动的路径。比如画一条直线,它不会直接调用ctx.lineTo(),而是在线段上插入多个中间点,并对每个点施加轻微的随机偏移。这些偏移由伪随机种子控制,确保同一图形在不同设备上渲染结果一致——既保留了自然感,又保证了协作一致性。
function drawHandDrawnLine(ctx, startX, startY, endX, endY) { const points = []; const segments = 10; const randomness = 2; for (let i = 0; i <= segments; i++) { const t = i / segments; const x = lerp(startX, endX, t); const y = lerp(startY, endY, t); const offsetX = (Math.random() - 0.5) * randomness * 2; const offsetY = (Math.random() - 0.5) * randomness * 2; points.push({ x: x + offsetX, y: y + offsetY }); } ctx.beginPath(); ctx.moveTo(points[0].x, points[0].y); points.forEach(p => ctx.lineTo(p.x, p.y)); ctx.stroke(); } function lerp(a, b, t) { return a * (1 - t) + b * t; }这段代码虽然简化,却揭示了核心思想:把确定性的几何图形,变成带有可控噪声的过程。这种设计带来的不仅是视觉差异,更是心理上的解放——你知道这张图本就是草稿,所以修改起来毫无压力。
相比 Figma 或 Sketch 那种“一旦排版就怕动”的紧张感,Excalidraw 鼓励快速迭代。你在画 API 调用链时,可以先随手框几个服务,再拖动调整位置,甚至直接涂改文字。整个过程更像是在纸上思考,而不是在做“出版级设计”。
这也解释了为什么它特别适合早期技术讨论:当我们还在探索方案可行性时,真正需要的不是精美的 PPT,而是一个能跟上思维速度的表达工具。
实时协作,不只是“一起看”
如果说手绘风降低了个体创作门槛,那么实时协作机制则让团队知识流动了起来。
Excalidraw 的协作不是简单的“共享屏幕”,而是一个基于操作同步(Operation Synchronization)的分布式系统。每个用户的操作——无论是移动一个框、添加一段文字,还是删除一条连线——都会被打包成一个结构化的消息,通过 WebSocket 发送到服务端。
{ "type": "update", "elementId": "rect-123", "property": "position", "oldValue": { "x": 100, "y": 200 }, "newValue": { "x": 105, "y": 202 }, "clientId": "user-abc", "timestamp": 1712345678901 }这类消息体积小、语义明确,只传输变更本身而非整张图,极大节省了带宽。服务端收到后进行冲突合并(类似 OT 或 CRDT 思想),再广播给其他客户端。各端本地重放操作,保持视图同步。
最妙的是光标追踪功能。你能实时看到同事的鼠标在哪里停留、正在编辑哪个元素,甚至他们的输入框里打了什么字。这种“临场感”让远程协作不再是“轮流发言”,而更接近真实的白板讨论。
而且,整个协作模块是轻量耦合的。你可以私有部署excalidraw/excalidraw官方镜像,配合 JWT 认证和反向代理,轻松集成到企业内网环境中。这对于金融、政企等对数据合规要求高的场景尤为重要——毕竟没人愿意把核心架构图传到第三方云端。
AI 加持:从“画出来”到“说出来”
如果说手绘和协作解决了“怎么画”的问题,那 AI 功能则直接跳过了“画”这个动作。
现在你可以在命令面板输入:“画一个前后端分离的电商系统架构,包含用户认证、订单、支付和库存服务”,几秒钟后,一张结构清晰的草图就会出现在画布上。
背后的技术路径很典型:前端将自然语言发送到后端,后者调用大语言模型(如 GPT-4 或本地部署的 Llama 3),引导其输出符合 Excalidraw 数据结构的 JSON:
import openai import json def generate_diagram_prompt(description: str) -> dict: prompt = f""" 你是一个专业的技术架构师,请根据以下描述生成一个 Excalidraw 兼容的图形结构。 输出必须是 JSON 格式,包含 elements 数组,每个元素有 type, x, y, width, height, label 字段。 描述:{description} 示例输出: {{ "elements": [ {{ "type": "rectangle", "x": 100, "y": 100, "width": 120, "height": 60, "label": "前端" }}, {{ "type": "rectangle", "x": 300, "y": 100, "width": 120, "height": 60, "label": "后端" }}, {{ "type": "arrow", "x": 220, "y": 130, "start": "前端", "end": "后端", "label": "HTTP 请求" }} ] }} """ response = openai.ChatCompletion.create( model="gpt-4", messages=[{"role": "user", "content": prompt}], temperature=0.5 ) try: result = json.loads(response.choices[0].message.content) return result except json.JSONDecodeError: raise ValueError("LLM 返回内容无法解析为 JSON")这个脚本看似简单,实则蕴含工程智慧:通过精心设计的 Prompt 约束输出格式,避免模型“自由发挥”;返回的 JSON 可直接被前端消费,批量创建元素;再加上缓存与错误重试机制,就能构建稳定可用的 AI 图形生成服务。
更重要的是,AI 生成的内容不是终点,而是起点。它提供了一个高质量的初稿框架,团队成员可以在此基础上补充细节、调整布局、添加注释。对于新人来说,这意味着他们不再需要从零理解整个系统,而是可以直接在一个已有结构上“填空”。
落地实践:如何融入技术工作流?
在实际项目中,Excalidraw 往往不是孤立存在的,而是作为技术文档生态的一部分嵌入现有体系。
架构示意图
graph LR A[Confluence/Notion] --> B[Excalidraw Server] B --> C{Clients} C --> D[Web Browser] C --> E[Desktop App] B --> F[LLM Gateway] style B fill:#f9f,stroke:#333 style F fill:#bbf,stroke:#333如上图所示,Excalidraw 可以通过 iframe 嵌入 Confluence 页面,也可以独立部署为企业内部的知识协作平台。AI 模块则可通过反向代理连接内部 LLM 网关,在保障数据安全的前提下实现智能生图。
典型工作流
以撰写《订单系统架构设计文档》为例:
1. 打开 Excalidraw 白板;
2. 输入 Prompt 自动生成微服务拓扑;
3. 团队成员加入,实时标注数据库类型、通信协议等细节;
4. 导出 PNG/SVG 插入正式文档;
5. 保存链接供后续迭代更新。
整个过程实现了“构思→表达→协作→归档”的闭环。更重要的是,文档中的图表不再是静态快照,而是一个可追溯、可持续演进的活对象。
使用建议:别让便利变成依赖
尽管功能强大,但在实践中仍需注意一些边界问题:
- 命名规范很重要:给白板起个清晰的名字,比如“订单系统-v2-评审中”,避免后期难以查找。
- 复杂系统要分层:不要试图在一屏内画完所有内容。建议按网络层、数据流、状态机等维度拆分子图。
- 手动保存关键节点:虽然有自动快照,但重要决策时刻最好手动存档,防止误操作。
- AI 输出需人工校验:LLM 可能会“幻觉”出不存在的服务或错误的依赖关系,务必由领域专家复核逻辑正确性。
写在最后
Excalidraw 的流行,本质上反映了一种趋势:技术表达正在从“展示成果”转向“呈现思考过程”。
我们不再追求每张图都像出版物一样完美,而是希望它能真实记录下那些尚未定型的想法、反复修改的痕迹、以及多人碰撞出的灵感火花。手绘风提供了心理安全感,实时协作加速了共识形成,而 AI 则把我们从机械劳动中解放出来,专注于更高层次的设计决策。
当你下次面对空白文档感到无从下手时,不妨试试换一种方式:打开 Excalidraw,敲一句“帮我画个登录流程”,然后在这个自动生成的草图上,开始你的技术叙事。
或许,未来的优秀工程师,不仅懂代码、懂架构,还会熟练运用工具,把自己的思考“可视化”出来——不是为了炫耀精致,而是为了让别人真正看懂你在想什么。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考