深入解析 React Element:从 JSX 到虚拟 DOM 的渲染机制
1. 为什么说 Element 才是 React 的真正主角做了几年 React 开发天天写 JSX写完组件写状态管理可你有没有停下来想过一个问题每次 setState 之后React 到底是拿什么东西去跟页面上的老内容做对比的这个“东西”就是 React Element——也就是标题里那个“rea”对应的核心概念。我的理解里可以把 React Element 当成一次渲染的“最小交付物”。你对组件说“这次你要渲染成什么样子”组件就会返回一棵由 Element 组成的结构树告诉你答案。它不是什么高深莫测的虚拟 DOM 技术玄学就是一个用 JS 对象描述 UI 长什么样的普通数据。但这个普通数据是整个 React 运行机制的基石。很多人容易把 React Element 和虚拟 DOM 划等号其实两者不能混为一谈。虚拟 DOM 是一个更宽泛的概念指的是一整套保存在内存中的 UI 描述结构而 Element 是这套结构的基本单元。可以这样说一棵虚拟 DOM 树就是由无数个 Element 节点组成的。每次数据更新React 需要拿着新旧两棵 Element 树做比较然后再精准更新真正变化的部分。这篇文章我打算从 Element 的设计思路开始到它内部的数据结构再到自己手动实现一个简化版的渲染器最后整理几个实际开发中容易踩的坑。不是单纯给你讲文档而是把我自己从懵懂到通透的过程写下来。如果你写过一段时间 React但总觉得 React 内部像黑盒子或者你想搞明白 key、props、children 它们到底在 Element 层面长什么样子那这篇内容应该适合你。2. Element 的前世今生从 JSX 到数据结构的完整链路2.1 你写的 JSX是怎么变成数据结构的先看一段大家习以为常的代码const element h1 classNametitleHello, React/h1这行代码从语法上来讲既不是合法的 JavaScript也不是合法的 HTML。它是 JSX一种 JavaScript 的语法扩展。浏览器不认它JavaScript 引擎也不理解它。真正让这段代码跑起来的前提是它得先经过一层编译转换。在 React 17 之前Babel 会把这段 JSX 编译成React.createElement的调用// 你写的 const element h1 classNametitleHello, React/h1 // Babel 编译结果 const element React.createElement(h1, { className: title }, Hello, React)从 React 17 开始新的 JSX 转换机制引入了jsx和jsxs这两个函数它们由react/jsx-runtime模块提供不再强制依赖import React from react。但无论函数名怎么变核心逻辑大同小异接收类型、配置属性、子节点然后返回一个普通对象。这个普通对象就是 Element。它大概长这样{ type: h1, key: null, ref: null, props: { className: title, children: Hello, React } }可以看到JSX 里写的属性都被收进了props对象标签名变成了type字段而标签内嵌套的内容会被放到props.children里。所谓“JSX 是语法糖”本质上就是帮你省下了手写这些对象的时间。从这个角度再看“React 一切皆数据”这句话含义就清晰了。你写的组件、嵌套的子节点、模板上的属性编译器会帮你统一翻译成可读、可比较、可遍历的普通 JavaScript 对象。2.2 React Element、React Component、虚拟 DOM 三者的边界现在我遇到不少初学者聊天时会把这三个概念混在一起用。我踩过这个坑所以整理一张自己总结的对照表方便对照理解概念核心职责使用场景是否可以实例化React Element描述 UI 某个时刻的形态每次渲染都会生成不需要实例化React Component定义渲染逻辑与状态边界封装可复用的 UI 逻辑有实例类组件或函数执行函数组件虚拟 DOM整棵 UI 描述的树形结构协调层对比的依据由 Element 聚合而成它们之间的关系可以类比成“图纸”和“施工队”。Element 是图纸描述这一块墙要砌成什么样组件是施工队告诉你图纸是怎么生成的、用的什么材料、施工步骤是什么虚拟 DOM 则是整栋楼的图纸册由一页页图纸合订而成。所以真正的流程是组件执行函数组件就是调用函数类组件就是实例化后调用 render返回 ElementElement 聚合出虚拟 DOM 树React 拿这棵树和上一棵比对计算差异最后把差异更新到真实 DOM。2.3 为什么每条更新都要重建整棵 Element 树这里有个新手容易产生疑惑的点我只修改了一个输入框的值React 有必要把整棵树上的 Element 全部重新生成一遍吗从实际运行上看还真有必要。因为 React 并不知道哪一个组件依赖了修改后的数据为了保持实现简单和逻辑可靠它在每次状态变化时默认从根节点开始重新执行一遍组件函数。这里需要区分“Element 重建”和“DOM 重建”。React 每次渲染确实会从头调用组件函数生成新的 Element 树。但并不是每个 Element 变化都会导致真实 DOM 节点重新创建。协调阶段会判断新旧 Element 的 type 是否一致一致就保留现有 DOM只更新变化的属性或文本不一致才销毁重建。这个设计的精妙之处在于它把“数据变化 → UI 变化”这个本来是命令式的过程变成了“声明你要的结果其余交给 React 处理”。代价是需要多花一些 CPU 时间在对象创建和对比上但为开发者换来了异常简洁的编程心智负担。React 后来推出的 memo、useMemo 等优化手段本质都是绕开默认的“全量重建”机制只针对性能瓶颈做精准干预。3. 扒开 Element 的内部数据结构type、key、props、children 各司其职3.1 type 字段决定怎么处理这个节点的身份凭证Element 的type字段决定了 React 如何对待这个节点。如果type是字符串比如div、span、buttonReact 会把它映射为原生 DOM 标签。对应生成的就是一个宿主环境里的元素节点。这里的“宿主环境”可以是浏览器、移动端原生视图甚至是一段文本输出。如果type是函数或类React 就把它当作组件来处理。函数组件会直接被调用返回的 Element 继续展开类组件则会先实例化再调用实例身上的 render 方法把返回结果继续展开。这个过程不是一步到位的因为返回的 Element 里可能还嵌套了其他组件。React 会不断递归直到整棵树里所有非原生类型的节点全部展开成原生节点为止。我举一个具体的例子虽然基础但能直观展示这个过程function Greeting({ name }) { return p你好{name}/p } const element Greeting name张三 /这里element.type指向的是Greeting函数本身。React 在渲染时会执行这个函数得到真正的原生 Element{ type: p, key: null, ref: null, props: { children: 你好张三 } }这个递归展开过程其实就是 React 内部“从组件到最终 UI 结构”的核心链路。你可以把函数组件想象成一套生成器给它输入参数它吐出一段 Element 结构React 拿到这段结构后又发现里面还有自定义函数就继续执行直到整棵树全是原生标签。3.2 key 字段兄弟节点列表中的身份证书key 是大家在写列表时最熟悉的属性。它本质上是一个给协调算法用的标记信息不参与实际 UI 绘制但参与同样的兄弟节点列表比较。先看一下 key 在 Element 结构里的位置。它在最外层不挂在 props 下// 代码 const item li key1第一项/li // 生成的 Element { type: li, key: 1, ref: null, props: { children: 第一项 } }写 JSX 时key 写在标签属性位置但编译后它会独立到 Element.key 上不会混进 this.props。这样设计的好处很明确组件内部读取 props 时不会误用到 key协调算法拿取 key 做节点身份比对时也不需要遍历 props。key 的核心使用原则是要保证它在兄弟节点列表中唯一且稳定。为什么“唯一 稳定”很重要因为 React 处理列表时是通过新旧两个列表里相同位置的 Element 做对比的。如果两个 Element 的 type 相同、key 相同React 会认为它们“身份一致”保留原有节点只更新变化的 props如果 key 变了React 会直接认为这是两个不同的节点做删除旧节点和新建新节点的操作。用数组下标做 key 是目前最典型的反模式之一。当列表发生插入、删除、排序时元素的下标会变动React 可能复用错误的节点导致界面显示异常到了受控输入框或富文本场景会成为很难排查的 bug。正确的做法是使用数据里自带的业务唯一标识比如订单号、用户 ID 等。3.3 props 与 children看似简单实则藏着最多边界情况props里存放除了 key 和 ref 之外的所有属性。它可以是 JSX 写好的静态值也可以是展开运算的结果const config { href: https://example.com, target: _blank } // 下面的写法等价于逐个属性赋值 const link a {...config} relnoopener跳转/achildren 其实也只是一个属性但它特殊在支持多种类型共存于一个数组里。比如const block ( div 文本节点 span子元素/span {condition em条件节点/em} /div )编译后这些不同类型的子节点会被合并成一个数组放在props.children中。在实际编码里我发现很多问题都出在 children 类型判断上。比如是个字符串、一个 Element、一个数组还是一个布尔值它们的表现完全不同。React 官方推荐使用React.Children相关 API 来统一遍历 children原因就在这里原生 JavaScript 的数组方法对 children 的多种形态照顾不过来而 React 自己在协调层早就内置了一套稳定的子节点规范化逻辑。3.4 React 19 时代Element 结构有哪些新变化React 19 出来之后很多人最关心的是编译器功能。但我着重要说的是在 Element 层面官方也做了一些调整。最值得留意的变化是 ref 作为一种新的 props 传递方式被越来越多地使用类组件的 ref 沿用旧方式函数组件也可以在 props 里直接接收 ref不再需要 forwardRef 包裹。对 Element 数据结构本身而言type、key、ref、props 这个骨架并没有发生颠覆性变化。核心原因是整个 React 的架构体系从内部协调到外部生态都建立在现有 Element 模型之上改动这个基础结构牵一发动全身。框架设计者更倾向于往上层的编译能力做文章而不是重写底层数据结构。4. 手写一套简化版 Element 渲染器彻底看穿 React 的核心机制4.1 自建 createElement 函数不依赖框架也能生成 Element前面讲再多的数据结构都不如自己动手实现一遍来得透彻。我建议你动手实现一个最小可用的渲染器不用摸到 React 源码级别但可以对“Element→DOM”这条链路的原理看得明明白白。先自己实现一个createElement去掉所有复杂校验逻辑只要功能完整即可function createElement(type, config, ...children) { let key null let ref null if (config) { // 如果外部传入了 key 和 ref单独提取出来 if (config.key ! undefined) { key config.key delete config.key } if (config.ref ! undefined) { ref config.ref delete config.ref } } let props { ...config } if (children.length 1) { props.children children[0] } else if (children.length 1) { props.children children } return { type, key, ref, props } }实现这个函数你会发现 React 的createElement本质上就是一个纯数据加工函数输入类型和配置输出符合约定的对象。这也解释了为什么框架能如此高效地运行——它不依赖环境状态只用最底层的 JavaScript 对象就能表达完整的 UI 结构。如果你决定把这段代码放在项目里实测不妨对比一下手写返回结果和 React 实际生成的 Element 结构。在大版本一致的条件下它们几乎一模一样。我给你一个简易工具做观察在页面里打印组件返回的值import React from react function Inspect() { const element div classNameapp内容/div console.log(element) return element }刷新页面打开浏览器控制台你能直接看到那个包含 type、props、key、ref 的对象。这是我觉得最直观了解 Element 内部形态的方式比阅读任何文档都来得有效。4.2 用递归将 Element 转成真实 DOM有了 Element 结构下一步就是把他转换成浏览器能识别的真实 DOM。这一步我给一个极简实现思路function render(element, container) { if (typeof element string || typeof element number) { // 文本节点单独处理 const textNode document.createTextNode(String(element)) container.appendChild(textNode) return } // 如果 type 是函数或类展开组件 while (typeof element.type function) { element element.type(element.props) } // 原生标签场景创建 DOM 节点 const dom document.createElement(element.type) // 递归处理子节点 if (Array.isArray(element.props.children)) { element.props.children.forEach((child) render(child, dom)) } else if (element.props.children) { render(element.props.children, dom) } // 属性挂载简化版本只处理普通属性 for (const propName in element.props) { if (propName ! children propName ! key propName ! ref) { dom.setAttribute(propName, element.props[propName]) } } container.appendChild(dom) }这个 render 函数只有 30 行左右但已经包含了渲染器的核心逻辑遇到字符串和数字直接建文本节点。遇到函数组件先执行函数把结果展开成 Element 再继续。遇到原生标签创建对应 DOM 节点然后递归处理 children。最后把构建好的节点挂到容器里。这里有个细节值得留意我用了while而不是if来做组件展开。原因是组件的返回结果里可能又嵌套了其他组件必须循环处理直到全部展开为原生标签。这个循环次数取决于组件嵌套深度是框架处理嵌套组件时的关键路径。这段代码当然无法处理事件绑定、生命周期、状态更新等复杂功能但它足以揭示一个事实React 渲染的本质就是一棵 Element 树到宿主环境 API 调用的映射过程。明白了这一点后续再读 React 源码时你就有了一个可靠的地图。4.3 最小化调度器理解协调的雏形静态渲染只能跑一次真正的 React 是能响应变化进行更新的。我再给一个最粗糙的更新思路不涉及 fiber 架构和优先级调度只为理解“协调”是什么样的工作let currentRoot null let nextUnitOfWork null function workLoop(deadline) { let shouldYield false while (nextUnitOfWork !shouldYield) { nextUnitOfWork performUnitOfWork(nextUnitOfWork) shouldYield deadline.timeRemaining() 1 } requestIdleCallback(workLoop) } function performUnitOfWork(fiber) { // 这个函数负责处理节点信息、构建子节点链表、返回下一个工作单元 // 具体实现略核心是遍历 Element 树并记录每个节点的副作用更新、删除、新增 }requestIdleCallback 是浏览器提供的空闲时段回调React 用它来做“时间切片”保证长时间渲染不会卡住主线程。理解这个设计后你就明白为什么 React 渲染不总是同步完成——它可以分段执行。因为 Element 结构是一棵树天然适合深度优先遍历给“暂停、恢复”提供了数据结构上的支持。这部分不用深究细节只要建立“Element → Fiber → 宿主环境”的递进关系就足够了。Element 是输入描述Fiber 是协调过程的组织单元而宿主环境则是最终表现层。5. 工作中高频踩坑实录Element 层面引起的疑难杂症5.1 key 明明写了却没用上可能是上下文用错了有次做动态表单字段排序每个字段都配了唯一的 fieldId 作为 key结果拖拽重排后输入框里的值全乱了。打开控制台排查发现 React 报了“index as a key”的警告信息——其实有一个子元素用了下标 key而这个下标 key 所在的父元素是动态增删的容器不是我以为的数据项。这个问题的本质是同层兄弟节点之间是各自独立做 key 对比的不同层级之间互不影响。自己以为写了唯一 key其实那个 key 所在层级的兄弟节点都相同变化的数据项在别的位置。排查方法很简单看 React DevTools 在哪条警告处标黄顺着警告去查那一层的 key 策略而不是漫无目的地全局搜索。5.2 children 是数组还是单个元素判断逻辑比想象中更坑写组件时接收 children 很常见但我踩过一个坑组件库里有一段代码判断children.length 1时渲染列表布局否则渲染单个布局。结果单个文本节点传给组件时children 的类型是字符串字符串并没有 length 这个概念在 JS 中其实有但语义完全不同字符串的 length 是字符个数不是子节点个数。如果一个组件同时支持普通文本和元素列表安全做法是用 React 官方提供的React.Children.count和React.Children.toArray来统一处理。它们都会先把 children 规范成数组再统计或遍历绕开字符串、单个对象、数组这三种形态带来的歧义。这是我强烈建议加入自检清单的经验点。5.3 组件函数执行了但 UI 没更新检查是否把 Element 当成了缓存对象还有一次遇到缓存场景我希望某个子组件完全不重渲染就把它的 Element 整个放到 useMemo 的返回值里const childElement useMemo(() Child data{data} /, [])结果数据更新后 UI 纹丝不动。排查出来的原因很简单我把“组件渲染描述”误当成了“不可变快照”。Element 只是描述某一时刻的 UI它自己并不会监听数据变化也不会主动更新。一旦把组件调用结果缓存住期间 props 变更自然不能触发重新渲染。正确理解是组件函数每一次执行都是一次从 props 到 Element 的映射过程。优化颗粒度应该放在控制“何时重新执行组件函数”而不是缓存“组件执行的结果”。memo 这个 API 的机制就是在协调时帮你判断“组件 props 没变则跳过执行”这和缓存 Element 是两种完全不同的逻辑。5.4 直接修改 props 不生效的底层解释刚开始开发自定义组件时我犯过一个低级错误在某个方法里直接修改了 this.props 的某个属性以为这样就能让页面刷新。结果数据没动React 也没有任何响应。原因就是 React 把 props 当成不可变数据一旦 Element 生成props 就应该被冻结住。下一次想要新的 props就得通过父组件重新生成一个新的 Element。在 React 的设计哲学里props 方向是单向的。数据从上往下流组件自身不能改 props只能通过回调让上层更新数据上层通过新的渲染生成新的 Element下层才能拿到新 props。理解了这个单向数据流的约束就不会在调试时走弯路。6. 实操总结从 Element 到渲染的完整技术关键点再理一条我在写这套简化渲染器时梳理出来的关键链路。React 工作流程从编译器的视角看是“JSX → createElement → Element 对象”。这步只是搭建描述结构没有任何真实 DOM 参与。当你调用render或createRoot时React 进入协调流程组件执行 → 生成 Element 树 → 与已有 fiber 树对比 → 计算差异 → 更新真实 DOM→ 触发生命周期/副作用。这条链路里最核心的设计思想是“描述与实现分离”。Element 里的 type 字段并不直接拿着真实节点它只是一个凭证。原生标签凭证指向宿主 API 调用组件凭证指向用户自定义函数。框架通过这种间接性实现了跨平台能力同一套 Element 描述在浏览器里生成 div在移动端生成原生视图在终端生成文本。下面这个表格可以快速回顾本文的关键信息方便你收藏备用场景核心知识点常见误区写 JSX编译后生成 Element 对象以为 JSX 是原生 DOM自定义组件组件执行后返回 Element 树以为组件直接操作真实 DOM列表渲染key 帮助协调算法识别同层节点身份用数组下标作为 key性能优化memo/useMemo 控制组件执行次数直接缓存 Element 对象跨平台渲染Element 由宿主环境负责解释以为 Element 和 DOM 等同React 官方文档现在已经把核心思想定位为“UI 即状态函数”UI is a function of stateElement 就是这句话最底层的载体。组件根据状态计算出 ElementElement 描述了这一刻 UI 的全貌差值由 React 的协调算法去计算最终落到真实界面上。明白 Element 这个概念之后再去读 React 文档里的 forwardRef、memo、useMemo你会发现它们其实是在描述如何“控制组件执行时机”而不是“改变渲染方式”。我之前写优化代码时喜欢把各种缓存钩子堆上去现在会先问自己一句这次渲染产生的 Element 树到底哪里变了我能否让 React 只更新需要变化的部分。这里有个经验值得分享排查 React 性能问题的第一件事不是看组件代码里写了什么而是打印出当前渲染产出的 Element 结构与上一次的差异。差异最小、却仍然全量渲染的场景代表组件的执行控制出了问题差异巨大但页面表现正常代表协调机制在正常工作不必过度干预。把注意力从“怎么让页面更快”转移到“Element 的差异点在哪儿”之后我的排查效率提升得很明显。最后再提一个小技巧。如果你还在为 React 渲染机制犯迷糊试着去写一个自己的 JSX 转换插件亲手看看 Babel 把你写的模板代码编译成什么样子。不需要维护到什么程度哪怕是打印出文本转换结果你也会发现之前那些看着神秘的渲染魔法不过是函数调用和对象组合的艺术。

