说到虚拟DOM,我还是去研究了一下
虚拟DOM是一个JavaScript对象,通过对象的方式来表示DOM结构。将页面的状态抽象为JS对象的形式。
vue他是一个通用的框架,他不知道数据和页面的对应关系,只能全量生成,把整个页面全部生成一遍,如果生成真实dom,触发重绘回流太多,性能太差,所以使用虚拟DOM。
第一点,性能
如果说真实DOM和虚拟DOM的性能差距,那这不能说哪个更好,虚拟DOM可以与之前的虚拟DOM对比,找出修改的地方,然后将这多次DOM修改,合并成一次修改,一次性修改全部改变的地方,减少了页面渲染的次数,减少了触发重绘和回流的次数,但是也不能说他性能一定比真实DOM好,只能说它相当于是,保证了一个性能的下限,因为他也需要在内存中进行计算和比较,这可能会导致一些额外的性能开销。
还有就是,真的的性能极致,应该还是使用真实DOM去操作,但是那样对代码编写的规范性要求很高。例如vscode。
对于我们正常业务的应用来说,使用虚拟DOM可以保证性能不会太差,还会保证我们不用去手动操作DOM。但是对于vscode这种应用,性能要求到极致,这种情况下框架的性能瓶颈十分容易凸现出来,因为前端框架将 DOM操作封装在了前端框架内部,比如 react 和 vue 靠 diff 操作来获取差异队列,然后再处理 dom 变化,这对于 vscode 这种应用是不能接受的,vscode 的做法是直接操作 dom(直接操作 dom 比框架那种先 dff 再操作 dom 的方法快得多),而且最重要的一点是,框架对 dom 的操作基本上是一个定式,这个定式保证了性能的下限,但是 vscode 需要的是压榨性能的极限,所以框架完全在这里是多此一举的操作,vscode 用了很多奇技淫巧压榨ui 层面的性能,这些奇技淫巧根本不是常规操作所以前端框架根本无法内置.
第二点,不用手动操作DOM
另外现代前端框架的一个基本要求就是无须手动操作DOM,一方面是因为手动操作DOM无法保证程序性能,多人协作的项目中如果review不严格,可能会有开发者写出性能较低的代码,另一方面更重要的是省略手动DOM操作可以大大提高开发效率。
第三点。跨平台
但是到这里还没说到虚拟DOM最大的用处,因为虚拟DOM相对于就是一个js对象,所以,这使得虚拟DOM他不止可以在浏览器使用,可以在很多地方使用,虚拟DOM可以抹平多端的差异,拥有将一种格式转换成多端的能力,这样就做到了跨平台
使用虚拟DOM很重要的原因就是跨平台能力,一种格式转换成多端,例如服务器渲染、移动端开发等等,比如各种小程序。一端转化为多端。让服务器生成好虚拟DOM然后传给客户端,实现更好的性能