vue 性能优化详解(一)

前端路漫漫,优化无极限。
本文主要从代码层面对vue项目性能优化进行总结,

1.v-if 和 v-show 区分场景使用

v-if真正的条件渲染,也就说,当值为假的时候,不做DOM渲染。
v-show则是利用display:none来控制DOM显示。当需要频繁更新DOM时,尽量使用后者。

2.computed 和 watch

computed计算属性,依赖其它属性值,只有它依赖的属性值发生改变,才会重新计算,并且有缓存。当我们需要进行数值计算,并且依赖于其它数据时,可以利用计算属性的缓存特性,避免每次获取值时,都要重新计算。
watch监听回调,每当监听的数据变化时都会执行回调进行后续操作。当我们需要在数据变化时执行异步或开销较大的操作时,应该使用 watch,它允许我们执行异步操作 ( 访问一个 API ),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。

3.避免同时使用v-for 和 v-if

v-forv-if优先级高,如果每一次都需要遍历整个数组,将会影响速度,尤其是当之需要渲染很小一部分的时候,必要情况下应该替换成 computed 属性。

//推荐
<ul>
  <li
    v-for="user in activeUsers" //遍历计算属性
    :key="user.id">
    {{ user.name }}
  </li>
</ul>
computed: {
  activeUsers: function () {
    return this.users.filter(function (user) {
     return user.isActive //筛选后用于计算
    })
  }
}
//不推荐
<ul>
  <li
    v-for="user in users"
    v-if="user.isActive"
    :key="user.id">
    {{ user.name }}
  </li>
</ul>
4.长列表优化

Vue 会通过Object.defineProperty对数据进行劫持,来实现视图响应数据的变化,但当一个组件只是用于数据的展示,那么不需要 Vue 进行数据,当数据过大时,能够很明显的减少组件初始化的时间。我们可以通过Object.freeze方法来冻结一个对象,一旦对象被冻结就再也不能被修改了。

export default {
  data: () => ({
    users: {}
  }),
  async created() { //声明一个异步函数
    const users = await axios.get("/api/users");
    this.users = Object.freeze(users);
  }
};
5.事件销毁

Vue 组件销毁时,会自动清理它与其它实例的连接,解绑它的全部指令及事件监听器,但这仅限于组件本身的事件。如果在 js 内使用addEventListene等方式绑定事件,是不会自动销毁的,这就需要在组件销毁时手动移除这些事件的监听,以免造成内存泄露

created() {
  addEventListener('click', this.click, false)
},
beforeDestroy() {
  removeEventListener('click', this.click, false)
}
6.图片资源懒加载

当图片资源过多,为了加速页面加载,我们可以暂时先不加载那些不出现在可视区域的图片,等需要展示的时候在进行加载。
①使用v-lazyload插件:

//安装插件
npm install vue-lazyload --save-dev
//在入口文件main.js 中引入并使用
import VueLazyload from 'vue-lazyload'
Vue.use(VueLazyload)
//或者添加自定义选项
Vue.use(VueLazyload, {
  preLoad: 1.3,
  error: 'dist/error.png',
  loading: 'dist/loading.gif',
  attempt: 1
})

②在 vue 文件中将 <img>src属性直接改为v-lazy,从而将图片显示方式更改为懒加载显示。

<img v-lazy="图片地址">
7.路由懒加载

vue 是单页面应用,也就是说在进入首页时会加载全部资源,当加载的资源过多时,页面可能会出现白屏的情况,不利于用户体验。因此,我们可以把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应的组件,更加高效。这样做会大大提高首屏显示的速度,但是可能其它的页面的速度就会降下来。

export default new Router({
    routes: [
        {
            path: '/',
            name: 'home',
            component:resolve => require(['./views/Home.vue'],resolve),
        }
    ]
})
8.无限列表性能优化

当页面中需要展示很多列表时,过去我们会通过分页的方式来展现,它能够足够保证高性能和适当的内存使用,但页面的切换会打断用户的浏览连贯性,同时也会增加用户的等待时间。因此现在流行的长列表加载方式,即当用户将滚到页面底部时,就会通过ajax请求下一页的内容,然后渲染到页面上,从而实现无缝的浏览体验(网络不佳除外)。但这种方式也有致命的缺点,用户不断浏览时,页面上的列表节点就越来越多,内存的使用就会大大提升,性能也就跟着下降
解决办法:

vue-virtual-scroll-list
//或
 vue-virtual-scroller
9.SSR(服务端渲染)【具体实现略】

服务端渲染:指 Vue 在客户端将标签渲染成的整个 html 片段的工作在服务端完成,服务端形成的 html 片段直接返回给客户端这个过程就叫做服务端渲染。
①优点:
-更好的 SEO:因为 SPA(单页应用程序) 页面的内容是通过 ajax 获取,而搜索引擎爬取工具并不会等待 ajax 异步完成后再抓取页面内容,所以在 SPA中是抓取不到页面通过 ajax 获取到的内容;而 SSR 是直接由服务端返回已经渲染好的页面(数据已经包含在页面中),所以搜索引擎爬取工具可以抓取渲染好的页面。
-首屏加载更快:SPA 会等待所有 Vue 编译后的 js 文件都下载完成后,才开始进行页面的渲染,文件下载等需要一定的时间等,所以首屏渲染需要一定的时间;SSR 直接由服务端渲染好页面直接返回显示,无需等待下载 js 文件及再去渲染等,所以 SSR 有更快的内容到达时间。
②缺点:
-更多的开发条件限制:例如服务端渲染只支持 beforCreate 和 created 两个钩子函数,这会导致一些外部扩展库需要特殊处理,才能在服务端渲染应用程序中运行;并且需要处于 Node.js server运行环境;
-更多的服务器负载:在 Node.js中渲染完整的应用程序,显然会比仅仅提供静态文件的server占用更多的CPU 资源。

10.预渲染【具体实现略】

如果一个项目只需改善少数页面的SEO,可以使用预渲染的方式实现。即在构建时(build)简单地生成针对特定路由的静态 HTML 文件。
优点是设置简单,并且可以将前端作为一个完全静态的站点,具体可以使用prerender-spa-plugin就可以轻松地添加预渲染 。

11.第三方插件按需引入(略)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,142评论 0 1
  • vue概述 在官方文档中,有一句话对Vue的定位说的很明确:Vue.js 的核心是一个允许采用简洁的模板语法来声明...
    li4065阅读 7,193评论 0 25
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    小姜先森o0O阅读 9,417评论 0 72
  • 得益于 Vue 的响应式系统和虚拟 DOM 系统,Vue 在渲染组件的过程中能自动追踪数据的依赖,并精确知晓数据更...
    grain先森阅读 18,052评论 0 129
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    柴东啊阅读 15,849评论 2 140