Skip to content

技术问答

一、讲讲虚拟DOM

一句话总结

虚拟DOM本质上就是一个JavaScript对象,用来描述真实DOM的结构和属性。

如何工作

  1. 生成:当数据发生变化时,不是直接去修改DOM,而是先根据新的数据生成一棵新的虚拟DOM树。
  2. 对比:将新的虚拟DOM树与旧的虚拟DOM树进行对比,找出差异。
  3. 更新:根据对比结果,只对真实DOM进行必要的更新,而不是全部重新渲染。

优势

  1. 性能提升:减少不必要的DOM操作(尤其是重排和重绘),大大提升了渲染效率,尤其是在复杂视图频繁更新时。
  2. 开发体验好:让我们可以用声明式的方法写代码,专注于业务逻辑,而不需要关心底层的DOM操作。
  3. 跨平台:因为虚拟DOM是JS对象,不依赖浏览器,所以同一套代码可以运行在不同的平台,比如React Native开发手机App。

相关问题

虚拟DOM一定比直接操作DOM快吗?

不一定,在首次渲染或非常简单、节点较少、不常更新的场景下,直接操作可能更快。它的优势主要体现在复杂应用频繁更新的过程中。

深入对比(Diff)过程

对比过程的核心思想是尽可能多地复用现有的DOM节点,而不是推倒重来。为了实现这一目标,它遵循以下规则:

  1. 同级比较:算法只会比较同一层级上的节点。例如,如果一个节点从div变成了span,算法会认为整个子树都发生了变化,从而直接替换整个节点及其所有子节点,而不是费力地去逐层比较子节点。这大大降低了算法的复杂度。

  2. 键值匹配:在处理动态列表时(比如用v-for或map生成的列表),为每个节点设置一个唯一的key属性。

  • 作用:帮助Diff算法在顺序改变时,准确识别出哪些节点是同一个,可以复用。
  • 反例:如果使用数组索引作为key,当删除列表中间一项时,后续项的索引都会改变,算法就无法正确匹配节点,可能导致不必要的DOM操作甚至状态错乱。

理解更新(patch)阶段

1. 批量更新:框架不会在每次状态微调后都立即更新DOM,而是会将一个事件循环中所有变化收集起来,合并成一次更新操作。

2. 精准的DOM操作:patch清单会明确指出需要对哪个DOM节点进行何种操作,确保了只触动真正发生变化的部分,避免大范围的重排和重绘。

3. 异步更新机制:更新任务通常会被放入一个异步队列中执行。这可以避免频繁的同步更新阻塞浏览器的主线程,确保页面的流畅运行。

二、MVC和MVVM

MVC和MVVM都是用于分离用户界面、数据和业务逻辑的架构模式,目的是提升代码的可维护性、可测试性和可扩展性。

核心区别在于View和Model之间的通信方式:

  • MVC中Controller负责手动协调
  • MVVM通过ViewModel和数据绑定实现自动同步

适用场景:

  • MVC: 更适合传统多页面应用、服务器渲染项目,或相对简单的场景
  • MVVM: 尤其适合数据驱动的现代单页面应用(SPA),界面复杂、交互频繁的项目

Vue就是典型的MVVM框架,它的v-model指令和响应式系统完美体现了双向数据绑定。

三、前端工程化

前端工程化是一套系统化的方法,旨在通过规范化、标准化的工具、技术和流程,解决企业级前端开发中面临的效率、质量和维护成本问题。其核心目标可概括为“四化”:

  • 模块化:将复杂的代码按功能拆分成独立的模块(JS模块化、CSS模块化、资源模块化),降低耦合度,提高可维护性。

  • 组件化:将UI界面拆分为高内聚、可复用的组件,提升代码复用率和开发效率。

  • 规范化:制定并遵守代码规范、目录结构、Git分支管理、接口规范等,保证团队协作的一致性。

  • 自动化:利用工具实现自动化构建、测试、部署等,减少重复劳动和人为错误。