news 2026/9/5 9:01:13

DeepSeek Harness:用插件化打破AI工具封闭性,打造自定义工作流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek Harness:用插件化打破AI工具封闭性,打造自定义工作流

DeepSeek Harness 在“重磅发布”的热闹之外,真正值得停下来分析的,不是模型调用又多了一个入口,而是“一切皆插件、万物皆可DIY”这个设计判断。我第一次看到这个说法时觉得有些营销味,但翻了一圈技术讨论后意识到,它踩中的不是某个小功能,而是过去一年 AI 工具使用里最容易被忽略的痛点:工具太多、流程太散、每个环节都封闭。大家真正需要的不是一个更强的聊天框,而是一个能把模型、脚本、工具和结果处理按自己方式拼起来的工作台。

这篇文章不打算帮你复述发布会式的功能清单,而想把 DeepSeek Harness 这类插件化框架放在真实开发流里拆开看:它到底切在哪个环节、安装为什么容易卡住、插件机制该怎么理解、从“跑通”到“长期可用”之间还差什么,以及哪些场景其实不应该强行 DIY。我的核心判断很简单:插件化解决的不是“模型不够强”,而是“工具太封闭”。但这个方向是否能长期成立,取决于插件协议、环境稳定性和维护成本,而不是一句“万物皆可DIY”的口号。

1. DeepSeek Harness 真正解决的,不是模型性能,而是“工具太封闭”

1.1 为什么一个普通的“配置开关”满足不了你

过去一年里,凡是接触过 AI 工具的人,大概都经历过类似场景:模型能力在快速升级,提示词也调整得越来越顺手,但只要你想把这一步接到自己的业务流程里,立刻就会碰到工具外壳的限制。比如,你希望每次生成完内容后自动做一次关键词抽取,再把结果写入本地表格,同时按日期归档;或者你想在一个页面里先调用甲模型做初稿,再用乙模型做审校,最后让人工确认。这类流程并不复杂,但大多数现成 AI 工具做不到。

原因在于,多数工具默认用户只会“提问—看回答”,而不是“把 AI 放进我已有的生产线”。它们提供一些配置项和开关,但配置项是别人预想好的,真正的长尾需求很难通过开开关解决。于是出现了大量胶水脚本:一边读某个工具的导出结果,一边调用另一个模型接口,再自己写文件清理和异常处理。这种脚本能跑,但每换一个工具或模型就要重新改一遍,维护成本很高。

DeepSeek Harness 这类插件化思路,恰好把这个问题摆在台面上:如果工具本身支持把能力模块化,你能不能自己往里添加步骤?能不能替换默认的模型接入方式?能不能定义输入和输出,让别人写的工具处理你的中间结果?这个思路真正卖的不是模型性能,而是把原本写死在软件里的流程决定权交还给使用者。

1.2 “一切皆插件”到底意味着什么

要把“一切皆插件”这句话落到技术层面,不能只停留在“可以安装第三方扩展”。我更愿意把插件化拆成几个具体层级:

  • 模型接入层:同一个界面或流程里,是否能对接不同模型服务商,是否能自由切换默认模型、备用模型,以及各个任务的模型路由规则。
  • 工具层:是否能给模型提供外部能力,比如访问文件、调用命令行、读取数据库、请求内部接口。工具插件本质上是一个个可复用的函数。
  • 流程编排层:是否能定义“先做什么、再做什么”的链路,让 A 插件输出自动变成 B 插件输入,中间允许条件判断、循环、重试。
  • 界面层:是否能自定义面板、按钮、键盘快捷键、结果展示方式,把高频操作固定在顺手的位置。

过去很多插件系统只做第一个或第二个层级,DeepSeek Harness 重点强调的“万物皆可DIY”,看起来是想把四个层级都打开。如果能做到,用户面对的不再是一个“黑盒应用”,而是一套“框架 + 组件”的组合。你可以只订阅别人写好的组件,也可以在某个环节插入自己写的处理函数,甚至可以把整套流程共享给团队。

这种设计带来一个很大的变化:AI 应用的使用方式从“在软件里操作功能”,变成了“为功能搭一条自己的流水线”。当大量重复动作被拆成插件后,真正节省的不只是某一次操作时间,而是把人工判断沉淀成可复用的自动化流程。

