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 实际上是建立在原始库流行度之上的一个新的、更加繁琐的系统。