资讯专栏INFORMATION COLUMN

VUE底层结构浅析

IT那活儿 / 3147人阅读
VUE底层结构浅析

鉴于公司统一框架之后大家对于vue的使用都已经基本上手,在项目运用中有很多由研发部门自定义的组件,那么,自定义组件,elementui组件,甚至于自编写组件应该如何设计呢?这就需要大家对vue的底层有一定了解。


一、关于JavaScript


vue页面是由JavaScript语言+vue标签+css语法共同组成,nodejs编译的核心语言也是JavaScript,先来了解下该语言的运行的两个阶段:


  • 预解析(将function定义的函数/var等定义的变量声明提前准备)

  • 从上到下执行

js运行机制的特点:

单线程,这点很好理解,前面的事情结束才执行后面的事件

事件循环EventLoop,包括setTimeout(延时器)和setInterval(定时器)、DOM事件、ES6中的Promise、Ajax异步请求。在主线程执行的时候,会形成一个执行栈以及一个任务队列,栈中的同步任务执行完成之后会读取任务队列,异步任务就会进入栈开始执行,读取过程会不断重复,如图:

二、VUE源码构建步骤


第一步,newvue() 初始化生命周期等,主要实现以下三个内容:

1、通过observer 对data 进行监听,并且提供订阅某个数据项的变化

2、把template 解析成一段document fragment,然后解析其中的directive,得到每一个directive 所依赖的数据项及其更新方法。

3、watcher把directive 中的数据依赖订阅在对应数据的observer 上,当数据变化的时候,就会触发observer,进而触发相关依赖对应的视图更新方法,以达到模板关联效果。


第二步,调用$mount来执行挂载函数。指定一个挂载节点,模板编译、显示。


第三步,启动编译器compile生成渲染函数,并生成虚拟节点树,数据更新改变的数据即是这个虚拟dom上的数值,更新之前通过diff算法的比较,将新老值进行比较,以实现最小的dom更新。为减少页面渲染的次数和数量,compile编译渲染函数同时会进行依赖收集,通过这个这个步骤监视页面数据,当数据发生变化时以确认需要更新的dom节点。


第四步,watcher观察数据变化,调用渲染函数。


第五步,执行patch更新界面。




三、响应式数据的核心object.defineProperty&Proxy(Vue3.0)


VUE在初始化数据时,会给data 中的属性通过调用object.defineProperty()来劫持各个属性的getter 和setter,在数据变化的时候通知订阅者,并触发相应的回调。


因为Object.defineProperty存在缺点,3.0版本后开始使用Proxy实现响应式,两者对比如下:

Object.defineProperty只能劫持对象的属性,因此需要遍历对象的每个属性,而Proxy 可以直接代理对象

Object.defineProperty 对新增属性需要手动进行观察,由于Object.defineProperty劫持的是对象的属性(第一点),所以新增属性时,需要重新遍历对象,对其新增属性再使用

Object.defineProperty 进行劫持(正是这个原因导致我们在给 data中的数组或对象新增属性时,需要使用$set 才能保证视图可以更新)

Proxy 性能高,支持13种拦截方式


四、编译compile的工作原理及总结


compile 的主要作用是根据template 模板,生成render函数。通过核心逻辑获取dom,遍历dom,获取{{}}格式的变量,以及每个dom的属性,截获k-@等开头设置响应式。


以上是关于VUE底层结构的浅显分析,通过JS运行机制特点,介绍VUE源码构建和编译compile工作原理,希望对大家后续vue的使用开发有所帮助。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/130113.html

相关文章

  • Vue.nextTick浅析

    摘要:浅析的特点之一就是响应式,但数据更新时,并不会立即更新。尽管已经更新,但新增的元素并不立即插入到中。实际在中,执行了,这也是自动绑定到执行上下文的原因。在内,使用数组保存回调函数,表示当前状态,使用函数来执行回调队列。 Vue.nextTick 浅析 Vue 的特点之一就是响应式,但数据更新时,DOM 并不会立即更新。当我们有一个业务场景,需要在 DOM 更新之后再执行一段代码时,可以...

    MartinDai 评论0 收藏0
  • 浅析HashMap源码(1)

    摘要:前言本文的目的是阅读理解的源码,作为集合中重要的一个角色,平时用到十分多的一个类,深入理解它,知其所以然很重要。 前言 本文的目的是阅读理解HashMap的源码,作为集合中重要的一个角色,平时用到十分多的一个类,深入理解它,知其所以然很重要。本文基于Jdk1.7,因为Jdk1.8改变了HashMap的数据结构,进行了优化,我们先从基础阅读,之后再阅读理解Jdk1.8的内容 HashMa...

    wwolf 评论0 收藏0
  • 浅析 web 前端 MVVM

    摘要:它由微软架构师和开发,通过利用微软图形系统和的互联网应用派生品的特性来简化用户界面的事件驱动程序设计。微软的和架构师之一于年在他的博客上发表了。更改时会得到提醒这个情况是一个单向流。 前言 记得四个月前有一次面试,面试官问我 MVVM 是什么,MVVM 的本质是什么。我大脑一片混乱,那时我对 MVVM 的认知就只是双向绑定和Vue,以这个关键字简单回答了几句,我反问 MVVM 的本质是...

    VincentFF 评论0 收藏0
  • 浅析guava容器multimap

    摘要:它主要做了件事初始化容器,并将元素添加到容器里维护这样我们再调用的方法直接就返回了,不需要再次遍历和统计的过程。维护实时的维护,及时删除总结整体上是对底层的二次封装,很好的处理了各种细节,比如子容器的判空处理,的计算效率,的维护等。 在日常开发中我们通常有需要对 List 容器进行分组的情况,比如对下面的list数据根据name字段来进行分组: [ { date...

    yy13818512006 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<