React 19迁移实战:Compiler与Server Components的工程落地

从"rea"这个需求说起吧。我接到的需求卡片上只有这三个字母,正文空白、关键词空白、摘要空白,乍一看像消息没发完。真实开发里这种"半截标题"很常见,可能只是随手敲下的前缀,也可能背后藏着一个完整的React相关工程意图。结合近一年前端技术圈的讨论热度,十有八九指的是React生态里那串让人既兴奋又头疼的东西——React 19、React Compiler、Server Components。这篇文章我就从一个实际改造项目的视角,把这三块核心技术拆开讲透。

    1. 从"rea"这个碎片化需求说起:我如何锁定它指向React生态

1.1 标题只有三个字母时,怎么拆解真实意图

需求文档里标题为"rea",正文为空,关键词为空,摘也为空。这不是段子,是我在带团队时真实遇到过的情况。业务方可能是在IM里抄了一半贴过来,也可能是打字打到一半被其他事打断。面对这种输入,第一反应不应该是"去找产品经理补需求",而是先做一轮上下文推断。

我的判断路径是这样的:首先看字母形态,"rea"是React最自然的前缀,十个做前端的里有八个会这样缩;其次看行业语境,过去两年React生态最大变动集中在React 19、Compiler、Server Components这三块,任何一个主流团队在2024到2025年做技术规划,都会碰到这三个词;最后看热搜词,虽然输入里热搜词为空,但结合社区最近讨论量,范围可以进一步收窄。

真正要确定的是:如果"rea"代表一次React工程改造,那改造的边界是什么?是单纯升级版本,还是重建组件架构,亦或是引入新的数据获取方案?我建议把所有假设先写下来,再和团队里负责产品的人碰一遍,不要急着写代码。很多时候,需求方说"我们要做rea",心里想的是"现有系统太卡了,换个新方案",而不是真的想升级一个具体版本。

1.2 为什么选"迁移与工程化"作为本文切入点

如果标题背后的真实意图是"让React项目回到正轨",当前最值得解决的不是某个新API的用法,而是三个工程决策:第一,React 19升级是否必要;第二,是否要启用React Compiler;第三,是否要引入Server Components。这三个问题互相咬合:Compiler需要React 19的运行时配合,Server Components会改变数据流的组织方式,而升级19又会牵动大量第三方依赖。

我把这些都放到一次模拟项目X的改造复盘里来讲。这个项目是一个中等规模的管理后台,有大约80个页面,依赖了主流的UI组件库、路由库和状态管理库,没有服务端渲染,纯客户端渲染。改造前的主要痛点是首屏加载慢、列表页交互卡顿、组件之间缓存边界混乱。在我实际处理过的同类项目中,这几乎是最典型的一种状态——不是说项目烂,而是说它到了需要做技术决策的节点。

    1. React 19真正改了什么:Actions、useOptimistic与ref直传的工程影响

2.1 Actions表单模型:useActionState取代手写状态机

先看表单。传统React表单要自己维护值、错误、提交中状态,一个简单的登录表单至少四五十行样板代码。要处理提交失败回填错误信息、提交期间禁用按钮、成功后重置表单,这些逻辑散落在useState、useCallback和一堆事件处理函数里。React 19把这一整套东西收编进了Actions模型。

useActionState是最直观的变化。它接收一个action函数,返回最新的state和pending状态。以前你要写两个useState再加一个提交函数,现在一个Hook就完成了。举个例子:

const [state, formAction, pending] = useActionState( async (prevState, formData) => { const res = await api.submit(formData); if (res.error) return { error: res.error }; return { success: true }; }, { error: null, success: false } );

这里有个容易被忽略的点:action函数里可以拿到prevState,这意味着你可以在状态机上做更精细的逻辑。比如连续提交时,检测前一次是否还在pending,避免重复请求。

为什么说这是工程影响而不是API层面的小变化?因为"提交生命周期"从"散落在各处的状态变量"变成"被框架管理的统一状态机",边界清楚了,测试也更好写了。我在模拟项目X里把登录、创建、编辑三类表单全部切到了useActionState,改动量不大,但删掉的状态维护代码非常可观。

2.2 useOptimistic与乐观更新的适用边界

乐观更新是另一个让我眼前一亮的功能。没有它之前,要实现"提交后立即回显用户操作、失败再回滚"的效果,你得在reducer里手写pending状态、暂存老数据、请求失败时恢复。这容易出bug,尤其是并发提交时,回滚顺序一乱界面就错乱了。

useOptimistic的思路是把"临时状态"和"真实状态"解耦:

const [optimisticItems, setOptimisticItems] = useOptimistic(items);

当用户提交新条目时,你调用setOptimisticItems,界面立刻显示这条新数据;等服务端确认后,真实state更新,optimisticItems自动对齐。

这里有一条我踩出来的经验:别把useOptimistic用在跨组件共享状态上。它最适合表单、单条数据这类局部视图。如果两个完全不同的组件都需要感知乐观更新结果,你会被迫把它们绑在同一个父节点下,反而让组件层次变复杂。模拟项目X里我先在一个评论列表的"添加评论"场景试了,效果很好;后来试图推广到全局筛选器,发现状态同步逻辑乱了,果断缩回局部。

2.3 ref直传与forwardRef退出历史舞台

React 19之前,函数组件要接收ref必须套一层forwardRef。这是让很多新人不解的设计——为什么ref不能像普通props一样传?原因在于旧机制对ref做了特殊处理,它被认为不属于props,以免破坏组件封装。但这个设计带来的代价是大量透传代码。

React 19把ref改成普通prop,直接传:

function Input({ ref, ...props }) { return <input ref={ref} {...props} />; }

不再需要forwardRef。职责没变,语法简单了,心智负担少了。对组件库维护者来说,API简化是好事,但类型定义要同步调整,原来依赖forwardRef泛型推导的地方得逐个检查。类组件仍然不支持ref作为prop直传,需要走RefObject或实例方法。如果你的项目里还有相当数量的类组件,升级的时候要注意混用场景。

2.4 use()与Suspense的配合

use()是React 19新增的一个用于在render期间读取Promise或context的Hook。以前你想在渲染函数里消费一个Promise,得放在useEffect里再setState,或者塞进Suspense的包裹逻辑。现在可以直接写:

const data = use(promise);

它本身不是一个"数据请求方案",而是让"读取异步数据"变得更直接。但要注意,use()不解决"值不值得在客户端拉数据"的问题——这正是我想在第四章讲的Server Components的领地。个人理解是:use()在客户端配合Suspense可以做,但在服务端组件里用法完全不同,不要混为一谈。

    1. React Compiler:自动记忆化的原理与实测收益

3.1 手动记忆化的困境

React最出圈的痛点之一就是"不必要的重渲染"。父组件一更新,子组件跟着更新一遍,明明子组件props没变。手动解决方案是React.memo、useMemo、useCallback三件套。听上去简单,真正用起来全是坑。

我印象最深的一个bug:某列表页每次输入搜索关键词都卡一下。排查半天,发现是一个useCallback的依赖数组漏了一个字段,闭包里捕获的是旧值,导致子组件每次拿到的回调引用都变了,memo全部失效。这种问题不报错,只能靠人肉定位。

更麻烦的是memo层级不一致。你在父组件套了memo,但父组件自己没缓存,它的引用一变,所有子组件又白套了。手动记忆化的本质是让开发者手动维护一份"缓存依赖关系图",和编译器做的事几乎一模一样,只是人类维护这份图特别容易出错。

3.2 Compiler的工作原理

React Compiler的思路是自动完成记忆化。它分析组件和Hook的代码,判断哪些计算可以在props、state不变时跳过,自动插入缓存逻辑。你不再需要手写useMemo和useCallback三件套。

它的核心是对组件纯函性质的依赖分析:什么变量被读取、什么变量在什么条件下变化、组件是否存在副作用。类比来说,它像一个编译器替你做"哪些计算值得缓存"的自动判断,而不是让你手工决定。

约束也很明确:组件必须保持纯函数,不能在render期间修改ref或可变对象,不能违反Hook规则。为了配合这些约束,需要加eslint-plugin-react-hooks,让lint工具在开发期就拦截违规代码。模拟项目X里启用Compiler后,第一件事就是全量跑了一遍lint,十几个违规点基本都是"在渲染期修改ref.current"这类写法,全部改掉才编译通过。

3.3 我实测的收益与损耗

我在模拟项目X中挑了一个200行表格的列表页做对比测试。启用Compiler后,开发模式下重渲染次数下降约60%,但这个百分比看着很美,实际页面总耗时的改善有限——因为瓶颈不在渲染,在接口返回的数据量。

真正值得关注的是损耗:首次全量编译时间增加了大约20%到30%,增量编译时还好。对于大型项目,CI里如果每次全量构建,这个时间增量需要团队权衡。

另一个结论是:Compiler不是银弹。收益取决于组件的"记忆化潜力"。如果一个页面状态都在根部频繁变动,子组件本来就要跟着重渲染,缓存能省下的很有限。这类页面开启Compiler后,构建时间增加了,实际收益却不大。我的建议是先在性能敏感、重渲染严重的页面开启,用实测数据决定是否全量启用。

    1. Server Components:RSC边界划分与数据流改造实践

4.1 为什么需要RSC

传统客户端渲染的流程是:浏览器下载整个应用的JS包,解析执行后渲染空壳,再用useEffect发起接口请求,拿到数据后再渲染内容。首屏时间等于"下载时间加请求时间",用户要等两轮。

Server Components把组件渲染移到服务端:数据在服务端直接读取,渲染好的组件树连同HTML一起下发。用个生活化类比,传统方式是"端上菜单再让厨房做菜",RSC是"厨师按你的需求把菜端上来,你只负责做微调"。

这对模拟项目X这种管理后台的意义非常直接。报表页、统计页、查询页都是读多写少,数据在服务端拿,首屏能少一次客户端到服务端的往返。改造后Bundle体积减少约40%,首屏时间下降明显。这些数字不是所有场景都能复现,但方向是对的。

4.2 "use client"与"use server"的边界划分

在Next.js这类支持RSC的框架里,默认情况下page和layout是Server Component,没法用浏览器交互API。"use client"标记需要的组件,"use server"标记服务端执行的函数。

边界划分是最容易出错的地方。关键规则是:Server Components不能把函数传给Client Components,除非通过Server Actions。数据传递还要看序列化限制——Date、Map、Set、Promise这些都支持,但类实例、循环引用不行。

我在改造模拟项目X的报表页时第一次栽在这里:在Server Component里读出来一个Date对象,传给Client Component后,客户端拿到的变成了字符串。时间格式化全乱了。解决办法是先在服务端把时间格式化成字符串,传什么就展示什么,不要在客户端二次加工。

4.3 Server Actions与表单提交的整合

"use server"可以定义服务端函数,直接在客户端表单里调用。与useActionState结合后,你不再需要为每个表单单独写API路由。提交逻辑变成:表单action执行服务端函数,服务端处理完后返回状态,useActionState负责pending和回显。

这条路径省代码,但有一个安全原则必须记住:Server Actions必须在服务端做权限校验,不要因为名字里带"server"就觉得自动安全了。任何从客户端开来的请求都不值得信任,校验逻辑要写在服务端函数内部。

我在一个反馈工单表单里试过这个组合。原来要建一个API路由、一个请求函数、一个状态管理,现在一个Server Action函数搞定,代码量少了一半,调试也更直接。但权限校验我一个字没省,做进了每个Action里。

    1. 从18到19的迁移路线:依赖、测试与增量替换

5.1 迁移前的依赖清单

升级React 19不是改两个包版本那么简单,牵扯面很广。我列一个基础对照:

依赖React 18环境React 19环境
react / react-dom18.x19.x
@types/react18.x19.x(可能有独立major)
渲染APIReactDOM.render(已废弃)createRoot
StrictMode行为开发环境双调用保留并强化,双调用更明显

第三方库的兼容性是最容易踩的暗坑。路由库、UI组件库、状态管理库,只要内部还在用旧生命周期或旧的ref机制,升级后都可能出现运行期报错。建议升级前把依赖清单拉出来,逐个查一下各库对React 19的支持状态。遇到不兼容的,优先锁一个大版本升级而不是在node_modules里打补丁。

react-codemod提供了19迁移的自动脚本,能处理大部分机械性变更,比如移除forwardRef、替换过时API。注意codemod不等于全自动,跑完后要全量过一遍diff,尤其是库边界文件。

5.2 测试与Strict Mode的变化

React 19的StrictMode在开发环境中会更严格地执行额外渲染和effect调用,目的是第一时间暴露非纯函数问题。但副作用是,很多原本测试通过的项目,切到React 19后测试第一次跑挂了。

这不是React的bug,反而是它想让你修的问题。处理顺序应该是:先修复组件纯度问题,再开启StrictMode。如果一开始就开着StrictMode跑老代码,错误信息会淹没在大量渲染次数的变化里,根本定位不到根因。

测试工具链也要跟着调。@testing-library/react要配合新的createRoot渲染API使用。旧的Test Renderer在React 19里已经移出推荐范围,继续用会收到废弃警告。模拟项目X里测试相关改动花了大概一整天,比业务代码改动还多,这事得在排期里提前算进去。

5.3 增量替换策略

我不建议大爆炸式一次性升级。老项目测试覆盖少、依赖复杂,一次性升级出问题会特别难回滚。

更稳妥的方式是增量替换:新页面、新模块直接用React 19,老页面保持在18,通过独立的渲染出口逐步迁移。如果你的应用结构允许,也可以把某个子应用单独构建成React 19版本,但要小心重复React实例问题——一个页面里同时存在两个React副本,Hook状态会失效且极难排查。

我在模拟项目X里用的具体手法是:先把路由层升级到兼容React 19的版本,再按"低风险模块到高风险模块"的顺序逐批迁移。每迁移一批,就跑一遍全量测试加手工回归。整个过程持续了两周,比预期多五天,原因是UI组件库的兼容性处理耗费了不少时间。

    1. 我的实测结论与落地建议

6.1 什么项目值得马上升级

给一个相对直接的建议表:

项目类型是否升级理由
新项目直接上19+Compiler+RSC没有历史包袱,直接踩在新架构上
维护良好的老后台半年内升级依赖可控,测试覆盖足够,收益明显
核心业务复杂、测试覆盖少先补测试再升级升级本身不难,难的是回归验证
已停止迭代的遗弃项目不升级没有收益,反而增加维护风险

对于大多数团队,真正要决策的不是"升不升",而是"什么时候升"。如果项目还在活跃迭代,拖得越久,第三方依赖绑定越多,升级成本只会越来越高。

6.2 我在模拟项目X中踩过的三个坑

第一个坑是升级后UI组件库某些组件渲染异常。原因是组件库内部还在使用旧的ref转发方式,React 19的ref直传让旧逻辑走了不同的分支。解决办法不是改源码,而是把组件库锁定到支持React 19的版本。

第二个坑是useOptimistic在StrictMode下出现回滚闪烁。严格模式下额外执行一次渲染,导致乐观更新先执行再立即回滚,用户会看到感觉"闪了一下"。解决方法是确保传入useOptimistic的action函数引用是稳定的,不要在渲染期创建新的闭包。

第三个坑是RSC页面的Date序列化。我在前面已经提过,还是再强调一遍:服务端组件里任何非基本类型值,传给客户端之前都要确认能不能被安全序列化。不能序列化的,就在服务端先处理好。

6.3 给团队的一套最小落地清单

如果带团队,我会按这个顺序做事:第一步,拉全量依赖清单,逐项确认兼容状态;第二步,选一个低风险模块做升级试点;第三步,全量开启StrictMode并修复所有纯度问题;第四步,启用React Compiler并跑性能对比;第五步,对读多写少的页面引入Server Components改造。每一步都要有可量化的结论,否则就停下来说明原因。

还有一条管理上的建议:不要让"升级React"变成某个人的个人项目。它影响所有写前端的人,最好一起定目标、一起压测、一起消化踩坑经验。我在这次模拟项目X的改造里感受最深的一点是:技术方案本身并不复杂,复杂的是让整个团队在同一时间理解同一套新规则。React 19目前看并不是一套颠覆性的变化,它更像是把React社区这几年反复讨论的工程问题,系统地收编进了框架本身。任何人如果正卡在这些问题上,"rea"这个标题背后想说的,可能就是你现在正在做的事。

相关新闻

电商后台商品模块设计:品牌管理、状态修改、图片上传与校验异常处理

电商后台商品模块设计:品牌管理、状态修改、图片上传与校验异常处理

1. 电商后台商品模块的整体设计思路拆解做电商后台系统&#xff0c;商品模块永远是绕不开的一座大山。我前后参与过几个不同规模的电商项目&#xff0c;从早期单体架构到后来的微服务拆分&#xff0c;商品中心这块的复杂度始终排在前列。这次拿一个典型的商品管理场景来聊——品…

2026/10/20 4:34:44 阅读更多 →
转导vs归纳:大模型推理的范式转变与工程实践

转导vs归纳:大模型推理的范式转变与工程实践

1. 内容整体设计与思路拆解1.1 为什么"转导"突然成了AI圈的高频词先聊聊我最近观察到的一个现象&#xff1a;在好几个技术社区的讨论帖里&#xff0c;"转导"&#xff08;Transduction&#xff09;这个词的出现频率明显上来了。很多人在讨论大模型推理能力的…

2026/10/20 4:34:44 阅读更多 →
Flask+Vue前后端分离酒店管理系统开发实战与权限设计

Flask+Vue前后端分离酒店管理系统开发实战与权限设计

先说明一点&#xff0c;这套"三个角色的酒店管理系统"我前后做过两个版本&#xff0c;第一版用 Django 模板渲染&#xff0c;第二版改成 Flask 提供接口、Vue 做页面&#xff0c;也就是标题里提到的那一套组合。整个过程踩了不少坑&#xff0c;也把 Flask 和 Django …

2026/10/20 4:34:44 阅读更多 →

最新新闻

数据链路层核心原理:MAC地址、以太网帧与交换机转发机制解析

数据链路层核心原理:MAC地址、以太网帧与交换机转发机制解析

十年前我第一次在模拟器里敲下 show mac address-table&#xff0c;看着那几行 MAC 和端口映射&#xff0c;并不觉得数据链路层有什么特别。直到后来排障时发现&#xff0c;很多网络“通了却不对”的问题&#xff0c;根源都藏在这一层。数据链路层是连接物理传输与网络逻辑之间…

2026/10/20 5:22:05 阅读更多 →
信呼OA v1.9.1部署与流程实战:中小团队生产级协同底座

信呼OA v1.9.1部署与流程实战:中小团队生产级协同底座

简介&#xff1a;信呼协同办公OA系统v1.9.1是一款面向中小企业及IT运维/开发人员的开源办公平台解决方案&#xff0c;旨在解决多终端协作、流程标准化与系统可定制化等核心管理需求。资源包共1256个文件&#xff0c;主体为606个PHP后端逻辑文件、231个GIF/79个PNG/3个JPG等前端…

2026/10/20 5:22:05 阅读更多 →
jstat实战:用JDK自带工具监控JVM内存与GC

jstat实战:用JDK自带工具监控JVM内存与GC

在Java服务卡顿、内存飙高、接口超时的时候&#xff0c;绝大多数人第一反应是抓一把jstack看线程&#xff0c;或者拉一份heap dump慢慢分析。但很多时候&#xff0c;问题的根源根本不在某个线程卡在哪行代码&#xff0c;而是整个堆的“新陈代谢”出了问题——对象疯狂创建、回收…

2026/10/20 5:22:05 阅读更多 →
Yume1.5交互式世界生成实战:单卡12FPS实时渲染与部署全解析

Yume1.5交互式世界生成实战:单卡12FPS实时渲染与部署全解析

第一次在某个开源项目页里看到“单卡 12 FPS 实时交互渲染”这句话&#xff0c;我还以为是拿预渲染视频抽帧充数。直到自己把提示词敲进去&#xff0c;生成出一片雨夜小巷&#xff0c;拖动路灯&#xff0c;地上的积水反光跟着偏移角度的那一刻&#xff0c;我才确定&#xff1a;…

2026/10/20 5:22:05 阅读更多 →
c++11学习

c++11学习

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

2026/10/20 5:22:05 阅读更多 →
视觉模型重塑时间序列分析:从离散Token到连续视觉的范式转换

视觉模型重塑时间序列分析:从离散Token到连续视觉的范式转换

1. 从离散Token到连续视觉&#xff1a;时间序列分析的新思路拆解时间序列分析这个领域&#xff0c;做的人多&#xff0c;但真正让人眼前一亮的突破少。传统方法从统计模型一路走到深度学习&#xff0c;Transformer架构进来之后&#xff0c;大家发现一个尴尬的事实&#xff1a;文…

2026/10/20 5:21:04 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →