VoidZero与Rust重写前端工具链:从Oxc到Rolldown的范式重构
那一天下午我的电脑风扇转了大概五分钟刚好是npm run dev之后最熟悉的动静。启动一个中型管理后台Vite 5配Rollup项目里大概1500个依赖包首次冷启动要等十几秒热更新碰上大组件偶尔也卡。更让人难受的是ESLint全量检查跑一次要好几秒TS类型检查还得另算。这些时间碎得像沙每天都漏掉一点但你总觉得这就是前端开发的常态。直到尤雨溪带着VoidZero入场。如果你过去一年关注过前端圈应该已经看到不少关于Oxc、Rolldown、oxlint这些名字的技术讨论。它们的共同点是用Rust重写JavaScript工具链的底层从编译器、打包器、linter到类型检查全部推翻重建。这不是给Webpack换个配置、加个缓存那么简单而是对整个构建与开发基础设施的一次范式级重构。这篇文章想聊的不只是VoidZero发布了什么。我想拆开它的技术路线搞清楚一个核心问题为什么一个以写JavaScript框架闻名的人最终会亲自下场去重写工具链这场重构到底动了谁的蛋糕又给普通前端开发者的日常带来了什么。1. JavaScript工具链的慢到底慢在哪要理解VoidZero的价值得先理解痛。很多人以为前端构建慢是项目太大了但项目大只是一部分原因更根本的问题是我们一直在用JavaScript去解析JavaScript、用JavaScript去编译JavaScript、用JavaScript去检查JavaScript写出来的代码。1.1 从一次等构建的经历说起我手头有个业务项目代码量不算夸张20万行左右。开发模式下Vite冷启动大概8到12秒这是指浏览器真正能打开页面。可一旦你改了某个被大量import的工具模块热更新经常要两三秒状态还偶尔丢。生产构建走Rollup加上Terser压缩、ESLint收尾全量下来经常逼近3分钟。这种体验持续了一年多。同事们的普遍反应是忍忍就过去了。但我一直觉得不对劲为什么写C、Go的人从来没有这种等构建的体验甚至写Python的人虽然解释执行慢但启动一个开发服务也就是秒级的事。后来我意识到根子出在工具链选型上。我们用的Webpack也好、Rollup也好、Babel也好都是JavaScript写的。JavaScript是一门为浏览器设计的解释型语言它本身的优势是生态大、上手快但作为编译其他代码的基础设施它的执行效率有个天然的天花板。1.2 慢的根源纯JavaScript实现的解析与转换链路做个粗颗粒的对比。JavaScript解析器比如Babel用的babel/parser在纯JS环境下解析一个1MB的文件需要做大量的动态类型判断、对象属性访问、字符串操作。V8引擎再怎么优化JIT编译也扛不住这种高频的字符级操作。而Rust编写的解析器比如Oxc的parser在编译阶段就把所有这些热路径编译成了机器码内存分配更可控字符串处理走零拷贝策略。官方博客给过一个benchmarkOxc的parser在解析JavaScript代码时速度大概是Babel parser的5到10倍在部分场景可以达到更高。听起来只是快了几倍但你要知道工具链的每个环节都是互相叠加的——解析慢、转译慢、压缩慢、lint慢每一步都在指数级放大等待时间。ESLint的底层也是用JS写的规则引擎跑一万条规则就要做一万次AST遍历。Oxc出品的oxlint则完全不同它在Rust层做了一大堆并行化和规则预过滤实测中同样体量的项目oxlint全量检查能在几百毫秒内跑完ESLint动辄好几秒。这不是快了一星半点是数量级的差距。1.3 原生语言重写的本质把解释型引擎换成编译型引擎有人觉得用Rust重写是某种炫技其实不是。这里的本质是把工具链从运行时解释执行换成了编译期生成机器码。拿打包器举例。之前用Rollup它的核心逻辑是读取模块、递归解析依赖、生成chunk。每一步都涉及大量的AST操作和模块间数据流转。JS写出来的代码内存模型里有大量对象引用和垃圾回收压力。Rust版本Rolldown则把模块图的数据结构设计得更加紧凑利用Rust的所有权模型和并行化能力在ARM和x86架构上都能稳定发挥。所以VoidZero做的事情本质上是在对过去二十年JavaScript everywhere的一次纠偏JavaScript应该被用来写业务逻辑和应用逻辑而不是用来写编译器和基础设施。那些对性能极度敏感的工具链层交给更适合的系统语言来做这是一条被Go、Rust生态反复验证过的路线。2. VoidZero的技术底座Oxc、Rolldown与原生语言路线VoidZero不是凭空冒出来的。从公开的技术演进路线来看它由一个叫OxcOxidation Compiler的Rust工具链项目扩展而来针对前端开发中最耗时的几个环节逐一攻破。2.1 尤雨溪为什么选择从编译器层入手过去几年很多团队都在试着优化前端构建。有人做缓存有人做按需编译有人做商业化CDN。尤雨溪的选择不太一样——他从编译器层开始直接切中所有工具链的共同底座。任何前端工具都绕不开解析。无论是Babel转译、ESLint检查、Webpack打包、还是TypeScript类型分析第一步永远是把源代码变成AST。如果你能把AST生成这步做到极致那么所有上层工具都能受益。Oxc的核心目标就是把parser、transformer、minifier、linter全部在Rust层做掉并且让它们共享同一个编译器基础设施。这有点像你想改造一座城市的交通如果只加宽某一条马路很快另一个路口又会堵。但如果你先把轨道交通的底层打通那么整个城市的通勤效率都会上台阶。Oxc就是这个轨道交通底网。2.2 Oxc一个集解析、转换、压缩于一体的Rust工具链Oxc的全称是Oxidation Compiler里面包含了很多子项目oxc_parser最快的JavaScript解析器之一支持最新的ECMAScript语法和JSX、TS语法。oxc_transformer负责做语法降级和代码转换目标是替代Babel的一部分职能。oxc_minifier代码压缩器对标Terser压缩速度和效果都有明显提升。oxc_linter也就是oxlint对标ESLint。oxc_resolver解决Node模块解析算法对标enhanced-resolve。这套设计最聪明的地方在于模块化。你不用一次性全量替换可以先用oxlint替换ESLint感受一下速度也可以先在构建流程中引入oxc_parser替换掉原来的parser看看有没有兼容问题。它是一把把换上去的手术刀而不是直接要求你把整个手术台都换了。2.3 Rolldown用Rust重写Rollup兼容插件生态Rolldown是VoidZero项目在打包器层面的核心产品。它的目标不是造一个全新的打包器而是做Rust版的Rollup。为什么要兼容Rollup而不是另起炉灶因为Rollup的插件生态太成熟了。社区里大量现成的插件都是围绕Rollup API写的比如rollup/plugin-commonjs、rollup/plugin-node-resolve、rollup/plugin-terser。如果Rolldown不兼容这套API所有插件都要重写那迁移成本高到没人愿意用。Rolldown在兼容Rollup插件接口的同时把底层模块图构建、代码生成、tree-shaking算法全部用Rust重新实现。这就使得它既能无缝接管现有Vite项目又能在性能和构建质量上实现数量级的提升。2.4 Oxidation Compiler的模块化设计每个环节都可以独立使用很多人在看VoidZero的时候容易把它理解成一个大而全的框架比如要全套接入才行。实际上恰恰相反Oxc和Rolldown的设计都刻意保持了独立性和可插拔性。举个例子我可以先只使用oxlint来替换ESLint做代码检查。这个替换不需要改动构建链路也不需要改代码。跑一遍之后如果发现某些规则的不一致还可以通过配置逐步对齐。之后再把项目里的Vite升级到新版本让Rolldown接管打包这两个替换动作互不干扰。这种渐进式替代的策略很务实。它承认老项目不可能一个月内重构完所以给了一条平滑的过渡路径。让工具链的升级不再是一刀切的推倒重来而是像换轮胎一样一个一个地换换到哪个都能立刻开。3. 范式级的重构从更快到更简单速度只是表面现象。VoidZero真正想做的事情是通过统一基础设施让前端开发的复杂度降下来。3.1 从各自为政到一条流水线一次解析、多方受益我最烦的一件事是同一份代码在工具链里被反复解析。Babel解析一遍做转译ESLint再解析一遍做检查Terser又解析一遍做压缩Rollup还要解析一遍做打包。同一个AST每个工具都用自己的方式生成一遍既浪费CPU又容易出现每个工具理解不一样导致的结果偏差。Oxc的设计目标是让这些环节共享同一个AST和同一套编译基础设施。理论上一次解析的结果可以被转译、lint、压缩、打包共同复用整个链路只需解析一次。这就像一座工厂里同一个原材料进门之后所有工序都在一条流水线上完成而不是每个车间都派人到门口把原材料重新搬一遍。实际落地到工程上带来的提升非常直观冷启动时间大幅缩短热更新更快构建更稳定。而且由于各环节使用同一个编译器某些每个工具理解不一样导致的隐性bug也会变少。3.2 Vite与Rolldown的结合开发态与构建态的鸿沟被填平Vite 5时代一个常年被吐槽的问题是开发环境和生产构建行为不一致。开发模式下Vite用esbuild做依赖预构建用原生ESM跑源码生产模式下Rollup做打包再进行压缩和代码分割。因为底层不一样同一个组件在开发环境表现正常一到生产构建就报一个奇怪的循环依赖错误。这种割裂感让老前端非常难受。Rolldown接入Vite之后开发态和构建态可以统一到同一套Rust打包引擎上。你在开发环境看到的热更新行为和最终构建产物的行为底层逻辑是一致的。这种一致性带来的不只是性能提升更重要的是心智模型的简化——你不用再为开发环境正常、构建报错这种玄学问题浪费半天时间排查了。3.3 Lint、类型检查、打包、压缩四周围生态的整体升级VoidZero显然不满足于只解决打包器的问题。它把触手伸到了前端工具链的各个痛点上工具类型现有主流方案VoidZero方案核心优势解析/转译BabelOxc Transformer解析速度提升明显AST共享LintESLintOxlint速度数十倍提升规则兼容度好打包Rollup/WebpackRolldownRollup插件兼容Rust底层压缩TerserOxc Minifier压缩速度更快压缩率相近类型检查tscOxc/solatedDeclarations等提供部分类型的加速方案注意上面的类型检查一行VoidZero没有直接说完全替代tsc因为TS类型检查是个极其复杂的系统短期内不可能全部重写。但它在逐步提供更快的路径。比如通过Oxc在语法层面快速发现类型错误把tsc做成兜底让开发者在绝大部分场景下获得秒级反馈。3.4 Rust工具链的互操作N-API/FFI周转以及对JS的降级兼容策略前端工具要让普通开发者用上Rust能力中间必须有一层桥接。类似esbuild那样通过Go编译成二进制再通过child_process调用Rust方面则通常通过N-APINode-API来暴露接口。VoidZero的做法是利用N-API把Rust层的解析、转换、lint能力暴露给Node.js调用。这样开发者依然是在Node生态里写代码但底下跑的是Rust实现。遇到不支持的环境或需要调试的场景它也有降级策略确保基本功能可用。这种外层兼容、内层重构的思路最大限度地降低了使用门槛。4. 老项目怎么落地迁移路径与踩坑记录说了这么多原理你可能更关心老项目能不能迁迁起来痛不痛我拿自己负责的一个ViteReact项目以及另一个Webpack老项目分别做了迁移试验踩了一些坑分享一下实际路径。4.1 用oxlint替换ESLint最安全的第一步我的建议是如果你还没做好全面切换的准备先从oxlint入手。它是所有组件里迁移成本最低的一个。操作上先在package.json里加个脚本{ scripts: { lint:oxlint: oxlint . } }以一个中型项目为例原先ESLint跑全量检查约6到8秒oxlint首次运行约1到2秒冷启动之后甚至可以控制在0.5秒以内。区别肉眼可见。不过要注意几个坑部分ESLint规则在oxlint里支持度还不是100%比如某些需要类型信息的规则可能需要配合typescript-eslint正在进行中的支持。如果项目里自定义了很多本地私有规则要把它们转成oxlint的插件格式官方文档里有对应指南。建议先在CI里同时跑ESLint和oxlint对比一段时间确认规则覆盖和错误报告一致后再逐步切换。4.2 从Vite 5升级到适配Rolldown的版本注意依赖兼容如果你用的是Vite 5想升级到带Rolldown的版本比如社区实验性的rolldown-vite整体流程比想象中顺。它尽量做到Drop-in Replacement——原来怎么配置Rollup现在就怎么配置Rolldown。我踩到的坑主要有插件兼容性大部分Rollup插件能直接工作但个别依赖Rollup内部未公开API的插件会失效。好在这种插件数量极少一般都能找到替代品。自定义chunk文件名策略Rolldown对chunk命名的部分细节和Rollup不完全一致如果你的CI里有快照测试或者严格的产物校验要先跑一遍对比。循环依赖处理Rolldown对循环依赖的检测更严格原来Rollup不报错但实际有问题的代码可能会在升级后暴露出来。这不能算坏消息但会带来临时的工作量。建议先在一个独立分支做升级验证用生产构建产物和旧版做对比确认资源体积、懒加载行为、动态导入路径都没问题再合并。4.3 渐进式接入Oxc的解析/压缩不必一次性全换有些项目还在用Webpack升级Vite本来就是一个大工程。这种情况下你可以考虑在现有Webpack流程里局部接入Oxc能力。比如用oxc_loader替换掉项目中的部分babel-loader职责或者通过oxc/transformer做转译。又比如压缩阶段把terser-webpack-plugin换成基于oxc-minifier的插件。这种小步替换的收益非常直接改动范围却很小。我做过一次测试只是把压缩器从Terser换成oxc-minifier在保证压缩率基本不变的前提下生产构建的总时间缩短了大约20%到30%。这个时间省下来整个发布流程都更从容。4.4 Webpack老项目的迁移判断什么时候值得动很多人问Webpack老项目到底要不要迁。我的判断标准很简单看你是不是每天都被构建时间或热更新效率困扰。如果项目常年稳定、构建时间可接受那完全不必赶时髦如果组里已经有人因为构建慢而抱怨了好几个月那就值得花时间评估。迁移路线建议分三步走先在前端不感知的情况下用oxlint替换ESLint立刻获得快的体验再用roadmap里成熟的方案把开发服务器或构建器换成兼容层工具最后再考虑全量迁移到Vite/Rolldown让开发态和构建态走向统一。这个过程不用一步到位。工具链重构是一场马拉松不是百米冲刺。5. 新范式对前端开发者的真实影响聊完怎么迁再看这波重构对人的影响。工具链的演变从来不只是性能数字的冷冰冰迭代。它会反过来改变我们写代码的方式、排查问题的方式甚至能力模型。5.1 从工程优化到底层重构工具链定位的根本转变过去几年前端性能优化更多是工程层面的——拆包、缓存、并行化、SSR、边缘渲染。这些都是好手段但都是在既有工具链框架内做文章。VoidZero带来的最大信号是不把工具链当成配置就完事儿的黑盒而是把它当成可以重写、可以自控的底层设施。这让工具链性能和框架运行时性能站在了同等重要的位置上。未来前端基建的边界会被进一步向上推。往小了说这是尤雨溪个人职业生涯的一次大胆转型往大了说这是一个典型的技术信号——编译器和系统级能力正在重新成为前端圈的核心竞争力。5.2 前端工程师的能力模型了解编译器底层不再是加分项以前写前端可以完全不懂Babel的插件原理、不懂AST、不懂Rust依然能写出很好的业务代码。但现在我会劝身边刚入行的同事如果时间允许去了解一点编译原理的基础知识去上手写一个最小的AST插件。这不代表所有人都要去学Rust。但你需要理解Rust工具链和纯JS工具链的差异理解AST生成的代价理解为什么同一件事用系统语言写快了10倍。这些底层认知会直接影响你在选型时的判断力不然就只能人云亦云地跟着框架走。5.3 我对这套新工具链的实操体会最后聊点个人感受。我最近已经把主力项目的lint全部切到了oxlint编辑器保存时的即时反馈让人心情愉快生产构建也在一部分项目里试用了Rolldown构建时间肉眼可见地缩短。但我仍然保留ESLint用于生产前的最终校验因为部分自定义规则的兼容性还没到100%。我的建议是如果你是个人开发者或者小团队直接上最新工具链完全没有问题收益立竿见影如果你在一个有着大量历史包袱的大型项目里不要着急先把工具链的切换当成一个季度级别的专项来做逐步替换每个环节独立验证。工具链的重构浪潮才刚刚开始。现在入场你不需要背任何历史包袱可以直接生在一个更快、更简单的开发环境里。而站在我这种经历过Webpack慢启动时代的人的角度看这种感觉有点像突然换了一台新电脑——明明还是写着同样的代码但整个人都轻快了不少。

相关新闻

Unity接入iOS APNs推送全链路指南:证书配置到真机避坑

Unity接入iOS APNs推送全链路指南:证书配置到真机避坑

上线前最后一天,测试同事拿了一台iPhone过来,当着我面杀掉App进程,然后从后端触发了一条推送。我等了三十秒,通知栏纹丝不动。她没说话,但那个眼神我到现在都记得。排查了一下午,最后发现是证书环境配错——…

2026/10/17 23:38:35 阅读更多 →
景区旅游小程序源码拆包:PHP后端与小程序前端完整业务闭环

景区旅游小程序源码拆包:PHP后端与小程序前端完整业务闭环

简介:这份PHP经典源码面向旅游行业开发者与PHP学习者,提供景区旅游小程序V3.4.5完整实现,可用于搭建在线预订、景点导航与信息查询平台,适合中小型旅游业务二次开发或教学实战。压缩包共1952个文件,约27.88MB&#xff…

2026/10/17 23:37:34 阅读更多 →
随机森林算法详解:从原理到调参实战

随机森林算法详解:从原理到调参实战

1. 从单棵树到一片森林:为什么需要集成学习如果你之前接触过决策树,大概率会有一种感觉:这玩意儿单棵用起来挺直观,但总有点“飘”。数据稍微变一点,树的结构可能就完全不一样了,预测结果也跟着抖。我最早做…