相关新闻

iTop开源ITSM实战:部署、数据模型与二次开发指南

iTop开源ITSM实战:部署、数据模型与二次开发指南

简介:iTop是一款基于CMDB与ITIL最佳实践的开源IT服务管理工具,面向企业IT运维人员、系统管理员及ITSM初学者,帮助组织梳理IT资产、规范服务流程并降低运营成本。资源包共约2000个文件,压缩后11.44MB,以2128个php源码、…

2026/10/18 16:43:41 阅读更多 →
AI Agent出海副业实战:从技术选型到稳定月入3-5万的交付方法论

AI Agent出海副业实战:从技术选型到稳定月入3-5万的交付方法论

最近总有人在私信里问我:“搞AI Agent是不是又一轮割韭菜?我看网上有人靠这个出海做副业,月入三五万,真的假的?”说实话,我算不上什么大牛,但认真做了大半年,粗算收入确实能落在3万到…

2026/10/18 16:43:41 阅读更多 →
手写 Tool Use 的三种方案:从提示词 JSON 到 ReAct 推理循环

手写 Tool Use 的三种方案:从提示词 JSON 到 ReAct 推理循环

面试官把电脑转过来,屏幕上一行字:手写一个 Tool Use。我盯着题目愣了两秒,然后笑了,这种题看起来简单,实际是最容易翻车的——很多候选人能把“调用工具”四个字说出来,却写不出一个能跑通的多轮闭环。Too…

