用代码定义架构图:diagram-design 的设计与落地实践
有没有遇到过这种场景方案评审会上四五个人嘴里各自长出一张完全不同的架构图。产品说数据先到网关再进服务前端说页面渲染依赖三个接口后端一直强调他心里的那条调用链。没人说得清到底谁对因为根本没有一张所有人都能看同一版本的图。我后来在团队里做了个内部项目名字就叫 diagram-design。它做的事情很简单把架构图、流程图、状态机这类图形从手工拖拽画布改成用结构化代码定义、再用渲染引擎自动生成。这篇文章就把 diagram-design 从设计到落地的完整思路、关键取舍和踩过的坑记录下来希望能给正在纠结“图怎么画、怎么维护、怎么和代码同步”的人一些参考。1. 为什么我最终选择用代码定义图表1.1 手动画图的三个隐性成本很多人觉得画架构图不就是拖几个框、拉几条线吗能有多难。真在项目里长期维护过的人会明白手工拖拽的成本不在“画出来的那一刻”而在后续所有的修改、对齐、评审和交接。第一个成本是版本不可控。文件放在本地改了没存就丢失传到聊天工具里又被另一个人改一版再传回来。同一张架构图一天之后会出现三四个版本没人知道哪个是最新的。第二个成本是修改成本加一个中间件需要手动调整所有相关连线拖完框还得重新对齐稍微复杂一点的图一次修改能花掉半小时。第三个成本是评审效率低图里的信息全靠画图人心里默认看的人只能靠猜节点之间的依赖关系、请求流向、失败路径这些关键信息在图上经常是缺失的。diagram-design 本质上是在解决这三个成本。它把图的定义变成了一段结构化描述图和代码存放在一起每一次修改都有记录评审时可以对着原始定义逐条讨论。图的生成完全由程序完成不涉及手工对齐。1.2 diagram-design 的定位我给它定的定位是“面向开发者的轻量图表定义与渲染方案”不是又一个大型绘图软件。它只解决一件事把静态的、结构化的图做成可持续维护的产物。做成这一件事需要三个能力第一声明式定义用户用 JSON 或 YAML 描述节点、连线、分组关系不关心坐标第二自动布局程序根据关系自动计算节点位置保证尽量不重叠、不交叉第三多端渲染生成结果既能嵌入网页也能导出成图片放进文档和幻灯片里。这个定位明确之后很多设计决策就顺理成章了。我没有去实现复杂的自由画布、画笔工具也不需要模拟纸张上的随意手绘效果所有能力都围绕“结构化图形”来组织。后来团队里有人用它来描述定时任务流程图有人用它画系统模块关系图还有人把部署拓扑图写成了配置效果都超出预期。2. 核心数据模型一次选对就少改半年2.1 节点、连线、分组三件套diagram-design 的数据模型最核心的部分就是三个概念节点、连线和分组。节点是图里的基本元素对应真实世界里的服务、模块、步骤或状态。连线表达节点之间的关联可以带方向也可以不带方向。分组则表达“这些节点属于同一个逻辑区域”比如同一个子网、同一个模块、同一个泳道。这三个概念的划分我纠结过很长一段时间。最初考虑过增加“端口”“锚点”“子图”这些概念后来发现没必要。把节点、连线、分组设计成三种独立的基础元素用户可以组合出绝大多数场景。端口属于节点的增强属性子图其实就是分组加内部布局基础概念越少学习和排错成本越低。数据格式上我采用了嵌套结构分组可以包含分组节点可以挂在任意分组下。连线不直接挂在分组里而是通过两端的节点 ID 隐式归属这样计算布局时会简单很多。2.2 端口从“点对点连线”到“结构清晰”实际项目里经常出现一个服务对接多个服务的情况如果所有连线都从节点中心点出发图上会变成一堆乱线。为了让连线的起点和终点落在节点边界的具体位置我给节点增加了端口的概念。端口就是节点上可连线的位置。比如一个数据库节点可以把“读写连接”的端口放在上边界把“备份连接”的端口放在下边界。连线必须引用端口的 ID布局引擎根据端口位置计算连线的起终点坐标。这个设计的收益在规模大的时候非常明显。某次画一个包含三十多个服务的调用关系图如果没有端口系统连中心点会乱成一团有了端口之后同一类连线可以自动归到节点的同一边阅读体验完全不同。2.3 数据模型与 JSON Schema整个模型我用 JSON 承载对外暴露的格式大致是这个样子{ nodes: [ { id: gateway, label: 网关服务, group: proxy }, { id: user-svc, label: 用户服务, group: backend }, { id: order-svc, label: 订单服务, group: backend } ], edges: [ { source: gateway, target: user-svc, label: HTTP, bidi: true }, { source: gateway, target: order-svc, label: HTTP, bidi: true } ], groups: [ { id: proxy, label: 接入层 }, { id: backend, label: 业务层 } ] }每个节点最少需要 id 和 label连线最少需要 source 和 target分组最少需要 id 和 label。这个 Schema 看起来简单但支撑了一个重要能力数据可以来自任何地方。手写者直接维护 JSON有代码基础可以从接口动态生成甚至可以从配置中心读取只要最终输出符合 Schema 即可。我当时特意写了格式校验器任何非法数据在渲染前都会被拦截带着清晰的错误信息提示具体缺少哪个字段。这一点在多人协作时特别重要避免一个人写错导致所有人出图失败。3. 布局、渲染与交互的关键取舍3.1 布局分层、力导向还是手写规则自动布局是 diagram-design 里最难也最值得投入的部分。布局决定了一张图最终长什么样也决定了用户是否愿意继续用。我实际用到的布局策略有三种各有各的使用场景布局策略适合场景典型表现分层布局流程、管道、层级依赖上下分层边尽量向下或向右力导向布局关系网络、集群结构节点自动散开连线最短化固定坐标布局拓扑图、地图、手动精排数据里直接给坐标程序不干预分层布局是最常用的。它要求数据里不能有环如果有环要先做环检测把环内的节点单独处理。力导向布局适合拿给关系型数据用但结果稳定性一般同一个数据每次生成的位置可能不同我不太推荐用在需要长期维护的正式文档中。固定坐标布局则需要数据提供坐标字段适合完全手工控制的需求。diagram-design 默认先走分层布局检测到有环时自动降级或提示。布局算法内部按“源点数量优先”的原则排序同一层内部再按序号排列尽量减少连线跨越两个层以上这一步对最终视觉效果影响很大。3.2 渲染SVG为主Canvas为辅的理由图形渲染可以选的技术路线很多我最后确定的原则是默认用 SVG 渲染只有图特别大时才切到 Canvas两者共用同一份布局数据。选择 SVG 的理由很实际。第一矢量输出导出到任何分辨率都清晰第二每个节点和连线都是独立的 DOM 元素天然支持点击、悬浮、右键菜单这些交互能力不需要额外做命中测试第三CSS 可以直接控制样式主题切换非常容易。Canvas 对我而言只是兜底方案。节点超过一千个时SVG 的 DOM 数量会让页面明显卡顿Canvas 绘制则几乎没有这种压力。但 Canvas 的代价是交互和样式控制都得手写开发成本高出一截。我在项目里做了一个阈值开关默认节点数量超过八百时建议切 Canvas其余情况下全走 SVG。3.3 交互拖拽、缩放和选中考虑到使用场景大多是文档、评审和开发辅助交互不需要做得太重但拖拽、缩放、选中这三件事必须有。拖拽分成两种模式。第一种是自由拖拽用户可以在最终渲染结果上手动微调某个节点的位置拖完之后把新坐标回写进数据层。第二种是吸附拖拽在流程图场景里会猜测用户想把当前节点放到哪个分组并提供对齐辅助线。缩放我用的是以视口中心点为基准的缩放方式滚轮向上放大向下缩小。缩放到较小时自动隐藏节点里的文字只保留边框避免视觉噪音。选中节点时右侧会显示属性面板可以直接改名称、颜色、所属分组改完重新布局并渲染。这套交互做完之后我发现它变成了一个“半自动工具”初始布局靠程序精细调整靠人工。两者互相补充使用体验比纯自动或纯手绘都顺。3.4 导出SVG、PNG 和嵌入场景图最终要被人看所以导出能力不能将就。diagram-design 导出支持三种格式分别对应不同场景。SVG 导出最简单直接把渲染时生成的 SVG 字符串序列化下来。它保留所有图层和文字适合后续在专业工具里继续编辑。PNG 导出需要把 SVG 画到离屏 canvas 上再转成 PNG 像素数据这里要特别注意跨域字体问题后面第五节我会专门讲。第三种是 HTML 片段导出把图和一份内联样式打包成一个片段可以直接嵌进文档站或者内部维基页面。我在实际使用中发现导出 PNG 的默认尺寸和文档布局经常不匹配所以额外加了一个“适应内容”选项让程序根据节点边界自动裁剪画布只保留有效区域避免导出一张四周大片空白的图。4. 实操手写一个最小可用的核心流程4.1 定义一份极简数据文件如果完全从零实现最核心的流程其实由三部分组成解析数据、计算布局、渲染输出。我们先拿一个最简单的部署关系来走一遍。新建一个deploy.json内容如下{ groups: [ { id: edge, label: 边缘层 }, { id: core, label: 核心层 } ], nodes: [ { id: lb, label: 负载均衡, group: edge }, { id: app-1, label: 应用实例1, group: core }, { id: app-2, label: 应用实例2, group: core }, { id: db, label: 主数据库, group: core } ], edges: [ { source: lb, target: app-1 }, { source: lb, target: app-2 }, { source: app-1, target: db }, { source: app-2, target: db } ] }这份数据描述的是“负载均衡把请求分发给两个应用实例两个实例共用一个数据库”。先不手动指定任何坐标让布局引擎来算。4.2 用拓扑排序实现分层布局最简单的布局逻辑可以从拓扑排序开始。我先把节点按依赖关系分层没有任何入边的节点排在第一层随后移除这些节点后、再次没有入边的节点排在第二层依此类推。以下是示意代码用 TypeScript 风格写核心思路interface NodeData { id: string; label: string; group?: string; } interface EdgeData { source: string; target: string; } function layering(nodes: NodeData[], edges: EdgeData[]): string[][] { const indegree new Mapstring, number(); const adjacency new Mapstring, string[](); for (const node of nodes) { indegree.set(node.id, 0); adjacency.set(node.id, []); } for (const edge of edges) { indegree.set(edge.target, (indegree.get(edge.target) || 0) 1); adjacency.get(edge.source)!.push(edge.target); } const layers: string[][] []; let queue nodes .filter((node) indegree.get(node.id) 0) .map((node) node.id); while (queue.length 0) { layers.push(queue); const nextQueue: string[] []; for (const id of queue) { for (const nextId of adjacency.get(id) || []) { indegree.set(nextId, (indegree.get(nextId) || 0) - 1); if (indegree.get(nextId) 0) nextQueue.push(nextId); } } queue nextQueue; } return layers; }这个算法拿到数据后会得到两层第一层是[lb]第二层是[app-1, app-2]第三层是[db]。有了层号之后再按同一层内节点的先后顺序分配纵向坐标横向坐标则简单按“层数乘以固定间距”计算一张基础的分层图就出来了。这只是一个最小实现。真正生产环境中还需要考虑同一层内部如何排序、跨层边如何减少交叉、节点宽度不同时坐标如何校正。但拓扑分层是往后所有布局优化的地基先把地基打通最重要。4.3 生成 SVG 并渲染到页面布局计算完成之后每个节点都拥有了候选坐标。接下来要做的是把节点、连线和分组转成 SVG 元素。function renderSvg(layers: string[][], nodes: NodeData[]): string { const yGap 80; const xGap 200; const nodeHeight 40; const nodeWidth 140; const parts: string[] []; layers.forEach((layerIds, layerIndex) { layerIds.forEach((id, itemIndex) { const x 40 itemIndex * xGap; const y 40 layerIndex * yGap; const node nodes.find((n) n.id id)!; parts.push( rect x${x} y${y} width${nodeWidth} height${nodeHeight} rx6 / ); parts.push( text x${x nodeWidth / 2} y${y nodeHeight / 2} text-anchormiddle${node.label}/text ); }); }); return svg xmlnshttp://www.w3.org/2000/svg width800 height400${parts.join()}/svg; }这个函数把节点渲染成圆角矩形加居中文字。连线部分同样根据 source 和 target 找到两端节点坐标画一条带箭头的路径。把返回的 SVG 字符串插入到页面的某个容器节点中第一版 diagram-design 就活了。渲染时要注意一个细节文字应该用dy属性做垂直居中微调而不是直接依赖text-anchor。我在初版时没做这个调整文字在梯形盒子里总偏上一点后来统一加了dy0.35em才解决。4.4 和真实项目的集成方式最小流程跑通之后就要考虑怎么真正嵌到项目里用。我建议把它封装成一个独立包提供两个入口方法parse(config)和render(config)。parse负责把 JSON 转换成内部模型做格式检查、补充默认值、构建索引。render接收内部模型执行布局和渲染。两者分离的好处是方便写单元测试也可以单独提供命令行工具在 CI 流程里自动生成文档图片。集成到文档站时我是把渲染结果输出成 HTML 片段再嵌入页面。集成到 React 页面时则封装了一个轻量组件内部管理数据和重新渲染逻辑。整体代码量其实不大但架构边界一旦明确后面的迭代会轻松很多。5. 我踩过的坑问题与排查实录5.1 节点重叠和连线交叉第一个遇到的经典问题就是节点重叠。同一个分组里有三个节点它们的标签长度不同如果按照统一宽度计算坐标短标签节点之间会空出大块空白长标签节点又会溢出边界。我的解决方案是布局前先做一次“预测量”根据文字长度动态计算每个节点的实际宽度。计算宽度时不能用节点的 name 字段长度直接乘固定字号因为中文字符和英文字符宽度不一样我最后用的办法是 Canvas 测量字符串实际渲染宽度加 padding 后作为节点宽度。这个改进直接消除了绝大部分重叠问题。连线交叉则复杂一些。第一版布局把同一层节点从左到右按输入顺序排列跨层连线很多都是交叉的。后来我增加了一个“同层内按目标节点的实际顺序排序”的策略让大多数边尽量右向或下向交叉线数量明显下降。对于无法完全消除的交叉我只能退一步允许用户手动拖动节点位置覆盖计算结果。5.2 自动换行与中文字符宽度如果节点的 label 很长自动换行必须做。只做简单截断会导致信息丢失全部换行又会撑高节点影响整体布局。我在渲染文字时做了两件事。第一计算字符串的累计像素宽度超过节点可用宽度的字符在最近的空间处换行。第二限制最大行数超过四行后显示省略号并把未展示的完整内容放在节点的 title 属性里鼠标悬停可以查看。这里最容易踩的坑是中文标点和英文字母的换行规则不同。中文文本每个字符宽度基本一致按字数换行即可英文单词不能随意拆开需要按空格切词。我当时的兜底方案是优先按空格切没有空格的中文则按字符宽度切实现起来简单对绝大多数标签都够用。5.3 大图性能与虚拟化当图中节点超过五百个之后SVG 的性能问题开始暴露拖拽卡顿、缩放迟钝。一开始我以为是渲染框架的问题后来定位到瓶颈在布局计算上。原因在于我的布局算法里有一处嵌套循环每次重新布局都要遍历所有节点和连线而节点坐标更新又会触发重渲染。优化方式很简单把布局计算拆成两阶段第一阶段全量计算只在数据变化时执行第二阶段增量计算只在拖拽节点时执行只更新受影响的相邻节点。此外我还做了渲染层的虚拟化。视口外的节点和连线不生成 SVG 元素等滚动或缩放进入可视区域时再补充创建。实测节点从五百增长到一千时性能基本还能保持稳定流畅。5.4 多人协作时的版本冲突项目里引入了 git 管理 JSON 数据文件之后版本冲突成为新问题。两个人同时编辑同一个架构图配置合并时经常出现整段冲突。我的经验是不要让人直接手写完整 JSON而是提供两步操作第一提供可视化编辑器所有修改都通过代码内部模型完成第二在生成 JSON 时对键名做稳定排序尽量保证相同逻辑的修改产生相同文本减少合并冲突面。另外非常重要的一点是给每个节点和连线分配固定的 UUID而不是用服务名当 ID。服务改名很常见如果用服务名当 ID一次改名会导致所有相关连线失效用 UUID 则只需修改 label 字段关系不会断。5.5 导出遇到字体丢失导出 PNG 时最容易出现的问题是字体丢失。浏览器页面里能正常显示的中文字体到了 canvas 离屏渲染时可能变成方框或乱码。排错的思路是先确认字体文件是否成功加载。如果字体是异步加载的需要在document.fonts.ready完成之后再执行导出。如果字体来自跨域资源还要额外设置字体资源的响应头允许跨域读取。我刚开始频繁遇到这个问题后来干脆在导出前主动检测document.fonts.status如果未加载完成就弹一个加载状态提示加载完成后再走导出的 canvas 绘制流程。这才是真正稳妥的方案。6. 一点经验之谈如果让我重新做一遍 diagram-design我会在第一天就把“数据模型优先”写进原则里。很多看似炫酷的功能都是需求驱动的而一个简洁、稳定、可扩展的数据模型才是功能做得快的底气。项目做久了会发现图的布局算法可以换渲染方式可以换但节点、连线、分组这套“元语”一直没有变过它成了整个项目最稳固的地基。对于想在自己的项目里引入类似方案的人我建议从最简单的分层布局开始不要一上来就追求力导向和复杂的美化效果。先用一份 JSON、一个 SVG 渲染函数跑通全流程把“定义到出图”的最小链路打通再逐步迭代布局优化和交互体验。方向对了速度慢一点没关系。最后分享一个小技巧除非你的图完全只是展示用否则一定要保留“用户手动微调坐标”的出口。纯自动布局可以帮助解决 80% 的常规问题但剩下 20% 的视觉强迫症还是需要给人一只自由的手。

相关新闻

提示工程架构师:从混乱到可控的研发流程管理策略

提示工程架构师:从混乱到可控的研发流程管理策略

先说一个我经常看到的场景:某团队的提示词需求文档写了三版,线上生效的却是第一版;A同学辛苦调好的few-shot样例,被B同学无意覆盖;评测结果每个人各存一版,最后谁也不知道哪个效果更好。这种混乱&#xff0…

2026/10/17 8:44:25 阅读更多 →
多步推理搜索时代:如何让内容成为AI答案的关键拼图

多步推理搜索时代:如何让内容成为AI答案的关键拼图

多步推理搜索这个说法,最近在AI内容圈子里出现的频率越来越高。简单来说,当用户向AI提出一个复杂问题时,AI并不会只搜索一次、匹配一个网页,而是会把问题拆解成多个子问题,一步步检索、交叉验证,最后把不同…

2026/10/17 8:44:25 阅读更多 →
SpringBoot+Vue美食烹饪互动平台:全栈实战与答辩指南

SpringBoot+Vue美食烹饪互动平台:全栈实战与答辩指南

做毕设选型的时候,我见过太多人一上来就扎进"管理系统增删改查"的老套路,结果答辩时老师随便问一句"你的项目解决了什么真实问题",就卡住了。相比之下,SpringBootVue做美食烹饪互动平台这个方向,天…

2026/10/17 8:44:25 阅读更多 →

最新新闻

macOS上用Docker部署nginx+php:从零搭建容器化开发环境

macOS上用Docker部署nginx+php:从零搭建容器化开发环境

你在macOS上装过nginx和php吗?如果装过,大概率体会过那种“装起来半小时、调起来一晚上”的滋味。今天这篇我就带你完整走一遍macOS上安装Docker,然后在Docker里部署一套nginxphp环境的过程,整个过程不追求什么高大上的编排技巧&a…

2026/10/17 9:26:37 阅读更多 →
XSS跨站脚本攻击详解:原理、类型与防御实战指南

XSS跨站脚本攻击详解:原理、类型与防御实战指南

聊起 XSS 跨站脚本攻击,很多刚入行的朋友第一反应是“这不就是往页面里插一段 JS 嘛,有什么好学的?”但真在安全圈跑过几次攻防演练、帮人排查过线上漏洞就知道,这三个字母背后藏着一整套关于输入、输出、信任边界和浏览器安全模型…

2026/10/17 9:26:37 阅读更多 →
企业智能体数据库连接方案:稳、准、久的四维选型指南

企业智能体数据库连接方案:稳、准、久的四维选型指南

1. 企业智能体连接数据库:不是“连上就行”,而是“连得稳、查得准、跑得久”“企业智能体连接数据库方案对比分析”——这标题里藏着三个关键动作:连接、对比、分析。它不是教你怎么在Python里写一行pymysql.connect(),也不是告诉…

2026/10/17 9:26:37 阅读更多 →
批量SHP与TXT互转:Python工具的实现与避坑指南

批量SHP与TXT互转:Python工具的实现与避坑指南

简介:这份工具包是面向自然资源、测绘及地理信息处理人员的批量矢量数据转换工具,核心功能是将标准矢量文件批量转为文本格式,切实解决建设用地报批、设施农用地上图、卫片处理等实际业务中,矢量几何与属性数据不方便直接参与文本…

2026/10/17 9:26:37 阅读更多 →
C++ Win32双缓存乒乓球游戏:人机对战与UDP联机实现

C++ Win32双缓存乒乓球游戏:人机对战与UDP联机实现

简介:这是一款基于C开发的桌面级乒乓球对战游戏,面向编程初学者与图形界面实践者,聚焦双缓存绘图优化、人机AI逻辑与本地PVP交互等核心知识点,适用于课程设计、算法可视化及Win32游戏开发入门学习。资源包共52个文件,涵…

2026/10/17 9:26:37 阅读更多 →
SQL注入入门:union联合注入从原理到实战全解析

SQL注入入门:union联合注入从原理到实战全解析

1. 从第一关说起:为什么union联合注入是理解SQL注入的最佳入口很多人学SQL注入,一上来就被各种报错注入、布尔盲注、时间盲注绕晕了。我带了不下二十个新人,发现一个规律:凡是第一关没吃透的,后面越学越虚。第一关看着…

2026/10/17 9:25:37 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →