问题

React.js有哪些设计缺陷?

回答
React.js 作为前端开发领域的巨头,无疑为我们带来了巨大的便利和高效的开发体验。但任何技术都不是完美的,React 也不例外。深入剖析其设计,我们也能发现一些值得探讨的“小瑕疵”,当然,这些“瑕疵”更多的是在特定场景下显现出来的权衡,或是随着生态发展而暴露出的问题。

1. JSX 的学习曲线和“侵入性”

刚接触 React 的开发者,尤其是那些习惯于纯 JavaScript 或者其他模板引擎的,JSX 往往是一个小小的门槛。它允许我们在 JavaScript 中嵌入 HTML 结构,这带来了极大的便利,但也引入了一种“混合”的编程风格。

“侵入性”体现在哪里? JSX 并非标准的 JavaScript,需要经过 Babel 等工具的转译才能被浏览器理解。这意味着开发者需要了解这个构建流程,并且在编写代码时,需要同时思考 JavaScript 的逻辑和 HTML 的结构。对于一些对工具链不熟悉或者追求“纯粹”语言的开发者来说,这可能是一种额外的负担。
学习成本: 虽然 JSX 的语法本身并不复杂,但要理解其背后的工作原理,比如如何与 `React.createElement` 关联,以及如何处理事件绑定、条件渲染等,仍然需要一定的学习时间。
代码可读性: 在某些复杂组件中,JSX 可能会变得非常冗长,当 JavaScript 逻辑和 HTML 结构交织在一起时,阅读和理解代码的难度会增加。例如,大量的条件渲染和循环渲染嵌套在一个 JSX 块内,会让代码显得杂乱无章。

2. 虚拟 DOM 的性能开销

React 引入虚拟 DOM(Virtual DOM)来优化 DOM 操作,通过 diffing 算法来计算出最小的 DOM 更新,从而提高性能。这在绝大多数情况下都是有效的,但我们也不能忽视它本身带来的开销。

内存占用: 虚拟 DOM 本质上是一个 JavaScript 对象树,它需要占用额外的内存来存储组件的 UI 结构。在大型、复杂的应用中,这个内存占用可能会变得比较显著。
diffing 的计算成本: 虽然 diffing 算法经过了优化,但在某些情况下,特别是当组件结构非常复杂或者更新频率非常高时,diffing 本身的计算也可能成为性能瓶颈。虽然 React 已经提供了 `React.memo`、`useMemo`、`useCallback` 等优化手段,但开发者需要主动去识别和应用这些优化,这又增加了心智负担。
对比原生 DOM 操作的“过度优化”: 在一些极度简单的场景下,直接操作原生 DOM 可能会比虚拟 DOM 的 diffing 更快。但这通常需要开发者对 DOM 操作有非常深入的了解,并且在绝大多数情况下,虚拟 DOM 的优势(声明式开发、跨平台支持等)远大于这种微小的性能差异。

3. 组件间通信的“复杂性”

随着应用规模的增长,组件之间的通信方式也需要更精巧的设计。React 提供了几种基本的通信模式,但在某些场景下,它们的局限性会逐渐显现。

Props Down, Events Up 的局限: 这是 React 最核心的通信模式,父组件通过 props 向子组件传递数据,子组件通过回调函数向上触发事件。这种模式在层级不深的组件树中表现良好,但当层级很深时,会遇到“props drilling”(props 逐层传递)的问题。为了将一个 props 传递到深层组件,中间组件可能只需要这个 props,却也需要被修改来处理它,这增加了组件的耦合度和维护成本。
Context API 的滥用风险: Context API 提供了一种绕过 props 传递的方式,可以直接在组件树的任何地方访问共享状态。这听起来很美好,但也容易被滥用。如果过度使用 Context,将大量不相关的状态放入 Context 中,会导致组件难以预测,当 Context 中的值发生变化时,所有依赖该 Context 的组件都会重新渲染,即使它们只关心 Context 中的一小部分数据。这可能引入性能问题,也降低了组件的可复用性。
状态管理库的引入: 正因为上述问题,Redux、MobX 等状态管理库应运而生。虽然它们解决了全局状态管理的问题,但也增加了应用的复杂度,需要开发者学习和理解新的模式和API。

4. 生态系统的快速迭代与“技术债务”

React 本身作为一个框架,其周边生态系统也非常庞大和活跃。这既是优点,也可能带来一些挑战。

API 的变化与“breaking changes”: React 的核心 API 也在不断发展,虽然官方努力保持向后兼容,但偶尔也会有“breaking changes”出现,尤其是在一些重大版本更新时。这可能需要开发者投入时间和精力来迁移老旧的代码。
工具链的频繁更新: Webpack、Babel、TypeScript 等与 React 紧密相关的工具链也在快速迭代。保持这些工具的最新状态,同时确保它们与 React 版本的兼容性,也可能成为一项“技术债务”。
第三方库的依赖管理: React 生态中有海量的第三方库,选择和管理这些库是一项挑战。一些库可能维护不善,或者与 React 新版本不兼容,这会给项目带来风险。