1.3 先弄清自己是不是目标用户

插件化听起来自由,但不是每个人都适合在初期就深入使用。我的判断标准如下:

维度适合深入使用慎用或等待
使用频率每周有大量重复 AI 任务偶发尝鲜,试一次就不用了
场景颗粒度需要跨工具、跨模型组合单次提问即可满足
代码基础能读简单脚本,会复制改造完全无代码经验
稳定性要求愿意花时间调试和升级任务很急,不能接受环境折腾
长期规划把流程沉淀成团队生产力更依赖开箱即用产品

这个表格不是劝退,而是提醒:插件化的收益是复利型收益,前期必须投入安装、阅读样例、调试和测试成本。如果你只想要一次快速回答,直接用官方默认界面就好,不用一开始就搭建全套 DIY 环境。

2. 先把它跑起来:安装和首启最卡人的环节不是模型,是环境

2.1 安装前先把 Node 和包管理器这类基础环境理顺

DeepSeek Harness 和许多前端工作流工具类似,安装路径绕不开 Node.js、pnpm/vpm 这类包管理器。为什么要强调这一点?因为大量新用户在这一步不是被功能难住,而是被环境问题卡住:Node 版本太旧,pnpm 没有安装,或者网络环境不稳定导致依赖包下载失败。

在实际项目里,我一般会先做一套固定动作:

node -v pnpm -v

然后根据结果判断版本是否满足要求。这里有一个容易踩的坑:不要因为当前是最新版本就觉得一定没问题。有一些工具链对 Node 大版本很敏感,太新的主版本有时也会遇到原生模块编译失败。最稳妥的办法是先按项目说明锁定一个已知可用的 Node 版本,再安装依赖。

不建议直接把安装包塞到系统全局目录里反复试错。我更推荐建一个专门的工作目录,让 DeepSeek Harness 的依赖和插件都放在这个目录内统一管理。这样以后升级、备份、迁移时都更清楚,不会出现“我到底把什么东西装到了哪里”的灵魂拷问。

2.2 第一次启动常卡在“pnpm dsh web”这类命令附近

从社区讨论和很多新手的反馈来看,一个高频卡点是首次启动 Web/Studio 界面。如果你是用命令行方式启动,常见命令形态类似:

pnpm dsh web

不少人执行这条命令后,终端会出现长时间没有任何输出,或者一直停在某个下载/编译过程。很多人第一反应以为是死机,其实这个阶段通常在完成三件事之一:

  1. 安装剩余的子依赖;
  2. 准备工作目录与默认配置文件;
  3. 启动本地 Web 服务或桌面端资源。

排查时不要急着反复重启命令。先看几类信息:

  • 终端有没有继续打印日志;
  • 对应端口是否被占用;
  • 是否有独立的下载进程卡在网络请求上;
  • 是不是缺少系统级构建工具导致依赖编译失败。

常见现象与排查顺序可以参照这个表格:

现象优先检查项
命令执行后无输出日志是否被缓冲,等待网络超时
卡在下载阶段镜像源、是否缺少离线资源、磁盘空间
报 node_modules 相关错误pnpm 锁版本是否变化,删除 node_modules 重新安装
页面打开了但一直转圈后端服务是否真实启动,端口是否被防火墙拦截
启动时报缺 Python/构建工具是否有需要 node-gyp 编译的原生依赖

不要在一个错误上无限尝试。如果删掉依赖重装两次仍然失败,就应该把完整日志保存下来,再把环境版本、操作系统、安装命令一起记录下来去搜索,而不是猜。

2.3 启动之后,先用一条“最小回路”验证可用性

很多工具第一次启动成功后,用户的第一个动作是立刻尝试各种复杂案例。我更建议反过来,先走一条最小回路:能启动页面、能选择模型服务、能输入一句话并拿到输出,然后立刻停下来。

最小回路的价值在于,它把“环境没问题”和“功能没问题”切成两件事。如果最小回路都没通过,后面所有插件问题都很难判断是主框架没装好,还是某个插件自己的问题。相反,如果最小回路已经通了,后续加插件、改流程时就有了一个稳定参照。

这里要特别提醒:不要把第一次跑命令时用了多少环境变量、配置文件、代理设置看成无所谓的细节。最好把启动命令和关键配置写成一个脚本或 markdown 备忘,放到项目目录里。否则下次重启电脑后,你可能要重新折腾半小时才能恢复同样能用的状态。

注意:凡是第一次启动提示要下载资源或模型文件,尽量不要直接跳过。跳过固然能让界面快一点出现,但后续大概率会因缺少本地资源而出现更奇怪的错误。

3. 插件到底是怎么工作的:把“一切皆插件”翻译成工程语言

3.1 不是把文件丢进目录就能叫插件

很多产品把“插件化”做成一个很表面的能力:你可以在某个目录里放一个文件,它就能被扫描到,然后加载。但真正的插件化,核心是“接口契约”。什么叫接口契约?就是框架规定插件必须暴露什么入口、接收什么格式的输入、返回什么格式的输出、在哪个生命周期被调用。

如果你把插件系统想象成电脑主板,框架就是主板上的插槽,插件就是内存条或显卡。主板不会关心每根内存条内部怎么设计,但会强制它们遵守统一的金手指位置和通信协议。正因为插槽协议是固定的,不同厂商的硬件才能替换。DeepSeek Harness 如果真的想做到“万物皆可 DIY”,就必须定义一个足够稳定、足够清晰的插件协议,否则插件装得越多,系统会越混乱。

所以,一个新用户上手时,最该看的不是“哪个插件看起来很炫”,而是“这个插件如何描述自己的输入和输出”。一个能很好地处理文本的插件,和一个能调用本地文件系统的插件,它们的生命周期和权限要求完全不同。

3.2 插件的生命周期可以分为五段

无论插件代码内部多复杂,在宿主框架眼里,一个插件的生命周期大致可以分成以下阶段:

  1. 注册:框架发现插件目录下的清单文件,读取名称、版本、入口、权限声明。
  2. 加载:框架把插件代码加载到可执行环境中,这时不一定立即运行。
  3. 校验:检查插件声明的输入、输出和依赖是否与当前框架版本兼容。
  4. 执行:用户或流程触发插件,传入上下文参数,插件返回结构化结果。
  5. 卸载/失效:插件被禁用、删除,或升级后接口不兼容导致无法加载。

理解这个生命周期的意义在于,当你遇到“插件装上了但不生效”或“插件运行结果不对”时,可以先判断问题出在哪个阶段。如果是加载阶段失败,通常是版本或路径问题;如果是校验失败,通常是接口定义不匹配;如果是执行阶段失败,那才需要看你的业务逻辑。

3.3 插件真正操作的不是“按钮”,而是“上下文”

很多 DIY 新手会误以为插件就是“给界面增加一个按钮”。实际上,插件在流程里更重要的操作对象是上下文(Context)。上下文里通常包含当前任务输入、配置、日志对象、已经执行过的步骤产生的中间结果,以及允许访问的外部接口。

我见过比较顺手的插件使用方式,是把一次复杂的 AI 任务拆成几步:先由一个脚本插件把收集到的文本做清洗,再由一个模型调用插件生成摘要,之后由一个归档插件把结果写到指定文件,最后才轮到展示层把结果渲染出来。整个过程里,人只负责初始触发和最终确认,中间的组装都由插件协作完成。

这就是“万物皆可 DIY”区别于简单菜单定制的地方:它让用户有能力重新编排数据流,而不仅仅是更换按钮的位置。不过,这种自由也要求你具备“数据流思维”:每个插件的输入是不是上一个插件的输出?字段名是否对得上?异常时是重试还是中断?这些原本在代码里需要考虑的问题,会在插件化框架里演变成流程设计问题。

3.4 权限和安全边界不能靠插件自觉

插件化还有一个绕不开的话题:安全边界。如果一个插件系统允许执行本地命令、读写文件、访问网络,那么一个来源不明的插件就可能读取敏感文件,甚至把你的 API Key 传输出去。这也是为什么一个成熟的插件框架通常要求插件在清单里声明权限,比如“本插件需要读取哪个目录”“本插件需要访问哪些网络域名”。

对个人 DIY 使用者来说,这条可能觉得麻烦,但它是长期可控的前提。我的建议是:尽量只使用来源明确、文档完整、更新活跃的插件;在开发自己的插件时,不要贪图方便,把所有权限都声明成“读写全部文件”。一个插件权限越小,越容易排查问题,也越容易在团队里推广。

注意:真正的安全不能依赖“这个插件看起来没问题”。如果 DeepSeek Harness 将来建立起活跃插件市场,安装前先看版本、发布时间、依赖项和 Issue 区,应该成为基本习惯。

4. 自己写一个最小插件:从“改两个字”开始理解整套机制

4.1 前提:先复制一个样例插件,而不是凭空建目录

很多人一谈到 DIY,就习惯从零开始写代码,结果第一步就卡在不知道文件该放哪、清单怎么写。更好的路径是找到工具自带的样例插件,复制一份,然后在一个最小改动上验证闭环。

原因很简单:样例插件是官方或社区验证过的路径,你复制后能保证目录结构、入口文件名、导出格式大概率不会错。直接在这个基础上改,比看着文档猜结构要快得多。改完后再到框架里启用它,看是否能在流程中调用到。

在写自己的插件前,请务必确认两件事:

  1. 当前安装的 DeepSeek Harness 版本支持什么插件格式;
  2. 它推荐的入口文件是 JavaScript、Python 还是其他脚本。

这两点不同,代码写法就会完全不同。以下内容只是一个通用示意,用来理解插件的最小结构,不是替你的实际版本下的结论。

4.2 一个“最小插件”的结构可以长什么样

从通用模式来看,一个插件通常由一个清单文件和一个执行文件组成。清单文件描述元信息,执行文件包含实际逻辑。下面是一个高度抽象的示意结构:

my-first-plugin/ plugin.json index.js README.md

清单文件可以写成类似这样:

{ "name": "my-first-plugin", "version": "0.0.1", "description": "一个只会在日志里打印内容的最小插件", "entry": "index.js", "inputs": ["text"], "outputs": ["text"] }

入口文件可以是一个接收上下文并返回结果的函数:

module.exports = async function (ctx) { const inputText = ctx.input.text; const prefix = ctx.config.prefix || "[自定义插件]"; return { text: `${prefix} ${inputText}` }; };

这个插件做的事很简单:从上下文里拿输入文本,加一个前缀,再返回文本。它没有任何外部依赖,也不会去访问文件或网络。但你已经可以把它接到一个流程里:让上一个文本生成插件输出一段内容,再让这个插件加一个标记,最后把结果展示出来。

4.3 从最小插件到真实任务,需要依次经过三个检查点

先别急着写出功能完整的业务插件。我建议把开发过程拆成三步:

  1. 固定输入检查:先输入一条固定文本,确认插件能拿到正确的上下文。
  2. 真实数据检查:换成一个真实的私有数据,确认结果的格式和内容符合预期。
  3. 异常路径检查:如果输入为空、字段缺失或依赖接口超时,插件会不会报错?有没有给上层返回可读错误信息?

很多人只做到了第一步就去铺开用,后面一旦遇到超时或数据格式变化,插件表现出来的不是报错,而是静默地返回一个异常值。这种问题最难排查。所以最小改动加上完整的三步检查,才是一个算得上“能用”的插件。

4.4 写插件时先回答好这五个问题

一个插件能不能从“能跑”变成“好用”,取决于几个容易被忽略的问题:

  • 这个插件是在什么触发条件下执行的:手动触发、定时触发,还是被流程自动调用?
  • 它需要读取哪些输入,输入字段缺失时该抛出错误还是给默认值?
  • 它会产生哪些副作用:会写文件吗?会调外部接口吗?
  • 它的配置在哪里维护:写在配置文件里,还是要在图形界面上填?
  • 它怎么记录日志:调试时能不能看到中间结果,线上运行时会不会把敏感信息打出来?

这些问题都不需要一次答完,但在开发前想一遍,能省掉后面大量返工。插件化最大的好处是每个模块可以独立演进,但前提是模块边界清晰。如果这五个问题都含糊,插件最终就会变成另一个不可维护的黑盒。

