React 19 引入了多项革命性的性能优化特性,本文档系统介绍这些升级及其实际应用。
React Compiler 是 React 19 最重要的性能优化升级,它能够在构建阶段自动优化组件代码,减少运行时开销。
React Compiler 通过静态分析,自动为组件添加 memo、useMemo、useCallback 等优化,无需手动编写。
传统方式(React 18 及之前):
// 需要手动优化
import { memo, useMemo, useCallback } from 'react';
const ExpensiveComponent = memo(({ items, onSelect }) => {
const sortedItems = useMemo(() => {
return items.sort((a, b) => a.price - b.price);
}, [items]);
const handleSelect = useCallback((id) => {
onSelect(id);
}, [onSelect]);
return (
<div>
{sortedItems.map(item => (
<Item key={item.id} item={item} onSelect={handleSelect} />
))}
</div>
);
});React 19 + Compiler(自动优化):
// 编译器自动优化,代码更简洁
const ExpensiveComponent = ({ items, onSelect }) => {
const sortedItems = items.sort((a, b) => a.price - b.price);
const handleSelect = (id) => {
onSelect(id);
};
return (
<div>
{sortedItems.map(item => (
<Item key={item.id} item={item} onSelect={handleSelect} />
))}
</div>
);
};npm install babel-plugin-react-compiler// babel.config.js
module.exports = {
plugins: [
['babel-plugin-react-compiler', {
// 可选配置
compilationMode: 'annotation', // 或 'infer'
runtimeModule: 'react-compiler-runtime',
}],
],
};// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { reactCompiler } from 'babel-plugin-react-compiler';
export default defineConfig({
plugins: [
react({
babel: {
plugins: [
[reactCompiler, {
compilationMode: 'annotation',
}],
],
},
}),
],
});-
自动 Memoization
- 自动识别稳定的值和函数
- 避免不必要的重新计算
-
依赖追踪
- 精确追踪组件依赖关系
- 只在依赖变化时重新渲染
-
条件渲染优化
- 优化条件分支的渲染逻辑
- 减少无效的 DOM 操作
优势:
- ✅ 减少手动优化代码,提高开发效率
- ✅ 自动应用最佳实践
- ✅ 减少因忘记优化导致的性能问题
- ✅ 代码更简洁,可读性更高
限制:
⚠️ 需要构建时支持(Babel/Vite/Webpack)⚠️ 某些复杂场景可能需要手动优化⚠️ 编译产物可能略微增大(但运行时性能提升)
useEffectEvent 是 React 19.2 引入的新 Hook,用于更高效地处理副作用事件,减少不必要的重新渲染。
在 React 18 中,处理事件回调时经常遇到依赖问题:
// React 18 - 存在问题
function ChatRoom({ roomId, theme }) {
const [message, setMessage] = useState('');
useEffect(() => {
const connection = createConnection(roomId);
connection.on('message', (msg) => {
showNotification(msg, theme); // theme 变化会导致重新连接
});
connection.connect();
return () => connection.disconnect();
}, [roomId, theme]); // theme 变化会断开重连,影响性能
}// React 19 - 使用 useEffectEvent
import { useEffectEvent } from 'react';
function ChatRoom({ roomId, theme }) {
const [message, setMessage] = useState('');
// useEffectEvent 创建一个稳定的事件处理函数
const onMessage = useEffectEvent((msg) => {
showNotification(msg, theme); // theme 可以访问最新值,但不会触发重新连接
});
useEffect(() => {
const connection = createConnection(roomId);
connection.on('message', onMessage);
connection.connect();
return () => connection.disconnect();
}, [roomId]); // 只有 roomId 变化时才重新连接
}- 稳定的引用:函数引用不会因依赖变化而改变
- 访问最新值:始终能访问到最新的 props 和 state
- 减少重新渲染:避免因事件处理函数变化导致的副作用重新执行
useOptimistic 用于实现乐观更新,提升用户体验。
import { useOptimistic, useTransition } from 'react';
function TodoList({ todos }) {
const [optimisticTodos, addOptimisticTodo] = useOptimistic(
todos,
(state, newTodo) => [...state, { ...newTodo, pending: true }]
);
async function handleAddTodo(newTodo) {
addOptimisticTodo(newTodo); // 立即更新 UI
await saveTodo(newTodo); // 后台保存
}
return (
<ul>
{optimisticTodos.map(todo => (
<li key={todo.id} className={todo.pending ? 'pending' : ''}>
{todo.text}
</li>
))}
</ul>
);
}- 即时反馈:用户操作立即反映在 UI 上
- 减少等待感:不需要等待服务器响应
- 更好的用户体验:特别是在网络较慢的情况下
useActionState 结合了状态管理和 Action 处理,减少不必要的重新渲染。
import { useActionState } from 'react';
async function updateName(prevState, formData) {
const name = formData.get('name');
if (!name) {
return { error: 'Name is required' };
}
await saveName(name);
return { success: true };
}
function Form() {
const [state, formAction, isPending] = useActionState(updateName, null);
return (
<form action={formAction}>
<input name="name" />
{state?.error && <p>{state.error}</p>}
{state?.success && <p>Saved!</p>}
<button disabled={isPending}>Save</button>
</form>
);
}<Activity /> 组件(React 19.2)允许将应用划分为不同的"活动",并对其进行优先级管理。
Activity 组件帮助优化应用的渲染优先级,确保重要内容优先渲染。
import { Activity } from 'react';
function App() {
return (
<div>
{/* 高优先级活动 */}
<Activity priority="high">
<Header />
<Navigation />
</Activity>
{/* 低优先级活动 */}
<Activity priority="low">
<Sidebar />
<Footer />
</Activity>
{/* 主要内容 */}
<MainContent />
</div>
);
}- 优先级调度:React 可以根据优先级决定渲染顺序
- 资源分配:重要内容优先获得计算资源
- 用户体验:关键交互更快响应
React 19 进一步增强了自动批处理(Automatic Batching),在更多场景下自动合并状态更新。
// React 18 - 某些异步场景不会批处理
setTimeout(() => {
setCount(c => c + 1);
setFlag(f => !f);
// 可能触发两次渲染
}, 1000);
// React 19 - 自动批处理,只触发一次渲染
setTimeout(() => {
setCount(c => c + 1);
setFlag(f => !f);
// 自动批处理,只渲染一次
}, 1000);- 更智能的调度:根据用户交互优先级调度更新
- 可中断渲染:长时间渲染可以被中断,优先处理高优先级更新
- 更好的响应性:保持 UI 响应,即使在复杂渲染场景下
<Profiler> 组件在 React 19 中功能增强,提供更详细的性能指标。
import { Profiler } from 'react';
function onRenderCallback(id, phase, actualDuration, baseDuration, startTime, commitTime) {
console.log('Component:', id);
console.log('Phase:', phase); // mount 或 update
console.log('Actual duration:', actualDuration); // 实际渲染时间
console.log('Base duration:', baseDuration); // 估计渲染时间
console.log('Start time:', startTime);
console.log('Commit time:', commitTime);
}
function App() {
return (
<Profiler id="App" onRender={onRenderCallback}>
<YourComponent />
</Profiler>
);
}React 19.2 引入了 Performance Tracks,提供更细粒度的性能分析。
import { unstable_track } from 'react';
function ExpensiveComponent() {
return unstable_track('expensive-render', () => {
// 性能追踪代码块
return <ComplexUI />;
});
}专为 CSS-in-JS 库设计的 Hook,优化样式注入性能。
import { useInsertionEffect } from 'react';
function useCSS(rule) {
useInsertionEffect(() => {
// 在布局副作用之前注入样式
const style = document.createElement('style');
style.textContent = rule;
document.head.appendChild(style);
return () => {
document.head.removeChild(style);
};
});
}// React 19 + Compiler 自动优化
function ProductList({ products, filters }) {
// 编译器自动 memoize filteredProducts
const filteredProducts = products.filter(p =>
filters.category === 'all' || p.category === filters.category
);
// 编译器自动 memoize renderProduct
const renderProduct = (product) => (
<ProductCard key={product.id} product={product} />
);
return (
<div>
{filteredProducts.map(renderProduct)}
</div>
);
}import { useEffectEvent, useOptimistic } from 'react';
function LiveFeed({ feedId }) {
const [messages, setMessages] = useState([]);
const [optimisticMessages, addOptimistic] = useOptimistic(
messages,
(state, newMsg) => [...state, { ...newMsg, pending: true }]
);
// 稳定的事件处理函数
const handleNewMessage = useEffectEvent((msg) => {
setMessages(prev => [...prev, msg]);
});
useEffect(() => {
const connection = createConnection(feedId);
connection.on('message', handleNewMessage);
connection.connect();
return () => connection.disconnect();
}, [feedId]);
return (
<div>
{optimisticMessages.map(msg => (
<Message key={msg.id} message={msg} />
))}
</div>
);
}import { useActionState } from 'react';
async function submitForm(prevState, formData) {
const email = formData.get('email');
const password = formData.get('password');
try {
await login(email, password);
return { success: true };
} catch (error) {
return { error: error.message };
}
}
function LoginForm() {
const [state, formAction, isPending] = useActionState(submitForm, null);
return (
<form action={formAction}>
<input name="email" type="email" required />
<input name="password" type="password" required />
{state?.error && <div className="error">{state.error}</div>}
{state?.success && <div className="success">Logged in!</div>}
<button type="submit" disabled={isPending}>
{isPending ? 'Logging in...' : 'Login'}
</button>
</form>
);
}npm install react@^19 react-dom@^19npm install babel-plugin-react-compiler配置 Babel/Vite/Webpack。
之前:
const MemoizedComponent = memo(Component);
const memoizedValue = useMemo(() => compute(), [deps]);
const memoizedCallback = useCallback(() => {}, [deps]);之后(使用 Compiler):
// 编译器自动处理,可以移除手动优化
const Component = ...;
const value = compute();
const callback = () => {};- 将复杂的
useEffect依赖场景改为useEffectEvent - 使用
useOptimistic实现乐观更新 - 使用
useActionState简化表单处理
使用 <Profiler> 组件监控性能变化,确保优化生效。
| 特性 | React 18 | React 19 |
|---|---|---|
| 代码优化 | 手动添加 memo/useMemo | React Compiler 自动优化 |
| 事件处理 | useEffect 依赖复杂 | useEffectEvent 简化 |
| 乐观更新 | 需要手动实现 | useOptimistic 内置支持 |
| 批处理 | 部分场景不批处理 | 全面自动批处理 |
| 优先级管理 | 有限支持 | Activity 组件支持 |
| 性能监控 | Profiler 基础功能 | Performance Tracks 增强 |
-
启用 React Compiler
- 新项目直接启用
- 老项目逐步迁移
-
合理使用新 Hooks
useEffectEvent用于事件处理useOptimistic用于需要即时反馈的操作useActionState用于表单提交
-
性能监控
- 使用
<Profiler>识别瓶颈 - 定期检查 Performance Tracks
- 使用
-
渐进式迁移
- 不需要一次性迁移所有代码
- 新功能使用新特性
- 逐步优化旧代码
最后更新:2025年