2026/10/17 23:37:34 阅读更多 →

最新新闻

完整环境配置清单:ZenTorch、ZenDNN、PyTorch 与 vLLM 四件套版本兼容表(Phi-4-reasoning-plus-w4a16-llmcompressor 专用)

完整环境配置清单:ZenTorch、ZenDNN、PyTorch 与 vLLM 四件套版本兼容表(Phi-4-reasoning-plus-w4a16-llmcompressor 专用)

【免费下载链接】Phi-4-reasoning-plus-w4a16-llmcompressor 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Phi-4-reasoning-plus-w4a16-llmcompressor 点击查看 免费下载 本文面向初次部署 AMD CPU 量化推理模型的新手,围绕 Phi-4-reasoning-plus…

2026/10/18 0:24:12 阅读更多 →
MiniMax M3 API 全平台价格对比:官方、OpenRouter 与七牛云怎么选(2026)

MiniMax M3 API 全平台价格对比:官方、OpenRouter 与七牛云怎么选(2026)

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

2026/10/18 0:24:12 阅读更多 →
零基础学Blender:中文手册带你掌握建模、渲染与动画

零基础学Blender:中文手册带你掌握建模、渲染与动画

简介:Blender中文教程手册是一份面向零基础用户的完整入门指南,从界面布局、框架逻辑到核心操作流程均有详细讲解,内容覆盖3D建模、材质贴图、动画制作与渲染输出等关键技能,同时也能满足有一定基础用户的进阶学习需求。手册内容源…

