• React 19创建 JSX 元素的速度为什么会更快?
  • 发布于 1周前
  • 55 热度
    0 评论
  • 那场梦
  • 18 粉丝 42 篇博客
  •   
2023年04月09日,随着 React Server Components 的出现,我们看到 React 进入了第三个时代。

2024年02月15日,React 发布了 2024 年开发计划。到 2024 年底,你可能再也不需要这些 API 了:
.useMemo, useCallback, memo → React Compiler,React Compiler 不再是一个实验项目了,以后 useMemo, useCallback, memo 这些被所有人所诟病的 API 就都不需要了,理解上会简单的多。
.forwardRef → ref is a prop
.React.lazy → RSC, promise-as-child
.useContext → use(Context)
.throw promise → use(promise)
.<Context.Provider> → <Context>
2024年04月11日,React 19 创建 JSX 元素的速度将更快!下面来一起看看为什么会更快?

从历史上看,JSX 运行时克隆了传入的 props 对象,主要有两个原因:
1.React 保留了某些 prop 名称,如 key 和ref(在 React 19 之前)。这些不是真正的 props,并且目标组件无法观察到它们,React 在将它们传递给用户空间之前会在 props 对象中将其删除。

2.经典的 JSX 运行时 createElement 既是编译器目标,又是可以手动调用的公共 API。因此,我们不能假设传入 createElement 的 props 对象在传入后不会被用户空间代码修改。


然而,新的 JSX 运行时 jsx 不是公共 API,它只是一个编译器目标,编译器将始终传递一个新的内联对象。因此,只有在使用了保留的 prop 名称时才需要克隆 props。

在 React 19 中,ref 不再是保留的 prop 名称,而 key 只会在 props 对象中出现,如果它被展开到元素上(因为如果 key 是静态定义的,则编译器会将其作为单独的参数传递给 jsx 函数)。因此,仅在 key 被展开到元素上时才需要克隆 props 对象,这种情况很少见,而且在开发过程中还会触发警告。

在未来的版本中,我们将不会从 props 对象中删除扩展 key。(但是我们仍然会发出警告)我们将始终直接传递该对象。预期的影响是大大加快 JSX 元素的创建速度,而在许多应用程序中,这是渲染的整体运行时成本的重要部分。
用户评论