MST

星途 面试题库

面试题:JavaScript 设计模式在大型前端框架架构中的深度应用剖析

以 React 或 Vue 等大型前端框架为例,深入分析其中运用了哪些 JavaScript 设计模式,这些设计模式是如何协同工作以实现框架的核心功能,并且说明如果你来优化这些框架,在设计模式层面可能会做出哪些改进。
35.0万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

React 中运用的 JavaScript 设计模式及协同工作方式

  1. 单例模式
    • 应用:React 的 createContext 创建的上下文对象在应用中类似单例。它提供了一种在组件树中共享数据的方式,在整个应用中该上下文对象实例是唯一的,不同组件可以通过 Context.ConsumeruseContext 来获取这个唯一实例的数据。
    • 协同工作:与组件树结构配合,使得数据能在不通过层层 props 传递的情况下,被深层嵌套组件获取,实现跨组件数据共享。例如,用户登录信息可以通过上下文在多个无关组件中使用,而无需在每个中间组件传递。
  2. 观察者模式
    • 应用:React 的 useStateuseEffect 依赖跟踪机制类似观察者模式。当状态(useState 返回的状态值)发生变化时,依赖该状态的 useEffect 回调函数(观察者)会被触发执行。
    • 协同工作:这种模式帮助 React 实现高效的状态管理和副作用处理。比如,当一个列表项数据状态改变时,依赖该数据的视图更新副作用(如重新渲染列表)会自动执行,保证视图与数据的一致性。
  3. 组合模式
    • 应用:React 通过组件组合来构建 UI。一个组件可以包含多个子组件,并且组件自身也可以被其他组件包含。例如,一个 App 组件可能包含 HeaderMainFooter 组件,而 Main 组件又可以包含 ArticleSidebar 组件等。
    • 协同工作:这种模式使得 React 能够以一种灵活且可维护的方式构建复杂 UI。通过组合不同功能的小组件,形成功能更强大的大组件,并且可以在不同场景下复用这些组件,提高代码的复用性和可维护性。

Vue 中运用的 JavaScript 设计模式及协同工作方式

  1. 观察者模式
    • 应用:Vue 的响应式系统是观察者模式的典型应用。当数据发生变化时,依赖该数据的视图(观察者)会自动更新。Vue 通过 Object.defineProperty 对数据进行劫持,当数据属性被访问或修改时,通知相关的 Watcher(观察者)进行更新。
    • 协同工作:在模板渲染过程中,Vue 会为模板中的每个数据绑定创建 Watcher。当数据变化时,对应的 Watcher 会收到通知,进而触发视图更新,保证了数据和视图的双向绑定。例如,当输入框中的数据改变时,绑定该数据的文本节点会自动更新显示。
  2. 工厂模式
    • 应用:Vue 的 Vue.component 方法可以看作是工厂模式的应用。通过这个方法注册组件时,Vue 内部会创建组件的构造函数,并返回一个可复用的组件实例。例如,Vue.component('my - component', { /* 组件选项 */ }) 就像是工厂生产组件实例的过程。
    • 协同工作:与 Vue 的组件系统协同,使得开发者可以方便地创建和复用各种组件。不同的组件可以通过类似的方式注册并在模板中使用,提高了开发效率和代码的组织性。
  3. 发布 - 订阅模式
    • 应用:Vue 的事件系统使用了发布 - 订阅模式。组件可以通过 $on 方法订阅事件,通过 $emit 方法发布事件。例如,一个子组件可以通过 $emit 触发一个自定义事件,父组件通过 $on 监听该事件并执行相应的逻辑。
    • 协同工作:这种模式实现了组件间松耦合的通信。不同组件之间不需要直接相互引用,而是通过事件进行交互,增强了组件的独立性和可维护性,使应用的架构更加灵活。

设计模式层面的优化改进

  1. React
    • 改进单例模式相关:在处理大型应用时,上下文的滥用可能导致性能问题。可以考虑引入更细粒度的上下文管理,比如基于功能模块划分上下文,减少不必要的上下文更新。例如,对于一个电商应用,用户相关上下文和商品列表相关上下文可以分开管理,避免因用户信息更新导致商品列表无关组件重新渲染。
    • 改进观察者模式相关useEffect 的依赖数组有时难以精确控制,可能导致不必要的副作用执行。可以增强依赖跟踪机制,比如提供更智能的依赖分析工具,自动推断哪些状态变化会真正影响副作用,减少手动维护依赖数组的复杂性。
  2. Vue
    • 改进观察者模式相关:Vue 3 已经对响应式系统进行了优化,但仍可以进一步提升性能。例如,对于复杂对象的响应式处理,可以采用更高效的数据结构来存储依赖关系,减少依赖查找和更新的时间复杂度。
    • 改进发布 - 订阅模式相关:随着应用规模扩大,事件名可能变得难以管理。可以引入事件命名空间的概念,将相关事件归类到不同命名空间下,避免事件名冲突,提高代码的可维护性。例如,用户相关事件可以放在 user - namespace 下,订单相关事件放在 order - namespace 下。