2026/10/18 0:24:12 阅读更多 →
服务器运维:K3S 下 Jenkins 安装及配置的完整操作笔记(TaoToken 统一 Key 接入实践)

服务器运维:K3S 下 Jenkins 安装及配置的完整操作笔记(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/18 0:24:12 阅读更多 →
开发者指南:mlx_lm API集成NVIDIA-Nemotron-3.5-Lightning-30B-A3B-mxfp4的进阶技巧

开发者指南:mlx_lm API集成NVIDIA-Nemotron-3.5-Lightning-30B-A3B-mxfp4的进阶技巧

【免费下载链接】NVIDIA-Nemotron-3.5-Lightning-30B-A3B-mxfp4 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-mxfp4 点击查看 免费下载 本文面向刚接触 Apple Silicon 本地大模型的新手,讲解如何…

2026/10/18 0:24:12 阅读更多 →
从零开发轻量记事本:IndexedDB存储、自动保存与同步实践

从零开发轻量记事本:IndexedDB存储、自动保存与同步实践

记事本这玩意儿,看着简单,做起来全是坑。之前我接了一个内部工具需求,要做一款能随手记录、随时翻查、离线也不慌的轻量记事本,产品代号叫“轻记”。从UI线框到功能实现,前后大概花了三周时间,中间踩了不少…

2026/10/18 0:23:12 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →