React Labs:我们一直在做什么——2024年2月
React 的最新路线图,包括优化编译器以及自动 memoization、server actions 等功能,在前端开发者中引发了褒贬不一的反应。许多人认为这些进展很强大,但也担心 React 变得过于复杂和“魔法化”,尤其是 hooks、React Server Components,以及 Next.js 和 Vercel 影响力的不断扩大,使代码更难推理,构建流水线也更脆弱。也有人认为,React 的生态、向后兼容性以及对大型、长生命周期应用的适配能力,仍然足以支持继续选择它,即便 Vue、Svelte、Preact、MobX、htmx 和服务端框架等替代方案因其简洁性而越来越受关注。
Create React App 和工具链
- CRA 通常被视为实际上已经被放弃,而且从来没有投入大量资源;它本意是一个入门脚手架,而不是“最佳”的生产工具。
- 评论者指出,现代工具(尤其是 Vite)比 CRA 那套不透明的 Webpack 配置更简单、更快,也更容易调试。
- 仍然有人在小型应用中使用 CRA,但也承认由于维护不足,未来会有问题。
Hooks、复杂性与“魔法”
- 许多人觉得 React 变得过于复杂,尤其是 hooks、hydration 以及服务端/客户端指令。
- hooks 被描述为一种内嵌语言,带有自己的一套规则,偏离了普通 JavaScript 的直觉;简单场景更容易,但复杂代码更难调试。
- 也有人认为 hooks 增强了显式性,更符合 React 的并发架构,而且一旦理解了心理模型,本身并不难懂。
- 有人对 React 关于 hooks(例如
useEffect)的解释和指导随着时间变化而感到沮丧,这造成了困惑。
优化编译器 / 自动 memoization
- 新的编译器(React Forget)旨在自动进行 memoization,并移除许多手动的
useMemo/useCallback模式。 - 一些人对此印象深刻,但也对基于编译期语义值分析来改变行为的“魔法”感到不安,尤其是当它改变了人们对语言语义的感知时。
- 也有人担心,在已经很复杂的构建流水线中又增加一层编译器。
状态管理争论
- 围绕
useReducer+useContext是否可以替代 Redux 展开争论;一方认为可以,另一方强调性能和订阅机制的差异。 - Redux Toolkit 被认为减少了样板代码,但有些人仍觉得 Redux/RTK 过于冗长。
- MobX 因其直接的响应式以及领域/界面分离而受到称赞,但批评者说 observer 风格的推送式响应会导致代码像意大利面条一样混乱,并带来令人意外的重新计算。
React 与替代方案
- 多位评论者推荐 Vue、Svelte、Preact、htmx、Rails/Hotwire,或传统的服务端渲染,认为它们更简单、更直观。
- 也有人反驳说,React 的 immediate-mode 模型、庞大的生态、招聘市场以及强大的向后兼容性,仍然使其成为务实的选择,尤其适用于复杂 Web 应用和 React Native。
- 一些人认为现代 React 实际上是建立在原始库流行度之上的一个新的、更加繁琐的系统。