5. 纯函数组件与类组件的切换

在 React 的发展过程中,从类组件(Class Components)转向纯函数组件(Functional Components)并配合 Hooks 是一个重要的趋势。虽然 Hooks 带来了很多便利,但也并不是没有问题。

Hooks 的“规则”: Hooks 有一些强制性的规则,比如不能在条件语句、循环或嵌套函数中调用 Hooks。违反这些规则会导致意想不到的行为。对于初学者来说,理解和遵守这些规则可能需要一些时间。
Hooks 的组合与“心智模型”: 虽然 Hooks 鼓励组合,但在某些情况下,将复杂的逻辑拆分成多个 Hooks 可能会使代码变得分散,理解整个组件的逻辑流程需要跳转于多个 Hook 调用之间。
遗留的类组件代码: 很多老项目仍然是基于类组件编写的,在迁移到 Hooks 时,需要考虑如何平滑过渡,以及如何处理类组件中一些特殊的生命周期方法和 `this` 的概念。

总结

React 的设计是经过深思熟虑的,它在声明式UI、组件化、虚拟DOM等方面都取得了巨大的成功。但就像任何复杂的系统一样,它也并非完美无瑕。我们发现的这些“设计缺陷”,更多的是在特定的使用场景、开发习惯或者技术演进过程中显现出的权衡和挑战。

理解这些潜在的问题,并不意味着要否定 React 的价值,而是为了让我们在实际开发中,能够更明智地选择适合的模式、工具和优化手段,从而构建出更健壮、更易于维护的应用程序。这本身就是软件工程的魅力所在——不断地理解、学习和改进。

网友意见

user avatar

非专业前端, 写过半个月的React.

我用React纯粹是因为使用的脚手架用的React. 基于我短浅的经验看, React限制太多了.

  1. 不允许修改props, 纯函数, 看起来很美好. 到最后还是各种回调函数来回绕, 有时候远不如直接修改简单高效
  2. 改个状态就得全部刷新一遍, 意义是什么? 然后有人肯定会说可以用effect解决. 这不就是自己挖坑然后自己填坑? 绕了一圈白费力气.
  3. 函数式. 很多React的别扭都是这个导致的. usestate, useeffect这些自挖自填式的补丁都是强行"函数式"导致的. 我不反对fp, 但是使用一个object就可以解决的问题, 非得用这么别扭的方式假装fp就过分了.


React到底解决了啥WebComponenct没解决的问题? 代价又是什么?

