Eclipse Theia 进程管理扩展深入解析:`@theia/process` 的架构、生命周期与实战指南
IDE代码编辑器开发工具前端桌面应用插件系统后端AI 应用【免费下载链接】theiaEclipse Theia is a cloud desktop IDE framework implemented in TypeScript.项目地址https://gitcode.com/gh_mirrors/th/theia点击查看免费下载theia/process是 Eclipse Theia 框架中负责进程管理的核心扩展它统一封装了“是否挂载终端”两大类进程的启动、通信与回收逻辑是终端、任务、调试等所有需要执行外部命令的功能模块的底层基石。阅读本文后你将掌握该扩展的两大进程模型RawProcess 与 TerminalProcess、进程生命周期事件体系、环形缓冲输出机制、Shell 命令构造器的平台差异处理并能基于仓库源码与测试用例理解其在实际功能中的落地方式。一、扩展定位一个扩展两类进程theia/process扩展在 packages/process/README.md 中给出的定位非常凝练Thetheia/processextension allows the management of processes started with or without aterminal.也就是说它管理的所有进程可以被划分为两大类不挂载终端without a terminal由 Node.jschild_process的spawn/fork直接启动的“裸进程”Raw Process适合后台执行、管道读写纯文本流的场景。挂载终端with a terminal基于node-pty在伪终端PTY中启动的“终端进程”Terminal Process适合需要交互式输入输出、终端尺寸调整、行编辑与颜色转义序列支持的场景。从源码结构看该扩展的代码分为common与node两大部分packages/process/src/common/进程管理类型定义、事件接口、Shell 命令构造器与引号处理前后端共用的纯逻辑层packages/process/src/node/真正执行进程的生命周期实现包括Process抽象基类、RawProcess、TerminalProcess、TaskTerminalProcess、ProcessManager、MultiRingBuffer及配套测试。在依赖层面packages/process/package.json 显示它仅依赖theia/core、node-pty1.2.0-beta.12、string-argv与tslib其中node-pty是伪终端能力的来源string-argv用于把命令行字符串解析为参数数组。二、统一抽象Process基类与生命周期事件所有进程在框架内部都被抽象为 process.ts 中定义的Process抽象类它实现了common层 process-manager-types.ts 定义的ManagedProcess接口。2.1 进程类型与启动选项common/process-manager-types.ts通过ProcessType枚举区分两类进程export enum ProcessType { Raw, Terminal }Process基类定义了两种启动选项分别对应 Node.jschild_process的spawn与forkexport interface ProcessOptions { readonly command: string, args?: string[], options?: { [key: string]: any } } export interface ForkOptions { readonly modulePath: string, args?: string[], options?: object }要点说明ProcessOptions的语义与 Node.jschild_process.spawn(command, args, options)一一对应options可透传cwd、env、stdio等标准字段ForkOptions的语义对应 Node.jschild_process.fork(modulePath, args, options)modulePath指向用当前 Node 解释器执行的模块文件基类通过isForkOptions判断只要选项对象中存在modulePath属性即视为 fork 模式见 process.ts。2.2 生命周期事件体系ManagedProcess接口暴露了四个关键事件与一个kill方法export interface ManagedProcess { readonly id: number; readonly onStart: EventIProcessStartEvent; readonly onExit: EventIProcessExitEvent; readonly onClose: EventIProcessExitEvent; readonly onError: EventProcessErrorEvent; readonly killed: boolean; kill(): void; }Process基类用四个Emitter实现这些事件见 process.ts其语义如下事件触发时机事件载荷onStart进程成功启动pid已就绪空的IProcessStartEventonExit进程退出但流可能仍在发送数据IProcessExitEventcode与signal二选一onClose进程退出且所有流均已关闭IProcessExitEventonError进程启动失败如 ENOENT / EACCESProcessErrorEvent带code字段的Error其中IProcessExitEvent的约定是恰好只有code与signal之一被设置export interface IProcessExitEvent { // Exactly one of code and signal will be set. readonly code?: number, readonly signal?: string }onExit与onClose的区分借鉴了 Node.jschild_process的语义exit事件在进程退出时立即触发而close事件要等到 stdout/stderr 流全部关闭后才触发因此onClose是判断进程资源完全释放的信号。基类在handleOnExit中会将_killed置为true后续所有调用kill()的操作都会变成空操作。2.3 进程当前工作目录查询Process基类还提供了getCwdURI()方法用于获取进程的当前工作目录并针对不同平台采用不同实现见 process.tsmacOS通过lsof -OPln -p pid | grep cwd解析Linux非 Windows通过读取/proc/pid/cwd符号链接获取Windows直接返回构造时记录的initialCwdoptions.options.cwd未指定时回退为模块所在目录。三、进程注册中心ProcessManager的生命周期管理每个Process实例在构造时都会把自己注册进ProcessManager见 process-manager.ts其职责包括分配唯一 IDregister()使用Math.floor(Math.random() * MAX_SAFE_INTEGER)循环生成未被占用的随机 ID并通过Mapnumber, Process维护自动回收进程一旦触发onError就会被自动unregister强制终止unregister()会先检查process.killed若进程仍存活则调用kill()确保终止后再从缓存删除应用退出清理ProcessManager实现了BackendApplicationContribution的onStop()在后端应用关闭时遍历并注销所有进程避免子进程泄漏删除通知通过onDelete: Eventnumber向外广播被删除的进程 ID。ProcessManager在后端 DI 容器中以单例inSingletonScope注册同时以BackendApplicationContribution的形式参与后端应用生命周期见 process-backend-module.tsbind(ProcessManager).toSelf().inSingletonScope(); bind(BackendApplicationContribution).toService(ProcessManager);四、无终端场景RawProcess与 spawn/fork 封装RawProcess见 raw-process.ts对应without a terminal的进程形态直接封装 Node.jschild_process若传入ForkOptions含modulePath则调用child_process.fork否则调用child_process.spawn三个流outputStream/errorStream/inputStream分别映射到子进程的stdout/stderr/stdin。4.1 启动失败的容错归一化RawProcess构造器对启动失败做了精心处理代码注释点明了不同平台的行为差异spawn will sometimes throw directly (EACCES on Linux), sometimes return a Process object with the pid property undefined (ENOENT on Linux) and then emit an error event.为此它做了两层归一化将spawn/fork同步抛出的异常捕获后通过emitOnErrorAsync异步触发onError事件保证错误总是以事件形式出现无论成功与否三个流都会被赋值为真实流或DevNullStream占位流见 dev-null-stream.ts避免客户端代码因字段为undefined而崩溃。DevNullStream是一个类似/dev/null的双工流写入直接丢弃读取立即返回 EOF配合autoDestroy: true构造选项使用。4.2 退出/关闭事件的归一化Node.js 的exit/close事件在未使用的参数上会传nullRawProcess在转发前会将其规范为undefined再调用基类的emitOnExit/emitOnCloseexit事件同时触发processManager.unregister(this)完成自动回收。4.3 RawProcessFactoryprocess-backend-module.ts通过工厂模式暴露RawProcessFactory每次调用都会创建一个以父容器为父级的子容器将RawProcessOptions绑定为常量后解析出新的RawProcess实例bind(RawProcessFactory).toFactory(ctx (options: RawProcessOptions | RawForkOptions) { const child new Container({ defaultScope: Singleton }); child.parent ctx.container; child.bind(RawProcessOptions).toConstantValue(options); return child.get(RawProcess); } );五、终端场景TerminalProcess与伪终端PTYTerminalProcess见 terminal-process.ts对应with a terminal的进程形态基于node-pty启动。源码注释特别强调Note: a PTY is not a shell process (bash/pwsh/cmd...)即 PTY 是承载进程的伪终端设备本身不等于某个具体 Shell。5.1 TerminalProcessOptions在ProcessOptions基础上终端进程额外支持两个选项export interface TerminalProcessOptions extends ProcessOptions { /** * Windows only. Allow passing complex command lines already escaped for CommandLineToArgvW. */ commandLine?: string; isPseudo?: boolean; }commandLine仅 Windows 有效允许传入已经按CommandLineToArgvW规则转义好的完整命令行isPseudo为true时不会真正启动进程而是使用PseudoPty占位见 pseudo-pty.tspid为-1所有事件均为空事件——用于只占槽位、无需真实进程的伪终端场景。5.2 node-pty 的错误归一化与 Windows 兼容createPseudoTerminal启动失败时代码会把 node-pty 抛出的异常归一化为接近child_process.spawn的错误形态File not found: ...或消息以ENOENT结尾设置errno ENOENT、code ENOENT、path options.command消息以EACCES结尾设置errno EACCES、code EACCESWindows 下若命令未以.exe结尾且原始命令找不到会尝试追加.exe重试对应NodePtyErrors枚举。node-pty 在 Windows 上以抛异常的方式报告错误因此错误统一通过emitOnErrorAsync异步派发给客户端留出注册错误处理器的时间。5.3 输出缓冲MultiRingBuffer终端进程的输出不会像RawProcess那样直接暴露子进程的 stdout而是写入MultiRingBuffer见 multi-ring-buffer.ts再由createOutputStream()返回的MultiRingBufferReadableStream供消费者读取。MultiRingBuffer是一个支持多个独立读者的环形缓冲区每个读者通过getReader()或getStream()创建各自维护独立的读取位置Mapnumber, number缓冲区满时按环形覆盖策略推进 tail落后的读者位置会被同步推进保证读到的一定是最新数据输出流实现了 Node.jsReadable接口支持pipe()到任意下游流并在销毁时自动关闭对应读者。默认缓冲区大小为 1MB该值目前是硬编码常量源码注释标注了TODO should be a user preference见 process-backend-module.tsbind(MultiRingBuffer).toSelf().inTransientScope(); /* 1MB size, TODO should be a user preference. */ bind(MultiRingBufferOptions).toConstantValue({ size: 1048576 });5.4 终端交互resize 与 writeTerminalProcess提供resize(cols, rows)与write(data)两个终端交互入口resize会先对参数做合法性校验非数字/NaN 直接忽略并把cols/rows强制约束到至少1防止 winpty 原生异常Windows 下使用DelayedResizer延迟 1 秒执行首次 resize规避 conpty 对过早 resize 调用不响应的问题实现参考自 VS Code 的 terminalProcesswrite将数据写入 PTY 输入与onData事件回传的输出形成完整的交互回路。5.5 退出事件的 node-pty 适配node-pty 会等待底层流关闭后才发出exit因此TerminalProcess自行模拟了exit与close的顺序onExit回调中先emitOnExit并注销进程再用process.nextTick异步补发emitOnClose。针对 node-pty 的平台怪癖——Linux/macOS 上正常退出时signal可能是0非法信号值——代码只在signal undefined || signal 0时使用exitCode否则将信号编号通过signame()见 utils.ts转换为信号短名后填入signal字段。六、任务终端TaskTerminalProcessTaskTerminalProcess见 task-terminal-process.ts继承自TerminalProcess专门服务于任务系统提供两个增强能力命令历史追踪OSC 133 注入当terminal.integrated.enableCommandHistory偏好开启时在任务命令启动/结束时向输出流注入 OSC 133 转义序列command_started/prompt_started供终端侧解析命令历史延迟注销onTerminalExit只有在attachmentAttempted已附加或尝试过附加时才注销进程修复了任务终端未附加时进程提前被回收的 issue #2961 场景。七、Shell 命令构造器跨平台命令行生成ShellCommandBuilder见 common/shell-command-builder.ts用于在某个可能是长期存活的宿主 Shell 内执行命令的场景。由于不能像 spawn 那样拥有干净的新环境它必须把环境变量修改、工作目录切换等操作编码进返回的命令字符串Bashcd cwd env KEYvalue ... command删除变量用env -u KEYPowerShellcd cwd; ${env:KEY}value; command删除变量用Remove-Item ${env:KEY}且对?、等特殊字符做了转义cmdcd cwd cmd /C set KEYvalue command默认兜底按 Bash 规则构造。构造器还会尽可能不对可执行名做引号转义——因为cmd这类 Shell 要求dir等内建命令保持未转义状态只有包含非单词字符needsQuoting用/\W/判断时才走转义路径。相关的引号函数BashQuotingFunctions、CmdQuotingFunctions、PowershellQuotingFunctions、createShellCommandLine、escapeForShell定义于theia/core的 shell-quoting 模块theia/process仅为向后兼容做了再导出见 shell-quoting.ts。八、DI 组装与扩展接入方式theia/process通过两个ContainerModule完成注册见 package.jsontheiaExtensions: [ { backend: lib/common/process-common-module, frontend: lib/common/process-common-module }, { backend: lib/node/process-backend-module } ]process-common-module.ts 将ShellCommandBuilder绑定为单例可被前后端共同使用process-backend-module.ts 完成全部后端绑定ProcessManager单例、RawProcess/TerminalProcess/TaskTerminalProcess瞬态作用域、三个工厂Factory 绑定、MultiRingBuffer瞬态及其选项常量。由于theia/process是后端模块使用方只需在自己的后端模块中注入对应工厂即可例如injectable() export class MyBackendService { constructor( inject(RawProcessFactory) protected readonly rawProcessFactory: RawProcessFactory, inject(TerminalProcessFactory) protected readonly terminalProcessFactory: TerminalProcessFactory ) { } runWithoutTerminal(): void { const proc this.rawProcessFactory({ command: ls, args: [-la] }); proc.onStart(() console.log(started with pid ${proc.pid})); proc.onExit(event console.log(exited with code ${event.code})); proc.onError(event console.error(failed: ${event.code})); } }九、测试用例行为契约的可验证依据仓库为两大进程模型提供了完备的测试可以作为行为契约的佐证raw-process.spec.ts 验证了不存在的路径触发ENOENT错误事件、不可执行文件触发错误事件、onStart事件、退出码、stdout/stderr 管道、fork 模式下的 stdout/stderr 管道terminal-process.spec.ts 验证了不存在的路径 / 尝试执行目录的错误处理Windows 上报ENOENT其他平台退出码为1、Windows 隐式.exe补全、退出码、输出流管道并注明 node-pty 不发送end事件需借助onExit判断结束multi-ring-buffer.spec.ts 覆盖环形缓冲的读写与多读者行为shell-command-builder.slow-spec.ts 验证跨平台命令构造。测试通过 process-test-container.ts 创建独立 DI 容器加载 logger 后端模块与processBackendModule来解析工厂fork 测试使用 process-fork-test.js 作为子进程脚本。可执行yarn --cwd packages/process test或运行仓库根目录的yarn test复现这些用例。十、典型使用链路与生态落点从源码依赖看theia/process的消费者遍布框架的多个功能模块终端packages/terminal使用TerminalProcess承载终端 Widget通过MultiRingBuffer的流对接前端 xterm 渲染任务packages/task使用TaskTerminalProcess运行任务命令并借助其 OSC 133 注入实现命令历史追踪调试packages/debug使用RawProcess启动调试适配器进程Debug Adapter以纯流方式交换 JSON-RPC 协议数据外部终端 / 进程工具链packages/process的ShellCommandBuilder与parseArgs基于string-argv见 utils.ts被广泛用于把用户输入的命令行字符串安全地拆分为参数数组。典型链路可概括为前端触发 → 后端工厂RawProcessFactory / TerminalProcessFactory创建进程 → 进程自动注册进 ProcessManager → 事件/流驱动前后端交互 → 退出或错误时自动注销回收 → 应用关闭时统一清理。十一、许可证与商标theia/process及其所在仓库采用 Eclipse Public License 2.0 为主许可证并附带 GNU General Public License, version 2 with the GNU Classpath Exception 作为次级许可源码头部的 SPDX 标识为EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0。“Theia” 是 Eclipse Foundation 的注册商标详见 packages/process/README.md。若需深入查阅该扩展的完整 API可参考仓库配套的 typedoc 生成的theia/processAPI 文档源码的全部公共导出集中在 index.ts。赞分享IDE代码编辑器开发工具前端桌面应用插件系统后端AI 应用【免费下载链接】theiaEclipse Theia is a cloud desktop IDE framework implemented in TypeScript.项目地址https://gitcode.com/gh_mirrors/th/theia点击查看免费下载相关推荐Eclipse Theia AI 接入 Anthropictheia/ai-anthropic 扩展包配置与实现深度解析Eclipse Theia AI 接入 Anthropic theia/ai anthropic 扩展包配置与实现深度解析 本文以 Eclipse TheiIDE代码编辑器开发工具前端桌面应用插件系统后端AI 应用深入Eclipse Theia架构前后端分离与扩展机制深入Eclipse Theia架构前后端分离与扩展机制 Eclipse Theia采用高度模块化的前后端分离架构通过基于JSON RPC的通信协议实现浏览器IDE代码编辑器开发工具前端桌面应用插件系统后端AI 应用Eclipse Theia theia/output 扩展深度解析:输出通道、命令体系与源码实现Eclipse Theia theia/output 扩展深度解析:输出通道、命令体系与源码实现 本篇技术指南围绕 Theia 仓库中的 theia/outIDE代码编辑器开发工具前端桌面应用插件系统后端AI 应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