5. 从“自己能用”到“长期可用”:一条四阶段落地路径

5.1 大多数项目适合从这四个阶段循序渐进

无论你是个人开发者还是小团队,尝试 DeepSeek Harness 这类插件化框架时,我建议不要一步到位地规划“把所有业务都插件化”。一套更现实的路径分四步:

阶段目标关键动作产出
阶段一:演示验证主流程能跑通按默认配置完成一次端到端任务稳定的最简运行环境
阶段二:小样本验证插件化流程符合预期在 5~20 条真实数据上跑通并手工核对一批真实案例和失败样本
阶段三:成流程把常用的任务组合成可复用链路将多个插件串联,增加配置项和开关一套可重复执行的流程
阶段四:做维护考虑升级、成本、权限和团队协作补日志、异常处理、接口版本说明可以放心长期使用的状态

每个阶段之间的时间不宜拍脑袋。如果小样本阶段出现大量输出格式不一致、中途失败、结果不可复现,就不要急着进入自动化链路。先修复前一阶段的稳定问题。

5.2 工程化补课,重点在四件事

插件化环境要变成长期基础设施,不只是“跑起来了”就行。以下四件事是容易缺失但也最重要:

  • 日志:为每个插件单独记录调用的输入摘要、执行时间、返回状态和错误堆栈。否则出问题时只能全局翻,效率太低。
  • 错误处理与重试:外部模型接口经常超时或限流,文件操作也会碰到权限问题。插件要区分“可以重试的错误”和“重试也没用的错误”。
  • 配置管理:不要把模型名称、API Key、目录路径硬编码在插件代码里。使用统一配置,并区分开发与生产环境。
  • 权限与审计:哪些插件能访问什么数据,谁在何时执行过什么操作,都要有记录。个人使用可能不严格,但只要涉及团队或业务数据,这就是必须项。

这四点不是为了“看起来专业”,而是为了减少重复排查。一个能长期使用的插件系统,一定不是靠人每次手动记忆,而是靠日志和配置还原现场。

5.3 命令行、Web 界面、桌面版怎么选

DeepSeek Harness 如果同时提供命令行、Web 界面、桌面版/Studio 等不同形态,用户很容易纠结哪个更高级。但从实际场景看,它们不是替代关系,而是不同任务阶段的选择:

使用场景推荐形态原因
偶尔手动操作、想看看效果Web 界面/桌面版可视化程度高,反馈直接
批量处理文件、跑定时任务命令行适合脚本化、日志化、交给调度器
深度定制多个插件、调试流程Studio/桌面版通常能直接看到插件状态与日志
把能力集成进自己的产品命令行或嵌入式调用更适合作为服务或依赖接入

挑选原则不是“哪个更完整”,而是“哪个能让我现在的工作流最短”。如果只是处理三个文件,打开 Web 界面完成就够了。如果每天要处理一百个文件,就必须做命令行或批处理,否则再好看的界面也会变成效率瓶颈。

6. 当“一切皆插件”遇到现实:容易失败的用法和一条排查路线

6.1 插件化失败的大概率原因不是代码不够好

一个插件化框架用久了之后,你可能会遇到这些场景:某个插件突然不灵了;升级完主版本后大量插件报错;自定义流程跑到中间中断,但没有任何提示;新装插件和旧插件互相覆盖配置。这些问题的根源,通常不是你的代码写得不好,而是出现了生态层面的摩擦。

最典型的是版本兼容问题。插件接口一定会随着框架版本演进。如果框架升级后接口变化,旧插件没有跟上,就会启动失败或输出异常。所以在升级主框架之前,先看插件兼容列表和升级说明,已经成了必须养成的习惯。

另一个常见问题,是“自定义过度”。一个人可以 DIY 太多,最后搭出来的流程只有自己看得懂。等到过两个月再回来看,连自己也忘了当初为什么这样设计。解决方法是每做一个关键流程,就配套写一份简短的 README,记录输入、输出、插件顺序和异常处理逻辑。

6.2 一条可复用的排查路线

遇到“插件流程没有按预期工作”,先不要凭感觉卸载重装。可以按下面的链路逐层排查:

  1. 看现象:是报错、卡住、无输出,还是结果不对?先把现象写清楚。
  2. 查日志:找到这个插件对应时段的日志,看看哪一步失败、失败原因是什么。
  3. 隔离变量:先关掉所有自定义插件,跑内置示例;如果内置示例正常,再逐个启用插件,找到引入问题的那个。
  4. 查输入和输出:给插件一个固定输入,确认它拿到的字段是不是自己想要的;再确认它返回给下一个环节的字段格式是否正确。
  5. 查环境:用同一份配置在不同目录或机器上试一次,排除路径、权限、依赖包问题。
  6. 查版本边界:确认插件、主框架、模型服务、系统依赖四者之间的版本是否匹配。

这条排查路线之所以有效,是因为它控制住了一个最容易被忽略的变量:你永远要先确定问题是出在“环境”还是“逻辑”上。很多人出了错就急着改代码,改了半天,才发现是 Model API Key 过期。

6.3 什么情况下,应该果断放弃插件化

插件化很吸引人,但项目里也存在“用不上”的边界:

  • 一次性小任务:只做一次的数据清洗或文本生成,直接写个脚本或打开现成工具处理就好,不值得引入整个框架。
  • 性能和稳定性要求极高的关键路径:如果每一步都需要极低延迟,插件的通用封装和消息传递带来的额外开销,可能不如自己写一个深度定制函数。
  • 团队没有版本管理和测试习惯:插件化容易让流程变得分散。如果没有基本工程纪律,最后维护成本会超过收益。

另外,如果你只是“为了用功能而强行 DIY”,把本来简单的任务拆成五个模块,反而会让解决方案变复杂。合理的插件化应该是“因为有一个反复出现的稳定流程,所以要把它固化下来”,而不是“系统能装插件,所以我要把所有事都变成插件”。

6.4 对早期工具保持观察,但不要停止做最小实验

AI 工具现在正处于快速迭代阶段,今天的插件协议可能会在半年后变化。这并不意味着现在不该尝试。相反,最合适的方式是:选三个最消耗时间、重复度最高的任务,先在 DeepSeek Harness 里做成最小闭环。这样做,即使框架接口变化,你获得的经验也不会白费,因为你真正学到的是“如何把 AI 工作流拆成可复用模块”的判断力。

一段时间后你会发现,插件化真正的价值不是让系统无限发散,而是把“临时脚本”变成“可维护流程”。DeepSeek Harness 刚发布时铺天盖地的“一切皆插件”喊声容易让人高估短期的通用性,也容易低估长期的生态难度。新框架不会自动带来稳定的插件规范,需要社区、维护者和使用者一起把接口边界磨清楚。

所以,你现在最值得做的第一件事,不是去把十几个插件都安装好,也不是立刻自定义一套复杂工作台,而是先跑通一个最简单的任务。让工具在你自己的机器上稳定运行起来,看清它默认给出了什么结构、日志写在哪儿、插件样例长什么样。先把最小回路打通,再去谈万物皆可 DIY。毕竟,能把自己手里最重复的那件事做成可复用流程,已经比“万物皆可 DIY”这个口号实用得多了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 9:00:46

从Hy3到Hy4 Preview:腾讯混元大模型迁移实战笔记

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

作者头像 李华
网站建设 2026/9/5 9:00:19

SPC不是画控制图,是一套”防火系统”

【新版SPC手册解读②】一个灵魂拷问:你家是装烟雾报警器,还是等着叫消防车?先问个问题:假设你是开饭馆的,后厨防火有两种策略——策略A:装满烟雾报警器、定期检查燃气管道、给员工做消防培训,火…

作者头像 李华
网站建设 2026/9/5 9:00:04

不用手动!Word Copilot批量插入超链接

撰写大健康行业调研、康养项目方案、慢病用户分析报告,文档动辄几十页,包含多个细分板块:亚健康群体、中老年康养、居家健康器械、营养膳食、睡眠管理等。手动给关键词做章节跳转超链接,耗时又容易遗漏。 大健康消费者调研报告&am…

作者头像 李华
网站建设 2026/9/5 8:57:48

直播录像技术处理全流程:从文件解析到自动化管理实战

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

作者头像 李华