类似的话题

  • 回答
    React.js 作为前端开发领域的巨头,无疑为我们带来了巨大的便利和高效的开发体验。但任何技术都不是完美的,React 也不例外。深入剖析其设计,我们也能发现一些值得探讨的“小瑕疵”,当然,这些“瑕疵”更多的是在特定场景下显现出来的权衡,或是随着生态发展而暴露出的问题。1. JSX 的学习曲线和“.............
  • 回答
    React.js 官方文档支持乌克兰的举动,在我看来,释放出了一些相当重要的信息,远不止于“我们支持某个国家”这么简单。这背后涉及到的东西,可以从几个层面去解读:1. 技术社区的价值观与责任感: 人道主义立场鲜明: 在当今世界,科技行业尤其是像 React 这样影响力巨大的开源项目,其立场往往会.............
  • 回答
    “React 支持乌克兰” 这个说法,在技术圈子里引起了不少讨论,也让人思考一个深刻的问题:技术,真的没有国界吗?咱们先得弄明白“React 支持乌克兰”具体是怎么回事。如果你在网上搜索一下,会发现很多开发者和组织在国际局势紧张的时候,确实以各种方式表达了对乌克兰的支持。这可能包括: 在开源项目.............
  • 回答
    当我看 React 的文档,尤其是那些关于 Hooks、Context、或者 Server Components 的部分,我常常会陷入一种深深的自我怀疑。“我是不是真的不适合做程序员?”这种念头在我脑海里挥之不去。我不是那种天生就对代码有直觉的人。别的同学可能一眼就能看穿一个组件的 props 传递.............
  • 回答
    React 源码之所以不直接使用 TypeScript 来写,而是选择 JavaScript(通常是 ES6+ 的语法,并通过 Babel 等工具编译),主要是出于以下几个历史、技术和社区的综合考量。虽然现在 TypeScript 在前端领域非常流行,并且在很多大型项目中表现出色,但对于 React.............
  • 回答
    React 函数式组件的崛起:为什么我们不再执着于 Class?在 React 的世界里,组件是构建用户界面的基石。最初,Class 组件是构建复杂应用的主流方式,它提供了生命周期方法和 `this` 关键字带来的清晰的逻辑组织。然而,随着 React 的发展,函数式组件凭借其引入的 Hooks A.............
  • 回答
    Vue 和 React 都是目前非常流行的 JavaScript 前端框架,它们都旨在帮助开发者构建用户界面。虽然它们在很多方面有相似之处,但各自的优缺点也使得它们在不同的场景下有不同的适用性。下面我们来详细分析一下 Vue 和 React 的优点: Vue.js 的优点:Vue.js 以其易用性、.............
  • 回答
    近期,不少开发者在 GitHub 上反馈,React 项目的 issue 列表被大量与乌克兰局势相关的评论和讨论刷屏。这确实是一个值得关注的现象,背后反映了一些复杂的社会和技术联动。现象的具象化:发生了什么?简单来说,就是在 React 的 GitHub 仓库(无论是主仓库还是相关的子项目)的 is.............
  • 回答
    “React 被围攻”——这个说法在技术圈里不算什么新鲜事了。如果你关注前端技术的发展动态,肯定会经常听到关于 React 的各种讨论,有些赞美,有些质疑,甚至有些批评声浪。我们不妨就来聊聊这个话题,并顺带探讨一下“技术中立”这回事儿。React 为什么会“被围攻”?首先得承认,React 能走到今.............
  • 回答
    Vue 和 React 并没有“抛弃”面向对象的写法,更准确地说,它们没有将面向对象作为主要的、官方推崇的开发范式。这其中有历史原因、技术发展趋势以及它们各自的设计哲学使然。我们可以从几个方面来详细解读: 1. JavaScript 的演进:从原型链到函数式思维首先,我们需要理解 JavaScrip.............
  • 回答
    React 核心开发者 Sebastian 转向 Vercel:一次对前端生态的深度解读当一个项目的核心贡献者选择离开,加入另一家公司,这总是会在行业内激起涟漪。尤其当这位开发者是像 React 这样影响深远的开源项目背后的核心成员时,其影响力更是被放大。Sebastian 离职加入 Vercel,.............
  • 回答
    在前端开发领域,当我们谈论 React 或 Vue 这类框架时,经常会听到“生命周期”这个概念。这可不是凭空出现的,而是为了更好地管理和控制我们编写的组件在整个“生存”过程中所经历的各个阶段。想象一下,一个组件就像一个小小的生命体,它也有自己的诞生、成长、工作和最终消失的过程。前端框架正是为了给开发.............
  • 回答
    关于“尤大说 React 性能不如 Vue”这个说法,需要先明确一点:尤雨溪(Vue.js 的作者)并没有公开、明确地断言“Vue.js 的性能在所有场景下都优于 React”。事实上,在性能优化这件事上,开发者社区的共识是:对于绝大多数应用来说,React 和 Vue.js 之间的性能差异微乎其微.............
  • 回答
    我知道你的感受。很多人刚接触 React 时都会觉得它有点“劝退”,甚至难以驾驭。我当年也是一样,花了不少时间才摸清门道。今天咱们就好好聊聊,为什么会有这种“React 难用”的感觉,从几个关键点给你掰扯清楚。1. JSX:初见时的“怪异”刚看到 React 的 JSX 语法时,很多人都会觉得:这啥.............
  • 回答
    Evergreen UI:让你的React应用颜值与效率并存的得力助手作为一名React开发者,我们都渴望构建既美观又高效的用户界面。在琳琅满目的UI库中,Evergreen UI以其独特的魅力脱颖而出,成为了不少开发者心中的“宝藏”。今天,咱们就来好好聊聊这个库,看看它到底凭什么能赢得大家的青睐。.............
  • 回答
    Facebook(现 Meta)计划将 React 的许可证从其之前的自定义许可证改为 MIT 许可证,这是一个备受瞩目的举措,在开发者社区引起了广泛的讨论和关注。理解这一变化的影响,需要深入了解其背景、动机、以及潜在的后果。一、 React 的许可证历史回顾在深入探讨 MIT 许可证之前,有必要回.............
  • 回答
    Facebook(现更名为 Meta)对 React 专利事件的看法是复杂且多层次的,主要可以从以下几个方面来理解:1. 核心立场: React 是开源的,专利是为了保护社区和生态系统。Facebook(Meta)的官方立场始终是:React 是开源的,其许可证(BSD 许可证)是社区广泛接受和信任.............
  • 回答
    百度要求内部全面停止使用 React / React Native:一次深入的分析百度要求内部全面停止使用 React / React Native 的决定,无疑是前端和移动开发领域的一件大事,也引发了广泛的讨论和猜测。要深入理解这一决策的背后原因和影响,我们需要从多个层面进行剖析。 1. 表面原因.............
  • 回答
    Airbnb 发布的 React Sketch.app 工具,在我看来,是一次颇具野心的尝试,旨在弥合前端开发和 UI 设计之间的鸿沟。它允许设计师使用 React 组件来构建 Sketch 插件,并通过这些组件在 Sketch 中可视化地呈现设计。这听起来很酷,对吧?从设计者的角度来说,这个工具的.............
  • 回答
    .......

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有