从DOM到虚拟DOM——前端DOM发展史,高级开发面试题及答案

本文回顾了前端开发从依赖JQ和插件的初期,到模块化和模板语法的兴起,再到虚拟DOM的引入,探讨了技术演进如何解决性能问题和推动前端职能发展。作者强调了虚拟DOM在性能优化中的关键作用及其在多端开发中的通用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JQ和其高度发达的生态环境催生了JQ插件的高速发展,当时的前端开发者们想要实现一个功能,第一个反应就去搜插件,所以在当时的HTML文件内经常密密麻麻的插入了十几甚至几十的<script>标签,这不仅让页面变的臃肿不堪,更带来了全局变量污染的问题和性能问题(例如经典的白屏问题)。

受累于不同素质的开发者(插件素质层次不齐)以及日益庞大的插件库所带来的全局变量污染问题,前端开发者们从后端同胞的代码中得到了启发——他们也想要模块化。

在那个年代,javaScript尚没有importexport 这样的标准化支持,于是他们便自己建立了一个标准,那就是CommonJs。当然,之后还有分裂出AMD,CMD等等。这为后来Node.js的蓬勃发展埋下了伏笔。模块化相关知识与本文主旨关系不大,所以不展开细说。

同时JQ也没能很好的解决循环插入DOM节点的需求,拼接数据组成的DOM字符串让开发者们叫苦不迭。于是乎模版语法也运营而生了。用一个经典的公式来概括,那就是:

HTML = template(data)

可以看出,template其实就是一种将数据转为DOM的规则——而且能自定义!而template的原理其实很简单,大致分为以下几步:

  • 接受数据,解析他们

  • 填入模板

  • innerHtml

在解决了循环插入DOM节点的需求后前端工程师们发现了模板语法更大的优点——你要做的只是数据到DOM节点的映射,不用去点对点的操作DOM,不用关心数据如何变化,你只需要控制规则。兴许是从那一刻开始,前端开发者们寻到了一个崭新而又正确的发展方向——数据驱动。

但模版语法也有他的缺点。说白了,他只是一个数据的解析器,你不可能指望他去解决多么复杂炫酷的问题。而且在早期的模板语法中,他的更新会将所有dom节点注销,然后生成完整的新节点再插入页面中。这样大批量的操作dom必然会导致性能问题——操作dom的开销实在是太大了,何况是一整个页面的的dom呢?

于是乎开发者们在写的爽和用的爽之间陷入了两难,但用的不爽是绝对不行的(你懂的),于是乎也不知是哪一位大佬突然在某天拍案而起,操作dom开销那么大,我操作js不就行了!

三大框架时代——虚拟DOM的狂飙

操作dom开销那么大,我操作js不就行了?

这个疯狂却又合理想法一旦产生就再也无法扑灭,因为这太适合js了。js在诞生之初就可以操作DOM的本能,而js本身的能力又那么强大,模板语法的缺点它完全可以消化和包容,包括但不限于差量更新 ,批量更新等一系列梦寐以求的可以提高渲染性能的手段终于可以提上日程了。

于是,新世界的大门就此打开。

至此,我们来明确一点,虚拟DOM,正是作为数据和真实DOM之间的缓冲诞生。

有了虚拟DOM,前端世界迸发了更大的活力,Angular,React,Vue这三种基于虚拟DOM的框架在大浪淘沙之后终于存活了下来,成为了新世界的主流。

虚拟DOM的优势到底是什么,是什么让它成为了时代的选择?


正如之前说的,虚拟DOM是作为数据和真实DOM之间的缓冲层诞生的。数据通过某种模板/语法糖/函数将数据转换为虚拟DOM,从而实现在js层面的控制。这个转换,在vue里是<template>,在react中是JSX

react中<div>虚拟DOM</div>的虚拟DOM形式

这让“差量更新”这一至关重要的功能得以应用,新的虚拟DOM树会和旧虚拟DOM树以diff算法进行比较,形成一个“补丁”,最后用batch方法将这个补丁打到需要更新的节点上。差量更新既能让开发者感受到舒适的开发体验,又保持了优异的性能。可谓是写的爽和用的爽的双赢典范。

在“差量更新”这一至关重要的功能得以应用之外,还有一个重要的功能是“批量更新”,即用户在短时间内dom进行高频操作的时候会取最后一次的操作结果,以此避免大量的大成本的性能消耗。这里就涉及batch方法的内容了,他会缓冲每次生成的补丁集,然后把它们放入一个队列中,算出一个渲染结果后再将结果交给渲染函数,以此实现批量更新。

有那么多优势的情况下,人们下意识的认为虚拟DOM的性能优于模板语法,可这真的对吗?

我们不妨回头看看两者的流程区别,模板语法的流程是 数据->模板->真实dom,虚拟DOM的流程是数据->模版/算法/语法糖->虚拟dom->一系列js操作->真实dom

你突然发现,虚拟DOM的流程明明长了那么多,为什么大家会说它的性能更好?

其实这个问题的答案应该分环境来讲:在数据量少的情况下,两者性能相差无几。数据量多的情况下,若是数据改变大,接近于全页面更新,模版语法性能更好。在局部更新为主的环境下,虚拟DOM的性能更好。而这,恰好是最频繁的线上情况。

在现代的模板语法中,模板语法同样具有将数据转化为虚拟DOM的能力。所以大家别下意识的认定虚拟DOM的性能一定优于模板语法。这种说法是有谬误的,应该说在特定情况下,应用虚拟DOM有着比单独应用模板语法更优越的性能。

更进一步来说,虚拟DOM提供了一个同一化的能够操作dom对象的入口,在如今越来越提倡多端代码一套共用的今天,虚拟DOM可以是IOS界面,可以是安卓界面,可以是小程序,可以是其他…它需要的只是不同的转译,这就实现了真正的多端通用。

至此,我们来总结一下虚拟DOM的优势到底是什么。

1.它让用户用的很爽,因为它解决了页面性能优化的关键性痛点。

2.他让开发者开发的很爽,爽意味着迭代的效率,意味着社区维护的积极性。

3.他能解决多端复用统一性的问题,这可以减少成本,而减少成本,意味着占有市场。

是什么推动了前端职能和功能的高速发展?


从之前的阐述中,我们不经惊叹前端技术栈的日新月异。从一个静态页面切图仔到如今的大前端大全栈微前端,仿佛前端的大厦在短短的十几年里尘埃落定,熠熠生辉。

那么是什么推动了前端职能和功能的高速发展呢?

这个问题我想认真了解前端发展史的同学一定会若有所思。我们不如换个更落地的问题。

什么样的技术/项目,会成为受欢迎的项目,甚至引领环境的发展呢?

从我的角度来说。所有能称之为成功的技术/项目都有一个特点——性能和产能的双赢

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

学习笔记

主要内容包括html,css,html5,css3,JavaScript,正则表达式,函数,BOM,DOM,jQuery,AJAX,vue等等

HTML/CSS

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

**HTML:**HTML基本结构,标签属性,事件属性,文本标签,多媒体标签,列表 / 表格 / 表单标签,其他语义化标签,网页结构,模块划分

**CSS:**CSS代码语法,CSS 放置位置,CSS的继承,选择器的种类/优先级,背景样式,字体样式,文本属性,基本样式,样式重置,盒模型样式,浮动float,定位position,浏览器默认样式

HTML5 /CSS3

**HTML5:**HTML5 的优势,HTML5 废弃元素,HTML5 新增元素,HTML5 表单相关元素和属性

**CSS3:**CSS3 新增选择器,CSS3 新增属性,新增变形动画属性,3D变形属性,CSS3 的过渡属性,CSS3 的动画属性,CSS3 新增多列属性,CSS3新增单位,弹性盒模型

JavaScript

**JavaScript:**JavaScript基础,JavaScript数据类型,算术运算,强制转换,赋值运算,关系运算,逻辑运算,三元运算,分支循环,switch,while,do-while,for,break,continue,数组,数组方法,二维数组,字符串

性,CSS3新增单位,弹性盒模型

[外链图片转存中…(img-J7hWSFqY-1711817757854)]

JavaScript

**JavaScript:**JavaScript基础,JavaScript数据类型,算术运算,强制转换,赋值运算,关系运算,逻辑运算,三元运算,分支循环,switch,while,do-while,for,break,continue,数组,数组方法,二维数组,字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值