如果你最近在关注 Agent 类产品的桌面化大概率绕不开 Hermes 这个名字。它从一套命令行工具和远程接口硬生生长成了一个原生桌面 App并且以 v0.16.0 Surface Release 作为新阶段的标记。这个版本最让我感兴趣的不是某个新功能而是它背后的工程节奏一周之内合入上百个 PR而且不是无序堆量是奔着“桌面端表层体验完整落地”这个目标去的。这种速度背后一定有方法论不是单纯人多也不是靠加班而是 PR 拆分、CI 门禁、并行协作和发布链路配合出来的结果。这篇文章我想做的不是罗列更新日志而是把 Hermes v0.16.0 这一周百 PR 的过程拆开看原生桌面 App 为什么非做不可Surface 这个命名到底指什么一百个 PR 是怎么被切碎、验证、合入、打包、分发的以及用户在安装、更新、卸载过程中遇到的那些问题根因到底在哪。如果你想做类似的原生 AI 桌面应用或者单纯想学习怎么把开发节奏打得又快又稳这篇拆解应该能给你一份可以直接抄作业的参考。1. 先看项目全貌Hermes v0.16.0 到底在解决什么问题1.1 从热词和现场反推产品定位原生桌面 App 解决的核心痛点我看了一下围绕 Hermes 的一批搜索热词出现频率最高的是桌面版安装、桌面版无法更新、桌面版卸载、MCP 接入、配合什么开发工具这说明一个关键事实Hermes 已经过了“有没有人用”的阶段到了“真实用户在桌面上折腾它”的阶段。用户开始关心安装包怎么装、更新为什么失败、卸载干不干净这些恰恰是桌面端产品成熟度的试金石。从产品形态上讲Agent 类应用从网页端走向桌面端几乎是必然。网页端能做的对话和知识问答浏览器沙箱已经够用但当一个 Agent 要替你读屏幕、操作文件、调用本地工具、控制其他软件时浏览器的权限边界就成了天花板。这时候桌面 App 的出现就不是“多个入口”这种锦上添花而是能力上的刚需。原生方案和 Electron 套壳的差别也在这里体现。很多团队图省事用 Electron 包一层浏览器壳看似快速但代价是内存占用、启动速度、系统集成能力和权限控制精度都打了折扣。Hermes 选择走原生路线至少说明它在设计时就把“长期驻留、系统级操作、低资源占用”这些诉求放在了优先级前面。从公开反馈来看这类 Agent 桌面壳能不能稳从来不取决于 UI 漂不漂亮而取决于它在后台连续跑一整天内存涨不涨、权限申请清不清晰、系统弹窗会不会漏。1.2 “Surface Release”里的 Surface 到底指什么v0.16.0 这个版本号本身就能读出很多信息。0.x 意味着产品还在快速迭代期API 和交互都可能随时变而走到 v0.16说明已经不是冷启动阶段是持续迭代了大半年后的稳定输出。真正有意思的是 “Surface Release” 这个后缀。我理解这里的 Surface 不是指微软那个 Surface 硬件而是指“表层/界面层”这个版本的重点是把用户能直接接触到的那个交互表层彻底做完整。换句话就是之前版本可能把底层能力、模型接入、工具协议都打通了但用户在桌面上看到的那个“表面”——窗口、菜单、快捷键、通知、设置页面、更新提示——还是半成品。v0.16.0 的核心任务就是把这些表层体验统一收口让它看起来像一个正经的桌面软件而不是一个用命令行思维硬套 UI 的原型。版本命名里带 Surface 还有个好处就是给整个开发周期定了锚点。团队可以围绕“表层完整度”来规划 PR哪些任务属于表层哪些任务属于内核分配一目了然。这也是我能在一周百 PR 里看到秩序感的原因背后一定有个清晰的目标边界。2. 一周 100 个 PR不是堆人而是把工程节奏切成薄片2.1 PR 拆分粒度从“功能块”切到“可独立验证的原子提交”一百个 PR 一周合完平均一天 20 个这在分布式协作的场景里并不夸张前提是每个 PR 都足够小。如果 100 个 PR 都是几百上千行的大改动那别说审查光冲突就能把人耗死。所以第一件事就是把 PR 从“功能块”切到“可独立验证的原子提交”。举个具体例子假设要给桌面端做自动更新功能很多团队会用一个巨型 PR 把版本检查、下载、校验、安装、回滚、UI 提示一次性提交。但这样做的后果是评审人要同时理解六个子模块任何一个环节出问题整个 PR 都要重新走流程。如果把同一件事拆成六个 PR——先加服务端版本接口的 schema 变更再加下载器再加校验器再加更新状态机再加 UI 绑定最后加失败回滚——每个 PR 都能在 20 分钟内评审完而且每一步都有独立的验证标准。我拆过很多这样的 PR最大的体会是不要追求“一个 PR 完成一个功能”要追求“一个 PR 让系统前进一步”。哪怕这一步很小只要它是可测试、可回滚、不影响主干的它就是一个合格的 PR。这个粒度标准一旦定下来一百个 PR 并行就不再是灾难而是流水线。2.2 并行不撞车依赖图、变更所有权与 PR 门禁一百个 PR 并行最大的敌人不是代码量是冲突。文件冲突还好解决真正可怕的是语义冲突PR A 改了接口入参PR B 还在按旧参数调用两边都过了 CI合到一起程序就崩了。Hermes 这种桌面 App 能在高速迭代中不翻车靠的是一套“变更所有权”机制每个目录、每个模块都有明确的负责人改动跨模块时必须先通知对方或者在描述里显式声明影响范围。另一个关键是“接口先行”。需要跨模块协作的改动先把接口和数据结构定下来做成独立的类型 PR 合入然后各模块各自实现。这样子 PR 合并时两边都是对着同一个接口版本开发冲突概率大幅下降。热词里有人提到 GitHub PR Check其实真正做到位的项目PR check 不只包含语法和单测还应该包含类型检查、构建验证、依赖审查和必要的端到端 smoke test。还有一个我特别想强调的实践就是“PR 队列”的思想。一百个 PR 并行不代表一百个 PR 同时合入。团队会按依赖关系把 PR 串成队列底层依赖先合上层功能跟着合。看起来是并行开发实际是“并行开发 串行合并”这样主干永远处于接近可发布的状态想发版本随时可以发。2.3 Agent 写 PR、人类做评审人机协作的分工一周一百个 PR说实话靠纯人工写确实吃力现实一点想这里面有很大一部分工作就是 Agent 辅助完成的。现在很多团队已经跑通“Agent 生成 PR、人类评审”的协作流Hermes 本身就是做 Agent 的团队用它自己的模型能力来辅助开发完全符合逻辑。但什么 PR 适合交给 Agent什么必须人工写这个边界要划清楚。我自己的经验是三类 PR 非常适合自动生成机械重构、测试补全、文档更新。这类任务规则明确、风险低Agent 干得又快又不容易遗漏。而安全边界、权限模型、破坏性变更这类 PR必须人工逐个过因为这些地方出错的代价是指数级的还牵涉到产品信任。评审这块也建议设门槛。PR 描述必须写清楚“为什么改、改了什么、怎么验证、影响面多大”缺一个就打回。在百 PR 一周的速度下好的 PR 描述不是为了好看是为了让评审人能在几分钟内做出判断。我见过太多项目CI 几秒钟跑完但评审人花半小时猜这个 PR 到底想干嘛这才是真正的浪费。3. 原生桌面壳的硬骨头不是“套个浏览器”就完了3.1 为什么最终选择了原生方案桌面 Agent 要做的事情决定了它不能只是一个浏览器窗口。全局快捷键、屏幕内容读取、辅助功能接口、文件系统遍历、进程管理、系统托盘这些能力每一项都对权限和系统 API 有深层需求浏览器沙箱给不了。哪怕 Electron 能通过 Node 层绕过去一部分集成深度和稳定性也远不如原生。再说性能。Agent 类应用和普通工具软件不一样它要长期驻留后台随时响应外部事件。Electron 应用的内存起步就是几百 MB跑上一天再叠加模型推理的 CPU/GPU 占用用户会明显感到电脑风扇在转。原生方案至少能把纯驻留开销压到一个可接受的水平把宝贵的系统资源留给真正干活的大模型。我没有实测 Hermes 的驻留内存到底多少但一个做 Agent 的桌面应用如果内存控制不住用户体验是撑不住长时间挂机的。另外权限模型也是原生方案的强项。macOS 的辅助功能权限、屏幕录制权限Windows 的 UAC、服务注册Linux 的桌面门户这些体系各不相同原生代码可以针对每个平台做精细适配。套壳方案往往只能拿到“能用”的权限离“好用”差很远。3.2 自动更新链路桌面版“无法更新”的根因与解法热词里有一条我特别在意“hermes 桌面版无法更新”。这几乎是所有桌面 App 的宿命问题也是用户最容易放弃的痛点。根据我处理这类问题的经验自动更新失败的原因高度集中在几个点我列一个排查顺序表给大家参考。现象首要排查方向常见根因点更新没反应版本检查接口是否通网络代理、接口地址变更、脱机状态下载到一半失败下载通道和签名增量包损坏、镜像源不稳定、磁盘空间不足提示校验失败代码签名和哈希新旧版本签名不一致、证书过期装完还是旧版本旧进程是否退出进程仍在驻留安装包被系统拦截闪退或白屏资源文件是否完整增量合并时版本不匹配、配置文件残留工程上的解法也很明确更新检查做成独立模块失败不阻塞主流程下载走全量加增量双通道安装前自检签名和磁盘安装后做版本回读校验如果新版本启动失败自动回滚到上一个可用版本。这套机制越早做越好等用户开始抱怨“无法更新”时再补信任已经流失了。还有一个细节容易被忽略更新检查频率和交互设计。不要每次启动都在后台拉取更新也不要频繁弹窗打断用户。合理做法是低频检查加静默下载等下载完再提示“重启安装”用户感知会舒服很多。3.3 安装部署与卸载体验Windows / Ubuntu / macOS 的适配细节桌面 App 的“最后一公里”其实分成两半一半是代码另一半是安装卸载的体验。Hermes 被用户搜索最多的就是安装和卸载说明这里还有打磨空间。我按平台整理了一下最容易踩的坑。Windows 上安装包用 NSIS 或 MSI 都有关键点是安装路径的权限问题。如果装到 Program Files写配置需要重定向到 AppData这个逻辑不做对后续更新和配置保存都会出问题。还有杀软误报C/Rust 编译出来的程序如果没有代码签名很容易被误判这就要尽早买证书、加白名单、优化触发行为。Ubuntu 上一般发 deb 包。依赖链是最大的坑Agent 应用常常要依赖特定版本的 libssl、libgtk不同发行版差异很大。稳妥做法是尽量静态链接减少动态依赖如果非要动态依赖就把最小依赖版本写清楚并提供图形化安装器或一键脚本。装到 /opt 还是 ~/.local 也要想清楚前者系统级更整洁后者不需要 root 权限对普通用户更友好。macOS 要过 Gatekeeper 和公证notarization签名不完整用户会直接看到“已损坏”的提示这个体验基本劝退。卸载体验也值得认真对待配置文件、缓存目录、开机启动项、系统托盘残留都要有清理逻辑。用户卸载一个应用最讨厌的就是“删不掉”“删了还留一堆垃圾”。这块做到位口碑能救回来不少。4. 与智能体生态的接缝MCP、Skill 与开发工具链4.1 MCP 接入让桌面 App 成为 Agent 的“眼和手”热词里有一连串“Hermes 接入 MCP”这其实是 Agent 桌面化最核心的一步。MCPModel Context Protocol解决的是模型和工具之间的对接问题模型要调用文件系统、数据库、外部 API不可能每接一个工具就写一套私有协议MCP 把工具调用标准化成一套统一协议工具方实现 MCP ServerAgent 侧做 MCP Host 和 Client。桌面 App 作为 MCP Host 是非常合适的角色。它能提供文件读写、进程管理、本地端口探测、数据库查询、HTTP 请求这类基础能力模型通过这些工具“长出眼和手”。但这里有个安全红线权限不能一把梭。每个工具调用的敏感操作都应该有授权模型第一次使用要弹窗确认后续可以按信任等级放行。MCP 接入做得粗糙等于给 Agent 留了个不设防的后门这是桌面 Agent 产品最容易被人质疑的地方必须在设计上优先解决。实操上调试 MCP 有个小技巧先在本地起一个 mock server把所有工具输入输出打出来看一遍确认协议字段和错误处理是完整的再接到真实模型侧。我见过不少时间浪费在模型直接调用真实工具上一报错根本分不清是模型理解错了还是工具返回格式不对。Mock 隔离能把这个排查难度降一半。4.2 Skill 与 Bot Mode从“一问一答”到“持续任务”如果说 MCP 打通了工具能力那么 Skill 解决的是“怎么用这些工具”的问题。一个 Skill 可以理解为一组带描述、参数和流程模板的操作编排比如“周报生成”“代码仓库巡检”“日志异常分析”。模型看到用户意图后会动态加载最匹配的 Skill再按照 Skill 里定义的工具调用序列去执行。热词里有“hermes skill”和“hermes agent v0.21 (bot mode)”说明产品已经从交互式对话进化到了后台任务模式。Bot mode 的意义很大它让 Agent 不只是“你问它答”而是“你下发任务它持续做做完汇报”。这个形态才是桌面 Agent 真正的价值。技术实现上需要事件驱动架构任务队列、状态持久化、进度回调、结果通知。凡是做过这类系统的都会有体会难点不在模型而在任务状态机设计和异常恢复。Skill 体系还承担着扩展生态的功能。第三方开发者或者高级用户可以通过写配置化 Skill 文件来扩展 Agent 的能力不需要改主程序。这跟编辑器的插件系统是一个思路主程序保持精简能力通过声明式配置注入。4.3 开发者怎么配合调试器、CLI 与编辑器生态热词里有人问“Hermes 配合什么开发工具使用”我先给一个直接结论这类桌面 Agent 应用能不能被开发者深度使用取决于三个配套工具——CLI、调试面板、插件机制。CLI 是排查问题最快的入口。Agent 跑得好不好百分之八十看日志链路全不全。一个称职的 CLI 应该能查看当前加载的 Skill、列出注册的 MCP 工具、手动触发工具调用并观察返回结果。调试面板则要看模型请求和响应、token 消耗、工具调用序列这些数据如果只在远端看本地问题根本没办法定位。开发环境配合方面我个人的习惯是 VS Code 加终端加本地 mock 服务一套组合。写 MCP 工具时先本地单测调试 Skill 流程时用固定输入集跑一遍回归最后再接真实模型做冒烟。如果你要基于 Hermes 这类平台做二次开发建议先把它当成“本地服务 GUI 客户端”的组合来理解底层通过标准协议通信这样无论前端怎么变你的工具逻辑都不受影响。5. 从仓库到用户桌面的最后一公里构建、发布与灰度5.1 签名、公证与自动更新桌面发布的三件套代码写完了PR 合完了真正的挑战才开始怎么把产物安全地送到用户桌面上。桌面发布有“三件套”绕不开——签名、公证和自动更新。这三个少一个用户都会在安装和更新环节付出额外的信任成本。签名是基础。Windows 上没签名的安装包会触发 SmartScreen 拦截用户得点“更多信息”才能运行这一下就吓跑一半小白用户。macOS 上要求更严格没有 Developer ID 签名和公证应用直接提示已损坏。签名还不只是买证书CI 里要保证产物可复现工具链版本固定、依赖锁定、构建缓存一致这样同一份代码构建出来的哈希才能一致更新校验才有意义。更新通道再稳如果包本身不对一切都白搭。自动更新链路要跟签名体系打通。更新包在服务端生成后客户端下载完要验证签名和哈希然后再覆盖安装。macOS 的 Sparkle、Windows 的 Squirrel 这类框架能省不少事但一定要自己过一遍签名验证逻辑不要无脑信任框架默认行为。桌面应用发布最怕的就是“用户跑在旧版本上你修了 bug 他永远收不到”。5.2 灰度与回滚v0.16.0 这种版本怎么安全放量一周百 PR 的迭代速度带来的不只是功能红利还有风险积累。如果直接全量发布任何一个漏网的回归都可能放大成事故。所以版本发布要走灰度先内部团队全量使用再小部分外部用户观察崩溃率和关键链路成功率最后再放量。灰度比例可以按 1%、5%、20%、100% 逐步上调每档留出观察窗口。回滚机制要和灰度配合。桌面 App 回滚比服务端复杂因为客户端在用户手里你没法强制。所以要做两层准备一是应用内远程配置出了问题可以紧急关闭新功能开关二是自动更新链路里的“版本回退”能力启动连续崩溃两次就自动退回到上一个稳定版本。这两层能在用户感知到问题之前就把损失挡住。还要配崩溃上报和应用内反馈。一周合入一百个 PR就算 CI 全覆盖也不可能保证零缺陷。崩溃日志和用户主动反馈是修复的重要输入这些数据要能跟 PR 关联起来出了问题才能快速定位是哪次变更引入的。没有这个闭环高速迭代只会变成高速埋雷。6. 复盘与经验如果你想复刻这种节奏6.1 团队与流程上可复制的三件事观察 Hermes v0.16.0 这段发布背后我觉得有三件事是其他团队可以直接照搬的。第一件是 PR 模板标准化。每个 PR 必须写明背景、改动、验证和影响面这个模板看起来简单但能把评审效率拉高一个量级。很多团队 PR 写得像草稿评审人靠猜速度自然上不去。第二件是 CI 门禁前置。类型检查、单测、构建验证、依赖审计全部通过才能进评审。一条快速、稳定的 CI 流水线是并行开发的地基地基不稳人数越多越乱。第三件是模块变更所有权。每个目录必须有明确 owner跨模块改动需要 owner 审核。这是减少语义冲突最有效的手段比任何代码规范都管用。6.2 技术上值得抄作业的三个点技术层面我最推荐三个实践。第一是原子提交。一次提交只做一件事哪怕是修一个变量名都单独提交。这能保证 git log 和 PR 历史干净回滚时也能精准操作。第二是状态机驱动的 UI。桌面 App 的界面状态比网页复杂得多更新、下载、任务运行、权限申请各种中间态如果不用状态机管理代码很快会变成一坨 if-else。状态机把所有合法切换路径定义清楚UI 永远不落在非法状态。第三是可插拔工具注册表。MCP 工具、Skill、命令都通过注册表动态加载主程序不感知具体实现。这样团队可以并行开发不同能力模块互不阻塞正好撑起一周百 PR 的节奏。6.3 做原生 AI 桌面 App 的几个坑最后说几个踩过的坑希望你能绕开。第一个是权限申请时机。不要在安装时一次性把所有权限要完应该在用户真正要用某项能力时才弹窗申请配合清晰的解释文案体验完全不同。第二个是更新机制要尽早做。先做最简单的检查更新加手动下载再逐步升级到静默更新和增量更新别等用户基数大了再补到那时每个版本都会有人跑在旧代码上。第三个是别忽略低端机器。Agent 桌面应用会长时间驻留如果只在高配开发机上测试到用户那里会变卡变慢。建议把“低内存模式”当成一等公民来做至少保证老机器能用基础功能。第四个是日志不能裸奔。桌面端日志要分级、脱敏、可配置本地留存不然排查问题时会很痛苦隐私安全也会被人质疑。这四点每一件看起来都不起眼但叠加起来才是原生 AI 桌面 App 从演示品变成合格产品的分水岭。
企业数字化 ERP 产品动态
相关推荐
MFC老项目Tab控件封装:CTabSheet原理与避坑指南 简介:这份资源面向使用 VC2008 与 MFC 开发桌面程序的初学者和中级开发者,聚焦多选项卡界面的实现问题。它以 CTabSheet 类为核心,演示如何封装 TabCtrl 控件、派生选项卡页面、通过 CPropertySheet 组织多个页面并完成消息映射,最… · 2026/11/3 22:03:49
跨Agent记忆层:把记忆从上下文窗口解放出来 做 Agent 开发大半年,我最大的感受是:模型能力已经不是瓶颈,记忆才是。单跑一个 Demo 很容易,给个 prompt 就能完成任务;但一旦到了多 Agent 协作的场景,比如一个负责规划的主 Agent 带着几个执行 Agent 干… · 2026/11/4 3:54:29
从知识割裂到评估闭环:RAG工程落地的六个关键分水岭 1. 知识割裂才是第一条分水岭:向量检索擅长相似,不擅长关系 先说个每个 RAG 项目都会撞上的现象:你把一份三十页的产品手册切成五十段,分别向量化后存库。用户问"哪个版本开始支持多仓库部署?",系… · 2026/11/4 3:56:21
SpringBoot通过kt-connect+kubectl进行本地调试k8s服务 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 11:38:27
如何搞定课程设计?别人走过的捷径,你也可以走 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 11:38:27
如何让下载文件自动归类:PyTube Downloader动态文件夹组织完全教程 【免费下载链接】pytube-downloader Simple. Fast. Powerful YouTube Downloader For Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/pytu/pytube-downloader 点击查看 免费下载 PyTube Downloader 是一款简单、快速、强大的 YouTube 下载器… · 2026/11/4 11:38:27
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38