总结4个方面优化Vue项目


Posted in Javascript onFebruary 11, 2019

运行时优化

1、使用v-if代替v-show

两者的区别是:v-if不渲染DOM,v-show会预渲染DOM

除以下情况使用v-show,其他情况尽量使用v-if

有预渲染需求

需要频繁切换显示状态

2、v-for必须加上key,并避免同时使用v-if

一般我们在两种常见的情况下会倾向于这样做:

为了过滤一个列表中的项目
比如 v-for="user in users" v-if="user.isActive"。在这种情形下,请将 users替换为一个计算属性 (比如 activeUsers),让其返回过滤后的列表

为了避免渲染本应该被隐藏的列表
比如 v-for="user in users" v-if="shouldShowUsers"。这种情形下,请将 v-if 移动至容器元素上 (比如 ul, ol)

3、事件及时销毁

Vue组件销毁时,会自动清理它与其它实例的连接,解绑它的全部指令及事件监听器,但是仅限于组件本身的事件。

也就是说,在js内使用addEventListener等方式是不会自动销毁的,我们需要在组件销毁时手动移除这些事件的监听,以免造成内存泄露,如:

created() {
 addEventListener('touchmove', this.touchmove, false)
},
beforeDestroy() {
 removeEventListener('touchmove', this.touchmove, false)
}

首屏优化

1、图片裁剪、使用webp

  • 图片需要裁剪,一般使用二倍图即可
  • 尽量使用webp图片
  • 如果使用了vue-lazyload插件,可以使用以下方法一键替换webp(替换使用v-lazy指令的图片)
Vue.use(VueLazyload, {
 error: require('./assets/img/defaultpic_small.png'),
 filter: {
 webp (listener: any, options: any) {
 if (!options.supportWebp) return
 // listener.src += '.webp'
 }
 }
});

2、资源提前请求

经测试,Vue项目中各文件的加载顺序为:router.js、main.js、App.vue、[-page-].vue、[component].vue,如图:

总结4个方面优化Vue项目

其中,router的加载时间相比于page.vue快近100ms,如果page.vue的文件较多,时间差异会更大

所以,可以在页面挂载、渲染的同时去请求接口数据,如在router.js中请求数据:

import Router from 'vue-router'
import store from './store'

store.dispatch('initAjax')

3、异步路由

使用异步路由可以根据URL自动加载所需页面的资源,并且不会造成页面阻塞,较适用于移动端页面

建议主页面直接import,非主页面使用异步路由

使用方式:

{
 path: '/order',
 component: () => import('./views/order.vue')
}

4、异步组件

不需要首屏加载的组件都使用异步组件的方式来加载(如多tab),包括需要触发条件的动作也使用异步组件(如弹窗)
使用方式为:v-if来控制显示时机,引入组件的Promise即可

<template>
 <div>
 <HellowWorld v-if="showHello" />
 </div>
</template>
<script>
export default {
 components: { HellowWorld: () => import('../components/HelloWorld.vue') },
 data() {
 return {
 showHello: false
 }
 },
 methods: {
 initAsync() {
 addEventListener('scroll', (e) => {
 if (scrollY > 100) {
 this.showHello = true
 }
 })
 }
 }
}
</script>

5、使用轻量级插件、异步插件

使用webpack-bundle-analyzer查看项目所有包的体积大小,较大的插件包尽量寻找轻量级的替代方案

首屏用不到的插件、或只在特定场景才会用到的插件使用异步加载(如定位插件,部分情况可以通过URL传递经纬度;或生成画报插件,需要在点击时触发);插件第一次加载后缓存在本地,使用方式为:

// 以定位插件为例
const latitude = getUrlParam('latitude')
const longitude = getUrlParam('longitude')
// 如果没有经纬度参数,则使用定位插件来获取经纬度
if (!latitude || !longitude) {
 // 首次加载定位插件
 // webpack4写法,若使用webpack3及以下,则await import('locationPlugin')即可
 if (!this.WhereAmI) this.WhereAmI = (await import('locationPlugin')).default
 // do sth...
}

6、公用CDN

使用公用的CDN资源,可以起到缓存作用,并减少打包体积

网络优化

1、减少网络请求

浏览器对同一时间针对同一域名下的请求有一定数量限制(一般是6个),超过限制数目的请求会被阻塞
首屏尽可能减少同域名的请求,包括接口和js;按需减少首屏的chunk.js,合并接口请求

2、合理使用preload、dns-prefetch、prefetch

  • preload具有较高的加载优先级,它可以利用间隙时间预加载资源,将加载和执行分离开,不阻塞渲染和document的onload事件
  • 每次与域名连接都需要进行DNS解析,使用dns-prefetch可以预解析域名的DNS
  • prefetch会预加载页面将来可能用到的一些资源,优先级较低;对首屏渲染要求较高的项目不建议使用

三者的使用方式,在head标签中添加(vue-cli-3已经做了相应配置):

<head>
 <meta charset="utf-8" />
 <meta http-equiv="X-UA-Compatible" content="IE=edge" />
 <meta name="viewport" content="width=device-width,initial-scale=1" />
 <link rel="icon" href="/dist/favicon.ico" rel="external nofollow" />
 <!-- dns-prefetch写法 -->
 <link rel="dns-prefetch" href="//www.dpfile.com" rel="external nofollow" />
 <title>md-config</title>
 <!-- preload写法,as属性必须 -->
 <link href="/dist/css/app.52dd885e.css" rel="external nofollow" rel="preload" as="style" />
 <link href="/dist/js/app.05faf3b5.js" rel="external nofollow" rel="preload" as="script" />
 <link href="/dist/js/chunk-vendors.04343b1f.js" rel="external nofollow" rel="external nofollow" rel="preload" as="script" />
 <!-- prefetch写法 -->
 <link href="/dist/js/chunk-vendors.04343b1f.js" rel="external nofollow" rel="external nofollow" rel="prefetch" />
</head>

3、PWA

PWA支持缓存HTML文档、接口(get)等,降低页面白屏时间
这样即使在弱网甚至断网情况下,也能迅速展示出页面

编译打包优化

1、升级Vue-Cli-3

vue-cli-3采用webpack4+babel7,对编译打包方面做了很多优化(成倍的提升),使用yarn作为包管理工具,并且对很多优化的最佳实践做了默认配置

经测试,将项目从vue-cli-2迁移到vue-cli-3之后,速度变化为:

编译时间:44s --> 7s
打包时间:55s --> 11s

效率提升非常明显

2、SSR

对加载性能要求较高的项目建议升级SSR

Javascript 相关文章推荐
JavaScript 中的replace方法说明
Apr 13 Javascript
jquery插件制作简单示例说明
Feb 03 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
Sep 23 Javascript
基于javascript实现tab切换特效
Mar 29 Javascript
深入理解JavaScript中的并行处理
Sep 22 Javascript
jQuery操作复选框(CheckBox)的取值赋值实现代码
Jan 10 Javascript
JS之if语句对接事件动作逻辑(详解)
Jun 28 Javascript
基于easyui checkbox 的一些操作处理方法
Jul 10 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
Nov 23 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
Apr 14 Javascript
js贪心算法 钱币找零问题代码实例
Sep 11 Javascript
一分钟学会JavaScript中的try-catch
Dec 14 Javascript
JavaScript 九种跨域方式实现原理
Feb 11 #Javascript
ES6 迭代器与可迭代对象的实现
Feb 11 #Javascript
详解mpvue中小程序自定义导航组件开发指南
Feb 11 #Javascript
如何用JavaScript实现功能齐全的单链表详解
Feb 11 #Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
Feb 11 #Javascript
vue实现动态显示与隐藏底部导航的方法分析
Feb 11 #Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
Feb 11 #Javascript
You might like
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
TNC vs IO BO3 第一场2.13
2021/03/10 DOTA
用javascript实现改变TEXTAREA滚动条和按钮的颜色,以及怎样让滚动条变得扁平
2007/04/20 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
JavaScript实现in-place思想的快速排序方法
2016/08/07 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
Angular学习教程之RouterLink花式跳转
2018/05/03 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
原生JS实现顶部导航栏显示按钮+搜索框功能
2019/12/25 Javascript
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
实例讲解python中的序列化知识点
2018/10/08 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
python 中如何获取列表的索引
2019/07/02 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
如何通过python实现IOU计算代码实例
2020/11/02 Python
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
印度尼西亚综合购物网站:Lazada印尼
2016/09/07 全球购物
意大利奢侈品零售商:ilDuomo Novara
2019/09/11 全球购物
亚马逊新加坡官方网站:Amazon.sg
2020/03/25 全球购物
2014年个人债务授权委托书范本
2014/09/22 职场文书
研究生导师推荐信
2015/03/25 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers