双向绑定原理:实现数据的双向绑定,首先要对数据进行劫持监听,因此咱们须要设置一个监听器Observer
,用来监听全部属性。若是属性发上变化了,就须要告诉订阅者Watcher
看是否须要更新。由于订阅者是有不少个,因此咱们须要有一个消息订阅器Dep
来专门收集这些订阅者,而后在监听器Observer
和订阅者Watcher
之间进行统一管理的。php
vue2与3的双向绑定和实现的优缺点:1. 在Vue中,Object.defineProperty
没法监控到数组下标的变化,css
2. Object.defineProperty只能劫持对象的属性,所以咱们须要对每一个对象的每一个属性进行遍历。html
而要取代它的Proxy有如下两个优势:前端
1. 能够劫持整个对象,并返回一个新对象
2. 有13种劫持操做vue
Proxy 能够理解成,在目标对象以前架设一层“拦截”,外界对该对象的访问,都必须先经过这层拦截,所以提供了一种机制,能够对外界的访问进行过滤和改写。webpack
vue路由实现原理::JS会感知到url的变化,经过这一点,能够用js动态的将当前页面的内容清除掉,而后将下一个页面的内容挂载到当前页面上,这个时候的路由不是后端来作了,而是前端来作,判断页面究竟是显示哪一个组件,清除不须要的,显示须要的组件。这种过程就是单页应用,每次跳转的时候不须要再请求html文件了。web
虚拟dom:算法
最原始的状况下,框架一旦发现数据发生了变更就对整个页面进行更新。这样的作法效率低下,由于数据的变更而致使的页面变更极可能只是局部的,直接对整个页面进行更新形成了没必要要的性能消耗。vuex
因此人们很天然的就会想到将因数据变更而新生成的DOM结构与已经显示出来的DOM结构进行比较,找出二者的不一样处,再对这些不一样进行从新渲染便可。有的放矢,从而提高性能。vue-cli
而那个仅在内存中未显示出来的DOM结构就是所谓的虚拟DOM,找出二者不一样的算法就是Diff算法。
不过须要注意的是,虚拟DOM和Diff算法的出现是为了解决由命令式编程转变为函数式编程、数据驱动后所带来的性能问题的。换句话说,直接操做DOM的性能并不会低于虚拟DOM和Diff算法,甚至还会优于。
compare属性:
computed
会搜集并记录依赖。computed
,因为 computed
是有缓存的,因此当依赖变化以后,第一次访问 computed
属性的时候,才会计算新的值。vm
实例以外的属性依赖nextTick
,将等待DOM渲染完成后须要的操做放在回调函数里。
vue优化方案:
对路由组件进行懒加载
v-if 和 v-show选择调用
v-show和v-if的区别是:v-if是懒加载,当状态为true时才会加载,而且为false时不会占用布局空间;v-show是不管状态是true或者是false,都会进行渲染,并对布局占据空间对于在项目中,须要频繁调用,不须要权限的显示隐藏,能够选择使用v-show,能够减小系统的切换开销。
为item设置惟一key值,
在列表数据进行遍历渲染时,须要为每一项item设置惟一key值,方便vuejs内部机制精准找到该条列表数据。当state更新时,新的状态值和旧的状态值对比,较快地定位到diff。
细分vuejs组件
在项目开发过程之中,初版本把全部的组件的布局写在一个组件中,当数据变动时,因为组件代码比较庞大,vuejs的数据驱动视图更新比较慢,形成渲染比较慢。形成比较差的体验效果。因此把组件细分,好比一个组件,能够把整个组件细分红轮播组件、列表组件、分页组件等。
减小watch的数据
当组件某个数据变动后须要对应的state进行变动,就须要对另外的组件进行state进行变动。可使用watch监听相应的数据变动并绑定事件。当watch的数据比较小,性能消耗不明显。当数据变大,系统会出现卡顿,因此减小watch的数据。其它不一样的组件的state双向绑定,能够采用事件中央总线或者vuex进行数据的变动操做。
内容类系统的图片资源按需加载
对于内容类系统的图片按需加载,若是出现图片加载比较多,能够先使用v-lazy之类的懒加载库或者绑定鼠标的scroll事件,滚动到可视区域先再对数据进行加载显示,减小系统加载的数据。
SR(服务端渲染)
若是项目比较大,首屏不管怎么作优化,都出现闪屏或者一阵黑屏的状况。能够考虑使用SSR(服务端渲染),vuejs官方文档提供next.js很好的服务端解决方案,可是局限性就是目前仅支持Koa、express等Nodejs的后台框架,须要webpack支持。目前本身了解的就是后端支持方面,vuejs的后端渲染支持php,其它的不太清楚。
vue渲染大量数据时处理:
1. 异步渲染组件:由于组件渲染太多,影响页面的渲染时间,全部能够延迟组件渲染,能够考虑v-if处理
2. 可使用虚拟滚动的组件:参考使用这个插件
vue首屏优化:
不管是否为单页应用,代码的压缩都是要作的。
对于vue-cli生成的项目,在Webpack配置文件中使用了UglifyJsPlugin进行代码的压缩:
对于项目中用到的一些UI框架,好比 Onsen UI 、Mint UI 等等。若是咱们只使用框架的部分组件,那么能够不要引入整个框架,按需引入用到的组件
在开发过程当中,咱们其实不会要去更改这些第三方库,因此能够把它们放到cdn中,不参与打包。
在 index.html 中使用cdn引入
路由懒加载也就是 把不一样路由对应的组件分割成不一样的代码块,而后当路由被访问的时候才加载对应组件。
结合 Vue 的异步组件和 Webpack 的代码分割功能,轻松实现路由组件的懒加载。
、
重绘与重排
1>重排(Reflow):当渲染树的一部分必须更新而且节点的尺寸发生了变化,浏览器会使渲染树中受到影响的部分失效,并从新构造渲染树。
2>重绘(Repaint):是在一个元素的外观被改变所触发的浏览器行为,浏览器会根据元素的新属性从新绘制,使元素呈现新的外观。好比改变某个元素的背景色、文字颜色、边框颜色等等
3>引起重排
1.添加、删除可见的dom
2.元素的位置改变
3.元素的尺寸改变(外边距、内边距、边框厚度、宽高、等几何属性)
4.页面渲染初始化
5.浏览器窗口尺寸改变
6.获取某些属性。当获取一些属性时,浏览器为取得正确的值也会触发重排,它会致使队列刷新,这些属性包括:offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight、getComputedStyle() (currentStyle in IE)。因此,在屡次使用这些值时应进行缓存。
4>优化:
浏览器本身的优化:
浏览器会维护1个队列,把全部会引发重排,重绘的操做放入这个队列,等队列中的操做到必定数量或者到了必定时间间隔,浏览器就会flush队列,进行一批处理,这样屡次重排,重绘变成一次重排重绘
减小 reflow/repaint:
(1)不要一条一条地修改 DOM 的样式。能够先定义好 css 的 class,而后修改 DOM 的 className。
(2)不要把 DOM 结点的属性值放在一个循环里当成循环里的变量。(3)为动画的 HTML 元件使用 fixed 或 absoult 的 position,那么修改他们的 CSS 是不会 reflow 的。(4)千万不要使用 table 布局。由于可能很小的一个小改动会形成整个 table 的从新布局。(table及其内部元素除外,它可能须要屡次计算才能肯定好其在渲染树中节点的属性,一般要花3倍于同等元素的时间。这也是为何咱们要避免使用table作布局的一个缘由。)