图书销售管理系统数据库设计:从ER图到第三范式全流程实战

图书销售管理系统数据库设计:从ER图到第三范式全流程实战

简介:面向数据库课程大作业的图书销售管理系统数据库设计文档,完整覆盖从需求分析到实现操作的全流程。文档以SQL Server为平台,围绕图书信息、库存、销售记录、客户关系等核心模块展开,包含全局与局部ER图、逻辑表结构&#xff0…

2026/10/11 14:39:40 阅读更多 →
用impeccable构建可持续的代码质量检查体系

用impeccable构建可持续的代码质量检查体系

我先交代一下背景。我平时维护一个跨端项目,代码量不算大,但提交特别勤,光靠人工review根本盯不过来。之前也试过几款流行的静态检查工具,装完跑一遍,规则开太松等于没装,开太严又被一堆历史问题淹没&#…

2026/10/11 14:39:39 阅读更多 →
EndNote X6便携版安装配置指南:从环境检查到中英文切换

EndNote X6便携版安装配置指南:从环境检查到中英文切换

写文献综述写到半夜,参考文献格式被导师圈出来批了第八遍——这种时候你才会真正意识到一个顺手的文献管理工具到底有多重要。EndNote X6虽然是个2012年的老家伙,但直到今天还有大量研究生、科研人员在用:稳定、够用、投稿模板全,…

2026/10/11 14:39:39 阅读更多 →

最新新闻

autobind-decorator API速查表:boundMethod与boundClass完整参考指南

autobind-decorator API速查表:boundMethod与boundClass完整参考指南

【免费下载链接】autobind-decorator Decorator to automatically bind methods to class instances 项目地址: https://gitcode.com/gh_mirrors/au/autobind-decorator 点击查看 免费下载 autobind-decorator 是一个轻量级 JavaScript 装饰器库,能自动…

2026/10/11 15:29:06 阅读更多 →
无人机高速违章检测算法:YOLO多目标跟踪与车道线判定

无人机高速违章检测算法:YOLO多目标跟踪与车道线判定

简介:目标检测是计算机视觉中的基础任务,而YOLO系列凭借高效的单阶段推理架构,成为边缘设备实时分析的首选框架。在无人机巡检场景中,目标检测需面对俯视角度、小目标、动态光照和有限算力等多重约束。本文从原理出发,…

2026/10/11 15:29:06 阅读更多 →
YOLOv8森林烟雾火焰检测:从训练调参到边缘部署全指南

YOLOv8森林烟雾火焰检测:从训练调参到边缘部署全指南

简介:面向森林防火与实时视觉检测场景,这套基于YOLOv8的烟雾火焰检测资源提供了完整可运行的源码与配套数据集,适合计算机视觉入门及中级开发者在智慧林业、火灾预警等项目中快速落地。压缩包内共包含2003个文件,以987个jpg图像和…

