上周帮一位做数据核对的朋友处理了一件挺磨人的事他们内网只能用 MongoDB Compass 的 Isolated Edition界面全英文组里几个刚转到数据岗的同事天天在群里问“这个按钮到底是干嘛的”。他从网上找来一份汉化补丁照着说明把app.asar一替换Compass 直接白屏连报错都没弹出来日志也是空的。两个晚上折腾下来最后走的路是自己解包 asar、按手上的版本重建词条表才把 MongoDB Compass Isolated Edition 汉化这件事真正做成。这件事的核心难点并不在“英译中”上而在于 Isolated Edition 这个特殊发行版和市面上流传的汉化包根本不是一套东西。完整版的汉化补丁是整包替换app.asar而 Isolated 版删掉了内嵌 Shell 和本地实例相关模块文件清单、chunk 划分、压缩后的变量名全都不同硬套上去必然出问题。所以这篇不讲“下载某个包然后覆盖”这种一句话教程而是把汉化的技术原理、词条定位方法、替换边界、回包验证和踩坑排查链路完整讲一遍让你在自己手上的那个版本上也能做出来升级之后还能快速重做一遍。不管你是刚接触 Electron 应用本地化的新手还是已经会改几行 JS 的老手下面这套流程都能直接照做。1. Isolated Edition 的特殊性决定了汉化不能照搬先把版本差异搞清楚后面很多坑都能提前避开。MongoDB 官方发布的 Compass 有几个不同定位的发行版界面长得几乎一样但内部模块组成差别不小。很多人汉化失败第一步就错在拿完整版的补丁去套 Isolated 版甚至连自己装的是哪个版本都没确认。1.1 三个发行版本的功能边界对照下面这张表是我根据实际安装包结构整理的对照具体细节会随大版本变化但整体格局基本稳定你在动手前可以拿它做一次快速自检。对比项完整版 CompassIsolated EditionReadonly Edition内嵌 MongoDB Shell包含已移除视版本而定启动本地实例做演示支持不支持不支持查询与文档浏览支持支持支持只读聚合管道构建器支持支持支持索引管理与结构分析支持支持部分受限写操作增删改支持支持禁用安装包体积最大中等中等从表里能看出来Isolated Edition 主要砍掉的是“自带运行环境”这部分能力它不再内置命令行 Shell也不能在本地拉起一个临时实例给你练手。剩下的集合浏览、文档编辑、聚合管道、索引管理、Schema 分析全都保留。这一点对汉化非常关键——被删掉的模块在完整版里对应着一批界面文案Isolated 版的 asar 里压根没有这些文件反过来Isolated 版某些页面的 chunk 划分也和完整版不同同一个按钮的文字可能落在完全不一样的文件里。1.2 通用汉化包在 Isolated 版上失效的三个原因我复盘那次白屏问题其实很典型基本可以归到三类。第一类是整包替换导致的引用断裂。网上流传的汉化方式大多是把改好的app.asar整个覆盖过去。Isolated Edition 的启动入口会按自己的清单去加载模块一旦替换成完整版的归档主进程require一个不存在的路径进程直接退出表现就是双击图标毫无反应或者闪一下就没了。第二类是压缩产物版本错位。Compass 的界面代码经过 webpack 打包和压缩变量名被改写成a、b、c这种单字母模块编号也随构建变化。汉化补丁如果是基于旧版本做的字符串替换替换位置对不上轻则文案没变重则把一段函数体改出语法错误渲染进程加载失败窗口出来了但内容是白的。第三类是macOS 上的签名失效。这条在 Windows 上不明显但只要你在 Mac 上改过.app包内的资源应用的代码签名就会失效系统层面的校验会拦住启动。很多人以为是汉化改错了其实是签名问题这个后面第 5 章会专门讲处理方式。动手之前先记一句话Isolated Edition 的汉化必须基于你本机这一个安装包来做版本号、构建号、平台三者对齐任何“通用补丁”都要先怀疑。2. Compass 的中文是从哪一层“塞”进去的搞清楚文件结构后面的操作才有方向感。Compass 是典型的 Electron 应用界面部分本质上是跑在 Chromium 里的网页所有你看得见的英文最终都以字符串字面量的形式存在于磁盘上的某个 JS 文件或 JSON 文件里。汉化做的事情就是把这些字面量换成中文再让应用重新加载。2.1 app.asar 的物理结构与读写规则Electron 打包时会把整个应用目录塞进一个叫app.asar的归档文件放在安装目录的resources下面。不同平台的典型路径是这样WindowsC:\Program Files\MongoDB Compass Isolated Edition\resources\app.asarmacOS/Applications/MongoDB Compass Isolated Edition.app/Contents/Resources/app.asarLinux/usr/share/mongodb-compass-isolated/resources/app.asar或/opt/下的对应目录asar 是一种只读归档格式Electron 内部打了补丁让 Node 的文件读取接口能直接穿透进去读。它不能像 zip 那样双击打开编辑必须用工具解包成普通目录。这里有个特别实用的技巧Electron 在启动时会优先找resources/app.asar找不到才去找resources/app目录。所以调试阶段你可以把原来的app.asar改名备份然后把解包出来的目录命名为app放进去应用会直接加载目录内容。这样改一个词条存盘、重启应用就能看到效果不用每改一次都重新打包试错效率高一个量级。等词条全部定稿再打包回 asar。2.2 文案分布的三层结构资源表、打包产物、插件子包Compass 的界面文字不是集中在一个文件里的按我实际拆包的经验大致分三层。最上层是语言资源文件。部分版本会在包里带locales或i18n目录里面是键值对形式的 JSON。这类文件是最理想的修改对象改起来干净、不会破坏代码逻辑、升级时也容易 diff。如果你手上的版本存在这类文件优先动它能覆盖多少算多少。中间层是打包后的渲染进程产物通常在lib目录下文件名带 hash 或者叫app.js、renderer.js之类。这一层是主战场绝大多数按钮文字、菜单项、提示语都以内联字符串的形式躺在这里。它们被压缩过一行可能上万字符肉眼找起来很痛苦必须靠搜索定位。最下层是插件子包。Compass 的功能是按插件拆分的集合视图、聚合管道、索引管理各自是独立的包。如果构建时没有全部打进去你会在node_modules/mongodb-js/下面看到一堆compass-*目录每个目录自己的lib里也有文案。这一层的坑在于同一个词可能在多个子包里重复出现改了一处另一处还是英文需要全局搜索确认覆盖完整。3. 开工前的三项准备锁版本、建词表、留退路我见过太多人一上来就打开文件改改到一半发现改错地方想回退又没备份最后只能重装。准备工作花不了半小时但能省掉后面几小时的返工。3.1 版本号与构建号为什么必须一一对应打开 Compass在帮助菜单或者关于页面能看到完整版本号形如1.4x.x有些版本还会带构建号。这个号必须记下来原因有三个。一是升级会覆盖你的成果。Compass 的自动更新机制会下载完整安装包并替换安装目录汉化文件瞬间消失。记下版本号你就知道下次升级后需要重做而不是对着一片英文发懵。二是词条表需要和版本绑定。不同版本之间新增或删除的界面文案差别不小词条表按版本存档升级时先 diff 出新增的英文串只翻增量部分比重翻一遍省八成时间。三是排查问题时能对上号。万一改完出问题你至少要能说清楚“我改的是哪个版本”否则连回退到哪个状态都判断不了。3.2 用词条表代替“边看边改”直接打开 JS 文件看到英文就替换是最容易翻车的方式。原因很简单你没法保证同一个英文词在不同上下文里应该翻成一样也没法保证替换时不会误伤代码里的同名标识符。我的做法是先建一张表两列英文原文、中文译文另外加一列“是否允许替换”做标记。表格用 CSV 或者制表符分隔的纯文本都行好处是可以用脚本批量处理也可以直接丢给同事校对。Collection 集合 yes Document 文档 yes Field 字段 yes Index 索引 yes Aggregation Pipeline 聚合管道 yes Stage 阶段 yes Explain Plan 执行计划 yes $match $match no ObjectId ObjectId no最后两行特意标了no这就是这张表最有价值的地方它把“不能翻的东西”明确写下来了避免手滑。3.3 备份与回滚的最小方案备份方案不用复杂两步足够。第一步把原始的app.asar复制一份到安装目录外面命名成app.asar.orig-版本号。千万别原地改名放在同一个resources目录里Electron 有可能扫到多个归档导致加载混乱。第二步解包出来的目录单独存一份未修改的副本。这样你在改的过程中随时能用 diff 工具对比“改了哪些文件、改了哪几行”出问题时按文件粒度回滚比整包重装快得多。提示如果你在受管环境里操作改动安装目录下的文件前先走一遍内部审批。Isolated Edition 本身就是为了高安全场景设计的随意修改安装产物可能触碰内部基线要求先报备再动手省得后面解释。4. 解包、定位、替换的完整动作准备工作做完进入实操。这一章是整个汉化的主体我按动作顺序拆开讲每一步都说明为什么这么做。4.1 解包与结构勘察解包用electron/asar这个官方维护的工具Node 环境里一条命令就能跑不需要全局安装。# 进入 resources 目录 cd /path/to/resources # 解包到 app 目录Electron 会优先加载这个目录 npx electron/asar extract app.asar app # 看一眼解出来的结构 ls app解完之后先别急着改花五分钟做结构勘察。重点看三个地方package.json里的main字段指向哪个入口文件lib目录下有多少个 JS 文件、体积分布如何以及有没有locales、i18n这类资源目录。cd app cat package.json | head -30 du -sh lib/* | sort -h | tail -20 find . -maxdepth 2 -type d -name *locale* -o -maxdepth 2 -type d -name *i18n*体积最大的那几个 JS 文件通常就是渲染进程的主 bundle界面文案主要集中在那里。这一步的判断很关键选错了主战场后面搜索会特别低效。4.2 用 grep 精准定位词条所在文件定位词条的核心手段是搜索但要搜得准。直接搜Connect这种词会命中几千个结果因为它在代码里到处出现。我的经验是搜带空格的完整短语比如Connect to、Create Index、Run Query这类组合几乎只出现在面向用户的文案里。# 统计某个短语出现在哪些文件 grep -rln Connect to app/lib # 看具体上下文限制输出长度 grep -rn Connect to app/lib --include*.js | cut -c1-200 | head -20搜到之后要判断这处字符串到底是不是界面文案。判断方法很简单看它周围有没有 HTML 标签、className、title、aria-label、placeholder这类特征。如果它出现在一段 JSX 结构或者字符串拼接里基本可以确认是文案如果它出现在if判断、函数调用参数、对象键名里那多半是逻辑用的不能动。还有一个提高效率的技巧先改一个最有辨识度的词做试验比如把启动页的某个按钮文字改掉重启验证生效确认自己找对了文件和替换方式再批量铺开。这比一上来改几十处、出问题后不知道是哪处坏了要靠谱得多。4.3 能改与绝不能改的字符串边界这是整篇最关键的一节我把它做成表格建议你贴在显示器旁边。位置举例能否替换原因JSX 文本节点buttonConnect/button能纯展示不影响逻辑title 属性titleRefresh能鼠标悬停提示aria-labelaria-labelClose能无障碍标签placeholderplaceholderFilter能输入框占位文字提示消息toast(Copied)能纯展示测试选择器>const fs require(fs); const path require(path); // 读取词条表格式英文 \t 中文 \t yes|no const rows fs.readFileSync(glossary.tsv, utf8) .split(\n) .filter(Boolean) .map(line { const [en, zh, allow] line.split(\t); return { en, zh, allow: allow yes }; }) .filter(r r.allow r.en r.zh); // 递归收集所有 js 文件 function walk(dir, out []) { for (const name of fs.readdirSync(dir)) { const full path.join(dir, name); const stat fs.statSync(full); if (stat.isDirectory()) walk(full, out); else if (name.endsWith(.js)) out.push(full); } return out; } const files walk(app/lib); let changed 0; for (const file of files) { let src fs.readFileSync(file, utf8); let hit false; for (const { en, zh } of rows) { if (src.includes(en)) { src src.split(en).join(zh); hit true; } } if (hit) { fs.writeFileSync(file, src, utf8); changed; console.log(modified:, file); } } console.log(total files changed:, changed);这个脚本故意写得很朴素就做全局字符串替换。它的风险也在这里如果一个英文短语既出现在文案里又出现在逻辑判断里脚本会一起替换掉。所以跑之前务必用第 4.3 节的边界表核对一遍词条把有歧义的条目改成更长的完整短语让它在代码里只可能出现一次。比如把Connect换成Connect to把Index换成Create Index精确度马上就上来了。5. 回包、启动与白屏排查链路词条改完进入验证阶段。这一步出的问题最多我把排查链路完整写出来你遇到白屏可以照着一步步走。5.1 回包的正确顺序与文件权限调试阶段我的建议是先不打包直接让应用加载app目录确认界面正常、文案正确再打包回 asar。打包命令是npx electron/asar pack app app.asar打包时有两个细节要注意。Windows 上如果 Compass 正在运行asar 文件被占用打包会失败或者生成一个残缺文件务必先完全退出应用。macOS 和 Linux 上要注意目录所有者用sudo解包出来的文件如果是 root 所有回包后应用可能读不了建议全程用同一个用户身份操作。macOS 还有一个绕不开的问题修改.app包内的app.asar会让原有的代码签名失效。处理方法是用系统自带工具重新做一次本地临时签名codesign --force --deep --sign - /Applications/MongoDB Compass Isolated Edition.app这条命令只对本地这一份应用生效不改动任何分发物纯粹是让系统校验能过。做完之后再启动就不会出现“应用已损坏”那种提示了。5.2 从启动失败到定位到具体词条的四步排查真出问题的时候别凭感觉猜按下面四步走。第一步从命令行启动把错误看全。图形界面双击启动时错误会被吞掉命令行启动能看到 stderr 输出。# macOS /Applications/MongoDB Compass Isolated Edition.app/Contents/MacOS/MongoDB Compass Isolated Edition # Windows在 PowerShell 里执行带引号的完整路径 C:\Program Files\MongoDB Compass Isolated Edition\MongoDBCompassIsolatedEdition.exe第二步判断是主进程崩还是渲染崩溃。命令行里如果直接报Cannot find module或者一堆 require 相关错误说明主进程加载失败问题出在文件缺失或路径错误多半是打包时漏了文件。如果进程能起来、窗口也出来了只是内容空白那问题在渲染进程是 JS 执行异常。第三步想办法看渲染进程的报错。部分版本支持用快捷键打开开发者工具能直接看到 Console 里的红字第一行往往就写着哪个文件的第几行有SyntaxError。如果快捷键不可用就退回二分法。第四步二分回滚定位。把所有改动过的文件列出来按一半一半地还原每还原一批重启一次看界面是否恢复。文件数量多的时候这个方法很快通常两三轮回滚就能锁定到具体文件再对着词条表看这个文件改过哪些条目逐条撤回。我那次白屏就是这么查出来的第一轮回滚一半文件界面正常了说明问题在后一半第二轮再切分最后定位到一个文件里那条把aria-label里的字符串翻掉、但顺带把引号转义破坏了的替换。这类问题肉眼看不出来只能靠回滚缩范围。5.3 更新、校验与签名带来的后续问题汉化做完不代表一劳永逸有三个后续问题要提前想清楚。一是自动更新会覆盖修改。应用检测到新版本后会下载完整安装包并替换安装目录你的app.asar直接没了。受管环境里通常本来就断外网这个问题不突出能联网的环境建议在设置里关掉自动更新或者至少记住“升级即失效”这条规律。二是文件完整性校验。有些受管环境会给安装目录做哈希基线改了 asar 就会告警。这种情况必须先报备把汉化纳入变更管理否则触发告警后解释成本很高。三是不要分发修改后的安装包。汉化的内容是基于官方软件的界面文字改写改好的产物自己本地用没问题打包发给别人或者对外分享就涉及许可协议边界了。团队内更稳妥的做法是把词条表和替换脚本放进内部仓库谁需要谁在自己的机器上跑一遍几十秒的事还能保证每个人用的都是自己那份合法的安装包。6. 汉化之后的长期维护与边界判断最后聊聊做完之后的维护以及一个很多人不愿意面对的问题有些东西其实不该汉化。6.1 术语表统一让“Collection”不再有三种翻译一个人用的时候翻译怎么顺手怎么来但只要涉及团队协作术语不统一就是灾难。同一个Collection有人翻“集合”有人翻“表”有人翻“数据集”开会的时候光对齐名词就要花十分钟。我的做法是把第 3 章那张词条表升级成团队术语表定下来就不再随意改。下面这几条是我认为值得统一的核心术语Collection → 集合Document → 文档Field → 字段Index → 索引Aggregation Pipeline → 聚合管道Stage → 阶段Projection → 投影Query → 查询Schema → 结构术语表定好之后所有替换脚本都从这张表读谁改都一致。升级新版时把新版本的英文串导出来和旧表做一次 diff新增的补进去删掉的标灰整个过程是增量的不用从头再来。6.2 什么情况下应该停手不汉化这一节可能有点反直觉但确实是我踩过坑之后的真实想法汉化有它的收益边界越界了就是负收益。第一种情况是面向初学者的教学场景之外团队成员普遍能读英文文档。Compass 的官方文档、社区问答、报错信息全是英文界面翻成中文但报错还是英文反而让人在两套语言之间来回切换。如果一个组里超过一半的人日常看英文文档汉化的收益就明显下降了。第二种情况是高频使用聚合管道和 Explain Plan 的用户。这两块界面的核心信息是阶段名、执行计划节点名、字段路径这些都不该翻翻了也对不上文档。你花大力气把周边说明文字翻译了真正重要的部分还是英文收益有限。第三种情况是版本更新频繁且没有自动化流程。每次升级都要重做一遍如果只是手工改几个词还好要是改了几百处又没有脚本支撑维护成本会很快超过收益。我个人的判断标准是如果汉化能让一个新同事的上手时间从三天缩短到一天那就值得做如果只是为了让界面“看起来舒服”但团队实际沟通还是围绕英文术语那不如把时间花在写一份内部操作手册上把常用操作路径配上截图和说明效果比改界面文字更直接。最后分享一个我觉得最省时间的小技巧把词条表存成制表符分隔的纯文本每行英文在前、中文在后、能不能替换放第三列。升级新版时先用脚本把新版app目录里所有 JS 文件扫一遍提取出词条表第一列里出现过的英文串标记命中与未命中。命中的直接复用旧译文未命中的才是这次需要新翻的部分。一个几百条的表实际需要动手的通常只有二三十条二十分钟就能完成一次版本迁移比重新解包、重新满屏找英文的原始做法快太多了。
企业数字化 ERP 产品动态
相关推荐
如何编写与分享高质量核心代码片段 1. 项目背景与核心代码的价值"先扔个核心代码镇楼"这句话在开发者社区中非常常见,它反映了一种务实的技术分享文化。当开发者遇到一个技术难题或实现某个功能时,最直接有效的交流方式往往就是展示核心代码片段。这种分享方式有以下几个显著特点… · 2026/11/2 16:42:26
2026年测试工程师必备技能与职业发展指南 1. 2026年测试行业趋势概览 2026年将是测试从业者的关键转折点。随着数字化转型进入深水区,企业对软件质量的要求正从"能用"向"好用"、"智能用"转变。测试工程师的角色不再局限于传统的缺陷发现,而是向质量保障全流程延伸… · 2026/11/3 17:22:23
VSCode插件实现Node.js项目自动化测试部署 1. 项目背景与需求分析在软件开发流程中,测试环境的部署一直是个高频且耗时的操作。传统方式需要开发人员手动执行打包、传输、部署等一系列步骤,整个过程可能需要5-10分钟,且容易因人为操作失误导致部署失败。特别是在敏捷开发模式下&#x… · 2026/11/2 16:41:24
企业安全框架OpenClaw:动态智能防护体系解析 1. 项目概述"龙虾安全指南"是奇安信面向2026年企业安全需求推出的全新安全框架体系。这个代号"OpenClaw"的项目本质上是一套融合了新一代安全技术的企业级解决方案,其核心目标是通过"看得清、管得住、用得好"三大维度,帮助… · 2026/11/3 17:22:30
插电混动技术解析:比亚迪DM-i系统与市场优势 1. 插电混动技术为何成为市场新宠最近两年路上绿牌车明显多了起来,细心的朋友会发现其中不少是插电混动车型。这种"可油可电"的新能源车,正在以惊人的速度改变着我们的出行方式。作为从业十余年的汽车工程师,我亲眼见证了插混技术从… · 2026/11/3 17:22:30
从Claude Code到Pi:为什么开发者转向模型无关的开源AI代理框架? 最近开发群里聊得最多的一个话题,不是新框架,也不是新语言,而是:为什么越来越多人从 Claude Code 换到 Pi?这两个工具我都重度用过,Claude Code 用了将近一年,Pi 也跑了差不多三个月,… · 2026/11/3 17:22:30
比亚迪DM-i插电混动技术解析与应用场景 1. 插电混动技术的市场定位与用户需求在当下汽车动力技术路线中,插电混动(PHEV)凭借其独特的"可油可电"特性,正在成为越来越多消费者的折中选择。相比纯电动车,它消除了里程焦虑;相较传统燃油车&… · 2026/11/3 17:22:30
专业图床服务与CDN加速技术解析 1. 为什么我们需要专业的图床服务作为一名技术博主,我深知图片加载速度对用户体验的影响有多大。去年我的个人博客就因为图片加载问题流失了近30%的移动端读者。当页面加载时间超过3秒时,53%的用户会选择离开——这是Google的研究数据。传统解决方案通常… · 2026/11/3 17:22:30
O(1)空间复杂度下寻找缺失数字的原地标记算法 1. 问题背景与核心思路这个问题看起来简单,但隐藏着几个关键约束条件:我们需要在O(n)时间复杂度和O(1)额外空间复杂度下,找出1到n范围内缺失的数字。这意味着我们不能简单地使用哈希表等额外数据结构,而必须充分利用给定的数组本身… · 2026/11/3 17:21:30
双极步进电机控制实战: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/2 13:10:28
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/3 6:04:24
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/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战: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/2 13:10:28
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/3 6:04:24
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/3 5:52:46