热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

总结我对Vue项目上线做的一些基本优化

https:www.cnblogs.comchengxuyuanaap13347572.html前言大家好啊,我是wangly19,一名前端摸鱼小能手。最近忙着开源项目的东西,还有

https://www.cnblogs.com/chengxuyuanaa/p/13347572.html

前言

大家好啊,我是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



  • {{ item.name }}




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))
// import
component: () => 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


后话

项目优化是非常重要的,一丝一毫的提升都是对用户的负责。本篇文章是对一个优化的小总结,都是一些开发中需要注意的。如果真的想在优化中玩出花来,其实非常难。需要具备很多全面的知识,而不是看一两篇文章就能够说精通的。没有什么技术是随随便便就能掌握的,除非它的价值很低。或者是属于必备项的一个东西。所以说,性能优化还是需要大家在日常项目中养成好的编码习惯,高内聚低耦合。避免无用代码。这些比任何后期的工作都要实在。



推荐阅读
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 本文介绍了如何在Jquery中通过元素的样式值获取元素,并将其赋值给一个变量。提供了5种解决方案供参考。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • Tkinter Frame容器grid布局并使用Scrollbar滚动原理
    本文介绍了如何使用Tkinter实现Frame容器的grid布局,并通过Scrollbar实现滚动效果。通过将Canvas作为父容器,使用滚动Canvas来滚动Frame,实现了在Frame中添加多个按钮,并通过Scrollbar进行滚动。同时,还介绍了更新Frame大小和绑定滚动按钮的方法,以及配置Scrollbar的相关参数。 ... [详细]
  • hadoop1.2.1文档中这样写:Nowcheckthatyoucansshtothelocalhostwithoutapassphrase:$sshlocalhostIfyou ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有