2026/10/18 16:43:41 阅读更多 →

最新新闻

OpenHarmony奖品详情页开发:从数据模型到状态管理全解析

OpenHarmony奖品详情页开发:从数据模型到状态管理全解析

我先把前面五篇的进度简单对一下,免得有读者是从这一篇才跟上来的:目前这个幸运大转盘项目已经完成了转盘主界面、抽奖动画、奖品管理、中奖记录和中奖弹窗这几个核心模块。这一篇要补上的奖品详情,其实是把"用户点开某个奖品图标之后看…

2026/10/18 21:47:12 阅读更多 →
React Native键盘避让在OpenHarmony上的适配实践

React Native键盘避让在OpenHarmony上的适配实践

1. 为什么键盘避让在 OpenHarmony 上会成为问题?做跨端开发的人最头疼的一类问题,莫过于软键盘弹起来之后,输入框被死死挡住。在 React Native 项目里,大家的第一反应就是用官方提供的 KeyboardAvoidingView 组件;可一…

2026/10/18 21:47:12 阅读更多 →
量化投研遇上大模型:研究记忆的风险边界与工程实践

量化投研遇上大模型:研究记忆的风险边界与工程实践

1. 当量化投研遇上大模型:一个正在被重新定义的边界做量化投研的人这两年应该都有一个共同的感受:数据获取的门槛在肉眼可见地降低,但真正拉开差距的东西,反而越来越模糊了。以前我们拼的是谁的因子库更全、谁的行情清洗更干净、谁…

2026/10/18 21:47:12 阅读更多 →
PL/SQL Developer导出表全攻略:从选项拆解到踩坑排查

PL/SQL Developer导出表全攻略:从选项拆解到踩坑排查

很多PL/SQL Developer用户都会卡在“导出表”这一步。明明菜单里有个Export Tables,可真点进去又不知道该勾哪些选项,导出来的SQL文件拿去别的库一执行就报错,或者数据缺了一半。这问题特别常见,尤其在Oracle DBA和开发人员之间来…

2026/10/18 21:47:12 阅读更多 →
降低AIGC率有哪些方法?AIGC检测里摘要、综述AI率高分别怎么改!

降低AIGC率有哪些方法?AIGC检测里摘要、综述AI率高分别怎么改!

降低AIGC率有哪些方法?AIGC检测里摘要、综述AI率高分别怎么改! 拿到知网AIGC检测报告,你可能会看到这样的情况:全文AI率不算夸张,可摘要那一页的AIGC疑似度超过50%,第二章文献综述连着三四页大段标红&…

2026/10/18 21:47:12 阅读更多 →
Select模型详解:Windows Socket TCP服务端实现与优化

Select模型详解:Windows Socket TCP服务端实现与优化

聊到Windows下的网络编程,“五种I/O模型”绝对是一个绕不开的话题。很多人在面试或者做项目的时候第一次接触这个概念,当场就被Select、WSAAsyncSelect、WSAEventSelect、重叠I/O、完成端口这一串名词搞懵了。说实话,这五个模型确实容易让人望…

2026/10/18 21:46:11 阅读更多 →

日新闻

基于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/18 0:55:02 阅读更多 →
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/18 12:16:16 阅读更多 →