关注点分离(Separation of Concerns,简称 SoC)是一种软件设计原则,主张将程序分解成不同的模块或部分,每个模块只负责一种特定的功能或任务,从而使系统更加模块化、易于理解、维护和扩展。
在开始学习 React 的时候,我们通常先学习如何使用 JSX 来描述组件的外观,然后逐渐在组件中加入 JavaScript 逻辑。但随着学习的深入,一个根本性的问题值得我们深思:为什么 React 要将 HTML、CSS 和 JavaScript 混合在一起?这看似简单的问题实际上揭示了 React 组件设计的核心理念。
传统的关注点分离
在传统的 Web 开发中,我们采用”一个技术一个文件“的方式组织代码:
- HTML 文件负责结构
- CSS 文件负责样式
- JavaScript 文件负责交互逻辑
这种方式被称为”传统的关注点分离”,大多数人(包括我)都是这样学习 Web 开发的。每种技术各司其职,界限分明。
单页应用的兴起改变了一切
随着网页变得越来越交互化,单页应用(SPA)开始兴起。在这种应用中,JavaScript 开始主导用户界面和内容的呈现。用一个简单的例子来说,JavaScript 代码完全决定了 HTML 元素的内容和表现形式。
这意味着 HTML 和 JavaScript 变得紧密耦合在一起。HTML 如果脱离了 JavaScript,甚至都没有意义。如果逻辑和 UI 如此紧密地联系在一起,为什么我们还要坚持将它们分开放在不同的文件中呢?

React 组件:逻辑和 UI 的融合
React 组件的诞生正是对这个问题的回应。组件将数据、逻辑和外观整合在一起,形成 UI 的一个独立部分。这其实是 React 设计的根本原因,也是许多现代前端框架采用组件化的原因。
在 React 组件中,JavaScript 逻辑和 JSX 标记语言和谐共存。更有趣的是,在 JSX 内部,我们还可以嵌入更多的 JavaScript,而这些 JavaScript 又可以包含更多的 JSX。所有这些混合在一起,却运作得非常好。

React 的理念是”共同定位”(co-location),意味着会一起变化的东西应该尽可能放在一起。在 React 应用中,这转化为”一个组件一个文件”,而非传统的”一个技术一个文件”。
React 真的没有关注点分离吗?
当 React 和 JSX 最初发布时,许多人对 JSX 的外观感到反感,认为它摒弃了关注点分离的原则。但实际上,React 并非没有关注点分离,只是采用了不同的分离方式。
React 实现的是”一个关注点一个组件”,而非传统的”一个关注点一个文件”。每个组件只关注 UI 的一个部分。当然,在每个组件内部,HTML、CSS 和 JavaScript 仍然混合在一起。

这是一种全新的范式,在初期很多人难以适应。但随着时间推移,这种方式被证明非常有效。将一个组件的所有相关信息放在一处,实际上运行得非常好。
总结
React 组件化设计反映了现代 Web 应用开发的本质变化:
- 随着单页应用的兴起,JavaScript 开始主导 HTML 内容
- 逻辑和 UI 变得紧密耦合
- 将紧密耦合的东西分开放在不同文件中不再合理
- React 提出了组件化的解决方案:一个组件包含数据、逻辑和外观
- 组件实现了新形式的关注点分离:一个组件专注于 UI 的一个部分
这种组件化的思维方式如今已成为前端开发的主流。尽管起初看起来违反了我们熟悉的原则,但它确实提供了一种更有效的方式来构建复杂的交互式应用。
理解 React 这种关注点分离的新范式,对我们掌握 React 的核心思想至关重要。它不仅帮助我们编写更好的 React 代码,也让我们看到前端开发思想的演变历程。


发表回复