2026/10/11 15:29:06 阅读更多 →
电子商店系统数据库设计:E-R图、数据字典与规范化全流程解析

电子商店系统数据库设计:E-R图、数据字典与规范化全流程解析

简介:这是一份面向数据库课程设计、系统分析与软件工程等场景的电子商店系统数据库设计文档,适合计算机、信息管理等专业的本科生、高职学生以及需要完成类似选题的开发者参考。内容围绕系统需求分析、数据字典、E-R图与数据流程图展开,并覆盖…

2026/10/11 15:29:06 阅读更多 →
可信计算3.0实战:从等保2.0合规到TPCM与TSB落地避坑指南

可信计算3.0实战:从等保2.0合规到TPCM与TSB落地避坑指南

简介:这份《可信计算3.0技术及其应用实践》PDF资料,面向网络安全从业者、等级保护测评人员及可信计算方向的学习者,围绕可信计算3.0的技术架构、发展趋势与落地实践展开,重点回应等级保护2.0对可信验证提出的测评要求。内容涵盖可…

2026/10/11 15:29:06 阅读更多 →
SRC漏洞挖掘实战从入门到变现:越权、逻辑漏洞与高质量报告全指南

SRC漏洞挖掘实战从入门到变现:越权、逻辑漏洞与高质量报告全指南

2026年,SRC漏洞挖掘依然是网安新手最值得投入的方向之一。我在带新人交流时经常遇到一种尴尬:CTF题打了不少,web、binary、逆向都练过,但真正面对一个真实企业目标时完全不知道从哪里下手。问题出在很多人把CTF当成了“全部”&…

2026/10/11 15:28:05 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →