vue v-if判断数组元素的值_我对Vue项目上线做的一些基本优化
前言
大家好啊,我是wangly19,一名前端摸鱼小能手。最近忙着开源项目的东西,还有公司项目的迭代问题,导致更新文章的频率有点低了。也来聊聊我在干嘛吧。
第一个事情就是比较我的阉割版UI Design,要开始Vue3.0的开发工作,所以近期都在看Vue3.0的东西。其次就是和UI配套的方法库,也是我近期的一个项目,是一个Typescript生产的小东西。希望能够对于大家有一些帮助。
eleganceUI框架:?Github仓库
这篇文章呢,主要是做一个Vue性能优化的帖子,做一个参考文档,对以后项目上线做一些集合文档。如果对各位在项目优化时,做一个文档参照。
开发过程
在开发项目的时候,就要注意项目的一些小技巧,下面我就罗列一些经常用到的优化的方法吧。同时老规矩,查缺补漏。
优先使用vIf
vIf
和 vShow
理论上都是作用于元素的显示隐藏,只是一个是直接对DOM,一个是通过CSS的 display
来操作的,在项目中大部分的时候我都是直接使用 vIf
直接代替使用 vShow
,只有当DOM频繁进行显示和隐藏的时候,但是这种场景非常少见,我只在信息推送优先级中使用过,项目中一直通过 WebSocket
推的消息进行消息的场景遇到过,频繁推送不同类型的通知。
vFor和vIf不要一起使用
vFor
的优先级其实是比 vIF
高的,所以当两个指令出现来一个DOM中,那么 vFor
渲染的当前列表,每一次都需要进行一次 vIf
的判断。而相应的列表也会重新变化,这个看起来是非常不合理的。因此当你需要进行同步指令的时候。尽量使用计算属性,先将 vIf
不需要的值先过滤掉。他看起像是下面这样的。
// 计算属性computed: { filterList: function () { return this.showData.filter(function (data) { return data.isShow })} // DOM
<li v-for="item in filterList" :key="item.id"> {{ item.name }} li>ul>
vFor key避免使用index作为标识
其实大家都知道 vFor
是不推荐使用 index
下标来作为 key
的值,这是一个非常好理解的知识点,可以从图中看到,当index作为标识的时候,插入一条数据的时候,列表中它后面的key都发生了变化,那么当前的 vFor
都会对key变化的 Element
重新渲染,但是其实它们除了插入的 Element
数据都没有发生改变,这就导致了没有必要的开销。所以,尽量不要用index作为标识,而去采用数据中的唯一值,如 id
等字段。
释放组件资源
什么是资源? 每创建出一个事物都需要消耗资源,资源不是凭空产生的,是分配出来的。所以说,当组件销毁后,尽量把我们开辟出来的资源块给销毁掉,比如 setInterval , addEventListener等,如果你不去手动给释放掉,那么它们依旧会占用一部分资源。这就导致了没有必要的资源浪费。多来几次后,可以想象下资源占用率肯定是上升的。
添加的事件
created() { addEventListener('click', Function, false)},beforeDestroy() { removeEventListener('click', Function false)}
定时器
created() { this.currentInterVal = setInterval(code,millisec,lang)},beforeDestroy() { clearInterval(this.currentInterVal)}
长列表
项目当中,会涉及到非常多的长列表场景,区别于普通的分页来说,大部分的前端在做这种 无限列表
的时候,大部分新手前端都是通过一个 vFor
将数据遍历出来,想的多一点的就是做一个分页。滚动到底部的时候就继续请求 API
。其实这也是未思考妥当的。随着数据的加载,DOM会越来越多,这样就导致了性能开销的问题产生了,当页面上的DOM太多的时候,难免给我的客户端造成一定的压力,所以对于长列表渲染的时候,建议将DOM移除掉,类似于图片懒加载的模式,只有出现在视图上的DOM才是重要的DOM。网络上有一些很好的解决方案,如 vue-virtual-scroller
库等等,大家可以理性的选择。
图片合理的优化方式
图片应该都不陌生吧,在网页中,往往存在大量的图片资源,这些资源或大或小。当我们页面中DOM中存在大量的图片时,难免不会碰到一些加载缓慢的问题,导致图片出现加载失败的问题。网络上大部分都在使用 懒加载
的使用方式,只有当 存在图片的DOM
出现在页面上才会进行图片的加载,无形中起到了分流的作用,下面就说一套实践的方案吧
- 小图标使用
SVG
或者字体图标 - 通过
base64
和webp
的方式加载小型图片 - 能通过cdn加速的大图尽量用cdn
- 大部分框架都带有懒加载的图片,不要嫌麻烦,多花点时间使用它
路由器按需加载
对于路由的懒加载,如果还不会的话,那么就真该好好的重新去学习一下了。路由懒加载的方式有两种,一种是require
另一种是 import
。当路由按需加载后,那么Vue服务在第一次加载时的压力就能够相应的小一些,不会出现 超长白屏P0问题
。下面是两种路由懒加载的写法:
// require法component: resolve=>(require(['@/components/HelloWorld'],resolve))// importcomponent: () => import('@/components/HelloWorld')
UI框架使用方式
确保在使用UI框架如, Element
, And Design
等UI框架的时候,都使用官方给暴露出来的按需加载组件。只有真正用到它的时候时候才会加载当前UI框架的组件,而不是一开始就将整个组件库给加载出来,我们都知道,一个UI框架其实很大,相对比其他的东西来说。因此,它在方便我们开发者的同时,也无形中产生了多余的开销。但是项目周期开发的时候,不得不依赖它。所以建议尽量的使用按需加载。合理的对项目进行止损,如果你不在意,非常嫌麻烦,那么可以进行全局引入。
import { Button } from 'xxxx
首屏优化
众所周知,第一次打开Vue的时候,如果你的项目够大,那么首次加载资源时,会非常的久。由于资源没有加载完毕,界面的DOM也不会渲染,会造成白屏的问题。用户此时并不知道是加载的问题,所以会带来一个不好的体验。因此通常会在public下写一个加载动画,告诉用户,网页在加载中这个提示。当页面加载成功后,页面渲染出来的这一个体验比白屏等开机要好太多了。因此,推荐大家都设计一个自家公司的loading加载方式放入index.html中吧。
项目过程
最小化JS文件
可以通过webpack处理打包的JavaScript文件,让其更加的精简。在配置中,你可以这么做
config.optimization.minimize(true);
图片资源压缩
可以通过 image-webpack-loader
插件对打包的图片进行压缩,看起来会对图片的加载有一些提升。如果担心破坏图片,可以放弃使用它。
“
$ yarn add image-webpack-loader
- - QAQ
config.module .rule('images') .use('image-webpack-loader') .loader('image-webpack-loader') .options({ bypassOnDebug: true }) .end()
打包公共代码
在 webpack4
中,可以通过 optimization.minimize
将公共代码进行打包,虽然我个人认为这个东西对SPA应用来说,效果其实有限,但有胜于无,文字再小也是肉不是,所以说,在细节的把控上,永远是无止境的。但是在webpack4中也是将CommonsChunkPlugin 改用 SplitChunksPlugin 了。感觉评论掘友的提醒。
new webpack.optimize.CommonsChunkPlugin({ name: ['vendor','runtime'], filename: '[xxxxx].js'})
删除沉淀代码
使用 Tree-Shaking
插件可以将一些无用的沉淀泥沙代码给清理掉。
依赖库CDN加速
看到有小伙伴使用CDN的方式引入一些依赖包,觉得非常的 Nice
,然后我也开始使用了。我将 Vue
Axios
Echarts
等等都分离了出来,在正式环境下,通过CDN,确实有了一些明显的提升,所以说大家可以进行尝试。
CDN LinkDI地址:?BootCDN
// 在html引入script标签后。在vue的配置中,进行声明configureWebpack: { externals: { 'echarts': 'echarts' // 配置使用CDN }}
GZIP
这个东西需要后端进行配置,当然,如果你有操作 Nginx
的权限的话,那么可以自己开启,反正我认为,这个东西提升还是很大的。具体的可以看这篇文章。这里不过多赘述这个东西。?Vue CLI 2&3 下的项目优化实践 —— CDN + Gzip + Prerender
后话
项目优化是非常重要的,一丝一毫的提升都是对用户的负责。本篇文章是对一个优化的小总结,都是一些开发中需要注意的。如果真的想在优化中玩出花来,其实非常难。需要具备很多全面的知识,而不是看一两篇文章就能够说精通的。没有什么技术是随随便便就能掌握的,除非它的价值很低。或者是属于必备项的一个东西。所以说,性能优化还是需要大家在日常项目中养成好的编码习惯,高内聚低耦合。避免无用代码。这些比任何后期的工作都要实在。
“
如果觉得有用,可以点赞哦。有好的方法,也可以评论让我也学习下。
- - QAQ
vue v-if判断数组元素的值_我对Vue项目上线做的一些基本优化相关推荐
- vue v-if判断数组元素的值_Vue项目上线做的一些基本优化
前言 本文主要是做一个Vue性能优化的帖子,做一个参考文档,对以后项目上线做一些集合文档.如果对各位在项目优化时,做一个文档参照. 开发过程 在开发项目的时候,就要注意项目的一些小技巧,下面我就罗列一 ...
- vue快速修改数组的某个值_详解vue组件三大核心概念
前言 本文主要介绍属性.事件和插槽这三个vue基础概念.使用方法及其容易被忽略的一些重要细节.如果你阅读别人写的组件,也可以从这三个部分展开,它们可以帮助你快速了解一个组件的所有功能. 本文的代码请猛 ...
- 删除数组中指定元素_如何删除PHP数组元素键值并重新排序
点击蓝字关注我们!每天获取最新的编程小知识! 源 / php中文网 源 / www.php.cn 想要删除PHP数组中某个元素键值,然后重新规范索引排序.我们可以使用PHP中的内置函数uns ...
- 动态二维数组外圈元素值的和_C语言 | 用指向元素的指针变量输出二维数组元素的值...
例33:有一个3*4的二维数组,要求用C语言实现指向元素的指针变量输出二维数组个元素的值. 解题思路:二维数组的元素时整型的,它相当于整型变量,可以用int*型指针变量指向它.二维数组的元素在内存中是 ...
- 数据结构 判断数组元素是否互不相同
4.18 数据结构 判断数组元素是否互不相同 -----题目 设二维数组a.b 含有m*n 个整数.写一个算法判断a,b两个数组中所有元素是否互不相同?输出相关信息 a[4][3]={1,2,3,4, ...
- php 未定义数组索引_如何删除PHP数组元素键值并重新排序
点击蓝字关注我们!每天获取最新的编程小知识! 源 / php中文网 源 / www.php.cn 想要删除PHP数组中某个元素键值,然后重新规范索引排序.我们可以使用PHP中的内置函数uns ...
- VUE 模板 v-if 判断 数组是否为空
vue 模板 v-if 判断数组是否为空 : 为空:array == undefined ||array == null || array.length <= 0 (顺序不能调换)不为空: ar ...
- java如何打印数组的值,Java打印数组元素的值
本篇文章帮大家学习java打印数组元素的值,包含了Java打印数组元素的值使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. 以下实例演示了如何通过重载 MainClass ...
- arr数组怎么取值_记一次思否问答的问题思考:Vue为什么不能检测数组变动
作者 | hfhan 来源 | https://segmentfault.com/a/1190000015783546 问题描述:Vue检测数据的变动是通过Object.defineProperty实 ...
最新文章
- linux安装sphinx
- pyhanlp 中文词性标注与分词简介
- VTK:相机模糊CameraBlur用法实战
- 隐瞒中国iPhone需求下滑实情:库克和苹果惹上事了
- OpenGL学习(二)第一个OpenGL程序,绘制三角形
- Unity AssetBundle 爬坑手记
- 计算机视觉实战(十四)答题卡识别 (附完整代码)
- AngularJS 模板
- 我为什么放弃用了近10年的金山
- java有哪些字体_java字体有哪些
- 学习篇-TypeScript-简介
- 软件测试面试题(等待解答)
- 怎样用计算机玩CS,电脑建立局域网玩cs的三种方法
- matlab产生正定矩阵
- C语言打印某一年的日历 (2*6格式)
- mmorpg小地图系统制作
- 什么是分布式?分布式与集群的区别是什么?
- 为远程群晖NAS配置固定的公网URL地址 1/2
- pandas中如何提取DataFrame的某些列
- 论文中文翻译成英文有什么好办法?
热门文章
- topcoder srm 661 div1
- 医药电商为何发展不起来?
- AD域环境的搭建 基于Server 2008 R2
- 解读系统资质审批的相关政策
- tigerVNC的简单使用教程(CentOS 自带VNC包的远程桌面连接)
- WebAPI PUT,DELETE请求404
- 实例具体解释Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(二)...
- C#利用Web Service实现短信发送(转)
- SicilyBrackets Matching
- underscore api