好的,这是 React 19 与 React 18 的全面对比。React 19 带来了许多重大改进和新特性。
🚀 核心特性对比
特性 | React 18 | React 19 |
---|---|---|
并发特性 | ✅ 引入 | ✅ 稳定并扩展 |
服务器组件 | ❌ 无官方支持 | ✅ 官方支持 |
Action | ❌ 无 | ✅ 新增 |
useEffectEvent | ❌ 无 | ✅ 新增 |
use Hook | ❌ 无 | ✅ 新增 |
ref 作为 props | ❌ 有限支持 | ✅ 直接支持 |
文档元数据 | ❌ 需要第三方 | ✅ 原生支持 |
资源预加载 | ❌ 有限 | ✅ 增强 |
🆕 React 19 全新特性
1. Action - 最大的变革
js
// React 19 - 使用 Action
function UpdateName({}) {
const [name, setName] = useState("");
const [error, setError] = useState(null);
const [isPending, startTransition] = useTransition();
// Action 函数
const handleSubmit = async () => {
const user = await updateName(name);
if (user.error) {
setError(user.error);
}
};
return (
<div>
<input value={name} onChange={(e) => setName(e.target.value)} />
<button onClick={handleSubmit} disabled={isPending}>
Update
</button>
{error && <p>{error}</p>}
</div>
);
}
// 更简洁的写法 - 使用 useOptimistic
function OptimisticForm() {
const [optimisticName, setOptimisticName] = useOptimistic(name);
const submitAction = async (formData) => {
setOptimisticName(formData.get("name"));
await updateName(formData.get("name"));
};
return (
<form action={submitAction}>
<input type="text" name="name" defaultValue={optimisticName} />
<button type="submit">Update</button>
</form>
);
}
2. use Hook - 简化异步操作
js
// React 19 - 使用 use Hook
function Note({ id }) {
// 直接使用 Promise 和 Context
const note = use(fetchNote(id));
const theme = use(ThemeContext);
return (
<section className={theme}>
<h1>{note.title}</h1>
<p>{note.content}</p>
</section>
);
}
// React 18 的等效写法
function Note({ id }) {
const [note, setNote] = useState(null);
const theme = useContext(ThemeContext);
useEffect(() => {
fetchNote(id).then(setNote);
}, [id]);
if (!note) return <div>Loading...</div>;
return (
<section className={theme}>
<h1>{note.title}</h1>
<p>{note.content}</p>
</section>
);
}
3. ref 作为 props
js
// React 19 - 直接传递 ref
function MyInput({ placeholder, ref }) {
return <input placeholder={placeholder} ref={ref} />;
}
// 使用
function Form() {
const inputRef = useRef(null);
useEffect(() => {
inputRef.current?.focus();
}, []);
return <MyInput placeholder="Enter name..." ref={inputRef} />;
}
// React 18 需要 forwardRef
const MyInput = React.forwardRef(({ placeholder }, ref) => {
return <input placeholder={placeholder} ref={ref} />;
});
4. 文档元数据支持
js
// React 19 - 原生支持
function HomePage() {
return (
<>
<title>Home Page</title>
<meta name="description" content="Welcome to our site" />
<link rel="icon" href="/favicon.ico" />
<h1>Home Page Content</h1>
</>
);
}
// React 18 需要 react-helmet 等第三方库
🔄 并发特性对比
React 18 并发特性
js
// useTransition
function SearchBox() {
const [query, setQuery] = useState('');
const [results, setResults] = useState([]);
const [isPending, startTransition] = useTransition();
const handleChange = (e) => {
setQuery(e.target.value);
startTransition(() => {
// 非紧急更新
setResults(performHeavySearch(e.target.value));
});
};
return (
<div>
<input value={query} onChange={handleChange} />
{isPending ? <Spinner /> : <Results list={results} />}
</div>
);
}
React 19 并发增强
js
// 更强大的并发控制
async function submitForm(formData) {
const response = await fetch('/api/submit', {
method: 'POST',
body: formData
});
// React 19 自动处理并发状态
return response.json();
}
function FormComponent() {
const [isPending, startTransition] = useTransition();
const [optimisticData, setOptimisticData] = useOptimistic(initialData);
const handleSubmit = async (formData) => {
// 乐观更新
setOptimisticData(formData);
startTransition(async () => {
try {
await submitForm(formData);
} catch (error) {
// 自动回滚乐观更新
}
});
};
return <form action={handleSubmit}>...</form>;
}
📦 资源管理和性能
React 19 资源预加载
js
// 资源预加载
import { prefetchDNS, preconnect, preload, preinit } from 'react-dom';
function VideoPlayer() {
// 提前建立连接
preconnect("https://video-provider.com");
// 预加载关键资源
preload("/static/video-player.js", { as: "script" });
return <video src="https://video-provider.com/video.mp4" />;
}
服务器组件 (React 19 核心)
js
// Server Component - 在服务端运行
async function UserProfile({ userId }) {
// 直接在服务端获取数据
const user = await db.users.findUnique({ where: { id: userId } });
const posts = await db.posts.findMany({ where: { userId } });
return (
<div>
<h1>{user.name}</h1>
<Posts posts={posts} />
</div>
);
}
// Client Component - 在客户端运行
'use client';
function Posts({ posts }) {
const [search, setSearch] = useState('');
return (
<div>
<input
value={search}
onChange={(e) => setSearch(e.target.value)}
/>
{posts.map(post => (
<Post key={post.id} post={post} />
))}
</div>
);
}
🎯 API 变化对比
Hook 对比
Hook | React 18 | React 19 |
---|---|---|
use |
❌ 不存在 | ✅ 新增 |
useEffectEvent |
❌ 不存在 | ✅ 新增 |
useOptimistic |
❌ 不存在 | ✅ 新增 |
useTransition |
✅ 实验性 | ✅ 稳定 |
useActionState |
❌ 不存在 | ✅ 新增 |
组件 API 对比
js
// React 19 - 简化的 Context 使用
const ThemeContext = createContext('light');
function App() {
return (
<ThemeContext value="dark">
<Toolbar />
</ThemeContext>
);
}
function Toolbar() {
// 更简洁的 Context 消费
const theme = use(ThemeContext);
return <div className={theme}>Content</div>;
}
🔧 迁移指南
1. 移除废弃 API
javascript
// React 18 → React 19
// 移除:ReactDOM.render
// 使用:createRoot
// 移除:ReactDOM.hydrate
// 使用:hydrateRoot
// 移除:unstable_ 前缀的 API
2. 更新 TypeScript 类型
typescript
// React 19 更好的类型推断
interface Props {
children?: React.ReactNode; // 更精确的类型
ref?: Ref<HTMLDivElement>; // 更好的 ref 支持
}
// forwardRef 现在更简单
const MyComponent = ({ ref }: Props) => {
return <div ref={ref}>Content</div>;
};
3. 采用新的异步模式
javascript
// 迁移到 Action
// Before: 手动状态管理
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
// After: 使用 Action
const [state, formAction, isPending] = useActionState(updateItem, null);
📈 性能提升
包大小优化
- React: 减少约 20% 的包大小
- React DOM: 显著减小客户端包体积
- 更好的 Tree Shaking: 移除未使用的代码
渲染性能
- 更快的初始渲染
- 改进的 Suspense 处理
- 更好的内存使用
🎉 总结
React 19 的核心优势:
- 更简单的数据获取 - 服务器组件 + use Hook
- 更好的表单处理 - Action + 乐观更新
- 减少样板代码 - 直接 ref、文档元数据
- 性能提升 - 更小的包大小,更好的运行时
- 开发体验 - 更少的 Hook 依赖问题,更好的错误处理
何时升级:
- ✅ 新项目 - 直接使用 React 19
- ✅ 使用 Next.js 14+ - 已支持 React 19 特性
- 🔄 现有大型项目 - 逐步迁移,先测试兼容性
- ⚠️ 依赖大量第三方库 - 确认兼容性后再升级
React 19 标志着 React 从"UI 库"向"全栈框架"的重要演进,特别适合现代 Web 应用开发!