likec4 布局引擎 likec4/layouts 深度解析Graphviz 编排、动态视图流程控制与 AI 语义布局【免费下载链接】likec4Visualize, collaborate, and evolve the software architecture with always actual and live diagrams from your code项目地址: https://gitcode.com/GitHub_Trending/li/likec4likec4/layouts是 LikeC4 项目负责把计算好的视图变成最终坐标的布局引擎包它以 GraphvizWASM为核心后端把各类视图翻译为 DOT 再解析回带坐标的图数据。本文基于 packages/layouts/CHANGELOG.md 的版本演进脉络结合仓库源码系统讲解布局引擎的架构管线、并发队列、v1.59.0 引入的动态视图流程控制块alt/opt/loop/try等、v1.57.0 的 AI 辅助语义布局以及 v1.48.0 的图标定制能力帮助你理解并正确使用这套布局能力。模块定位likec4/layouts 在 LikeC4 中负责什么包自身的 README 只有一句话但信息量很足Layout algorithms for views. At the moment, delegates to Graphviz WASM (hpcc-js-wasm).也就是说该包不重新发明布局算法而是把 LikeC4 的各类视图元素视图、部署视图、动态视图、项目总览视图翻译成 Graphviz 的 DOT 图描述交给 Graphviz 求解再把求解结果解析回 LikeC4 自己的DiagramView数据结构。从 package.json 可以看到它的对外导出面导出子路径用途.主入口GraphvizLayouter、QueueGraphvizLayoter、GraphvizWasmAdapter及类型./sequence序列图动态视图独立布局算法./graphviz/binaryGraphviz 二进制适配器GraphvizBinaryAdapter./aiAI 布局提示的 LLM 输入输出与增强管道依赖上除了hpcc-js/wasm-graphvizWASM 版 Graphviz、ts-graphvizDOT 建模之外还引入了lume/kiwiCassowary 约束求解器用于序列图布局、p-queue/p-limit并发队列、zodAI 输出解析校验等。核心架构视图 → DOT → Graphviz → 布局结果GraphvizPort与后端解耦的端口抽象GraphvizLayoter.ts 定义了GraphvizPort接口它是布局引擎与具体 Graphviz 后端之间的抽象层方法说明unflatten(dot)对 DOT 做解平铺后处理改善纵横比与边排布对应 graphviz 的unflatten工具acyclic(dot)移除图中的环返回无环 DOTlayoutJson(dot)执行布局返回 Graphviz 的 JSON 形式结果svg(dot)直接产出 SVG 渲染结果dispose()释放后端资源GraphvizLayouter构造函数默认使用new GraphvizWasmAdapter()作为端口也可以通过changePort()在运行时切换后端例如替换为二进制 Graphviz 适配器见 binary/GraphvizBinaryAdapter.ts。GraphvizWasmAdapter默认 WASM 后端的两处工程细节GraphvizWasmAdapter.ts 中两处实现细节值得注意并发限制为 1concurrency恒为1且用p-limit(1)串行化所有调用避免 WASM 实例并发加载问题源码注释原文limit to 1 concurrency to avoid wasm loading issues。内存保护每执行 20 次操作后主动Graphviz.unload()并重新加载规避 WASM 长驻内存问题失败时非语法错误会卸载实例并随机延迟 30–300ms 后自动重试一次语法错误则直接抛出。按视图类型选择 PrintergetPrinterGraphvizLayoter.ts根据视图类型分派不同的 DOT 打印机动态视图 →DynamicViewPrinter部署视图 →DeploymentViewPrinter元素视图 →ElementViewPrinter项目总览 →ProjectsViewPrinter独立方法layoutProjectsView每个 Printer 都继承自DotPrinter负责把 LikeC4 的节点、容器compound、关系edge及主题样式翻译成 DOT 属性。快照目录snapshots中存放了ElementViewPrinter-*.dot、DeploymentViewPrinter-index.dot、ProjectsViewPrinter-*.dot等真实输出是理解各 Printer 行为的直接证据。完整布局管线GraphvizLayouter.layout()GraphvizLayoter.ts的执行链路为由 Printer 生成 DOT 源对元素视图额外执行unflatten失败仅告警不中断通过dotToJson()调用graphviz.layoutJson(dot)得到 JSONparseGraphvizJson(json, view)把 JSON 解析回DiagramView若结果是动态视图额外执行calcSequenceLayout(diagram)计算序列图布局合并进sequenceLayout字段对应LayoutedDynamicView。printToDot()则提供只出 DOT 不求解的调试能力且接受可选的AILayoutHints——一旦传入 hints就会改用AiLayoutViewPrinter输出受提示影响的 DOT。并发控制QueueGraphvizLayoter 与批处理QueueGraphvizLayoter.ts 在GraphvizLayouter之上叠加了p-queue队列构造参数如下参数默认值说明concurrency跟随graphvizPort.concurrencyWASM 为 1并发上限最小 1timeout20_000毫秒单个操作超时throwOnTimeouttrue超时是否视为异常它重写了layout/layoutProjectsView所有任务都进入队列串行执行切换端口时还会同步队列并发数。batchLayout()面向一次性布局整组视图的场景支持cancelToken取消令牌批次等待或逐任务调度期间可随时中止onSuccess/onError逐任务回调批处理互斥若已有批次在处理后续批次会等待其onIdle后再递归重试防止批次并发背压机制waitForQueueToShrink队列积压超过concurrency 2时等待收缩再继续提交避免 WASM 端一次性堆积过多任务。动态视图流程控制块v1.59.0 核心新增v1.59.0PR #3084是 CHANGELOG 中内容最重的一次变更动态视图的流程控制。此前动态视图的步骤只能平行展开parallel现在可以把步骤分组为带可选标题的流程块opt、loop、break块altwhen/else分支try/catch/finally块CHANGELOG 给出的完整 DSL 示例dynamic view example { customer - app opens app alt { when authorized { app - api requests data } else not authorized { app - customer shows login } } }渲染与交互行为序列图渲染这些块在序列图中渲染为嵌套的 frame嵌套框并且放大zoom时参与方actor保持可见修复了 issue #3074Sequence Outline 面板走查walkthrough过程中停靠的 Sequence Outline 面板把流程展示为一棵与块嵌套结构一致的可折叠树——每个步骤带编号每个操作符带彩色类型标签与步骤计数可点击跳转到任意步骤。底层实现在 DOT 侧DynamicViewPrinter.ts 的postBuild()会删除TBbalance并设置orderingin保证步骤按输入顺序从上到下排布边标签带步骤号stepEdgeLabel回退方向edge.dir back或重复出现的目标节点会设置minlen0削弱 rank 约束。在序列图侧sequence/layouter.ts 的SequenceViewLayouter使用lume/kiwi约束求解器Cassowary 算法建模actor 框、行inner/outer 双层边界、compound 区域与 subflow 区域全部编译为线性约束并通过Strengthrequired/strong/medium/soft/weak分级求解求解器maxIterations提高到 2000 以容纳复杂流程的约束规模。折叠的 subflow 会把其覆盖的行高度置 0 并标记collapsed供渲染侧隐藏细节。实验性声明与已解决问题CHANGELOG 明确标注Flow control blocks are experimental — syntax and rendering may change并邀请用户在 discussions 中反馈。本次变更同时解决 #2745、#2993、#3074 三个 issue。AI 辅助语义布局v1.57.0 实验性v1.57.0 引入实验性的AI 布局顾问让 LLM 分析图的语义给出 graphviz 布局提示rank 约束、边权重、不可见边从而让布局更可读、视觉更均衡。工作管道enhanceLayoutWithAI.ts 完整实现了四段式管道prepareLLMInput(view)把视图序列化为 JSON并建立 NodeId/EdgeId 到完整节点/边数据的映射组装 system promptprompt-system.md生成与 user promptprovider.sendRequest(...)通过AILayoutProvider接口调用 LLM该接口由 VSCode 扩展基于vscode.lmAPI 实现或由直接 API 提供商实现包内刻意不依赖 VSCodeparseOutput(...)解析 LLM 返回的 JSON 为AILayoutHints。关键设计是失败即降级任何异常都只记录warn并返回undefined布局回落到普通 Graphviz——AI 增强永远不会阻断出图。布局侧则由GraphvizLayouter.aiLayout()配合AiLayoutViewPrinterAiLayoutPrinter.ts把 hints 写入 DOT。AILayoutHints 结构ai/types.ts 定义了 LLM 必须产出的 JSON 结构字段取值/含义direction整体方向TB/BT/LR/RLranks批量指定节点组处于same/source/sink/min/max层edgeWeight按 EdgeId 覆盖边权重牵引力edgeMinlen按 EdgeId 覆盖最小层距reverseRank反转这些边在 rank 中的方向打破环、交换源/目标层序excludeFromRanking这些边不参与排名等价于 Graphvizconstraintfalse边仍可见edgeOrder建议的边输出顺序影响边路由nodeOrder建议的节点输出顺序影响节点排布invisibleEdges由 AI 添加的不可见边source/target可选weight/minlen用于微调层序reasoningLLM 的推理说明供调试与展示提示词规则要点ai/prompt-system.md 是注入 LLM 的约束规范核心规则包括minlen控制在 0–40 不增层只定层内顺序weight控制在 1–10强调的边用 6–10reverseRank不改语义只改层序excludeFromRanking对应constraintfalse不可见边与普通边同等影响 rank。VSCode 侧通过 chat participant 与命令触发 AI 布局增强能力入口见 packages/vscode 的 chat 集成。元素图标定制v1.48.0v1.48.0 为元素样式增加了图标定制项iconColor图标颜色iconSize图标尺寸iconPosition图标位置支持left/right/top/bottom。底层上packages/core/src/styles/types.ts 定义了iconPosition?: IconPosition与iconSizes映射表packages/core/src/styles/LikeC4Styles.ts 的iconSize()方法会把枚举尺寸解析为主题中的具体像素值缺省时回落到defaults.size。这些样式属性最终由各 Printer 写入 DOT 节点属性从而同时作用于布局与渲染。演进与清理ManualLayoutV1 移除v1.52.0v1.52.0PR #2713移除了已废弃的 ManualLayoutV1 及配套迁移命令。这意味着手动画布布局的旧一代格式不再被支持新项目应使用当前的 manual-layout 机制核心实现在 packages/core/src/manual-layout避免依赖 V1 格式的迁移路径。版本节奏与依赖同步CHANGELOG 覆盖 1.46.2 → 1.59.3 的版本历史其中绝大多数为 Patch且每次都同步跟随likec4/core与likec4/log升版当前 1.59.3 依赖likec4/core1.59.3、likec4/log1.59.3。布局引擎与核心数据模型、日志模块保持严格同版发布升级时建议三个包一起升。除依赖同步外的实质变更仅有1.59.0流程控制、1.57.0AI 布局、1.52.0移除 ManualLayoutV1、1.48.0图标定制。测试与验证包内测试覆盖了各 Printer 与 WASM 适配器可作为深入源码的入口wasm/GraphvizWasmAdapter.spec.ts 及对应 快照ElementViewPrinter.spec.ts、DeploymentViewPrinter.spec.ts、ProjectsViewPrinter.spec.ts 分别校验三类视图的 DOT 输出sequence/utils.spec.ts 覆盖序列图工具函数graphviz/fixtures提供模型与视图快照样例。仓库内还留有真实用法示例例如 examples/rank-for-better-layout/demo-rank-for-better-layout.c4 演示通过 rank 技巧改善布局的可写写法。小结likec4/layouts的演进史勾勒出一条清晰的路线先以 Graphviz WASM 为后端解决能布局1.46–1.52 的依赖同步与清理再通过流程控制块1.59.0与 AI 布局顾问1.57.0把动态视图与智能排布推向布得更好。理解GraphvizLayouter→QueueGraphvizLayoter→ 各Printer→GraphvizPort的层次结构是二次开发或排查布局问题的最短路径而AILayoutHints的 JSON 结构则是接入自定义 AI 布局服务时的契约核心。【免费下载链接】likec4Visualize, collaborate, and evolve the software architecture with always actual and live diagrams from your code项目地址: https://gitcode.com/GitHub_Trending/li/likec4创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考