作者:谁动了我的橘子

原文链接:https://juejin.im/post/5edf5b22e51d4578975a7024

在Vue项目中,引入到工程中的所有js、css文件,编译时都会被打包进vendor.js,浏览器在加载该文件之后才能开始显示首屏。若是引入的库众多,那么vendor.js文件体积将会相当的大,影响首屏的体验。可以看个例子:

这是优化前的页面加载状态:执行npm run build打包项目,出来的vendeor.js文件,基本都是1M以上的的巨大文件,没有用户能忍受5s以上的loading而不关闭页面的,如图所示:

当项目在挂载到服务器上,平均都是10S以上加载出来,好家伙这加载时间,仿佛过了半个世纪,很烦人,心态boom, 开发者甚至都有种想砸电脑的冲动(·#*@#¥……&*)!

一、我们先来分析下前端加载速度慢原因

  1. 首先安装webpack的可视化资源分析工具,命令行执行:

npm i webpack-bundle-analyzer -D
  1. 然后在webpack的dev开发模式配置中,引入插件,代码如下:

const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')plugins: [new BundleAnalyzerPlugin()
]
  1. 最后命令行执行npm run build --report , 浏览器会自动打开分析结果,如下所示:

可以看到vue全家桶相关依赖占用了很大的空间,对webpack的构建速度和网站加载速度都会有比较大的影响。单页应用会随着项目越大,导致首屏加载速度很慢,针对目前所暴露出来的问题,有以下几种优化方案可以参考:

二、有针对性的优化方案

1. 对于第三方js库的优化,分离打包

生产环境是内网的话,就把资源放内网,通过静态文件引入,会比node_modules和外网CDN的打包加载快很多。如果有外网的话,可以通过CDN方式引入,因为不用占用访问外网的带宽,不仅可以为您节省流量,还能通过CDN加速,获得更快的访问速度。但是要注意下,如果你引用的CDN 资源存在于第三方服务器,在安全性上并不完全可控。

目前采用引入依赖包生产环境的js文件方式加载,直接通过window可以访问暴露出的全局变量,不必通过import引入,Vue.use去注册

在webpack的dev开发配置文件中, 加入如下参数,可以分离打包第三方资源包,key为依赖包名称,value是源码抛出来的全局变量。如下图所示,可以看到打包后vue相关资源包已经排除在外了。对于一些其他的工具库,尽量采用按需引入的方式。

externals: {vue: 'Vue',vuex: 'Vuex','vue-router': 'VueRouter',axios: 'axios','element-ui': 'ELEMENT'
}

2. vue-router 使用懒加载

在访问到当前页面才会加载相关的资源,异步方式分模块加载文件,默认的文件名是随机的id。如果在output中配置了chunkFilename,可以在component中添加WebpackChunkName,是为了方便调试,在页面加载时候,会显示加载的对应文件名+hash值,如下图:

{path: '/Login',name: 'Login',component: () = >import( /* webpackChunkName: "Login" */  '@/view/Login')
}

3. 图片资源的压缩,icon资源使用雪碧

严格说来这一步不算在编码技术范围内,但是却对页面的加载速度影响很大。对于所有的图片文件,都可以在一个叫tinypng的网站上去压缩一下。网址:tinypng.com/,对页面上使用到的icon,可以使用在线字体图标,或者雪碧图,将众多小图标合并到同一张图上,用以减轻http请求压力。然后通过操作CSS的background属性,控制背景的位置以及大小,来展示需要的部分。

4. 开启gizp压缩

gizp压缩是一种http请求优化方式,通过减少文件体积来提高加载速度。html、js、css文件甚至json数据都可以用它压缩,可以减小60%以上的体积。前端配置gzip压缩,并且服务端使用nginx开启gzip,用来减小网络传输的流量大小。

命令行执行:npm i compression-webpack-plugin -D

在webpack的dev开发配置文件中加入如下代码:

const CompressionWebpackPlugin = require('compression-webpack-plugin')plugins: [new CompressionWebpackPlugin()
]

启用gzip压缩打包之后,会变成下面这样,自动生成gz包。目前大部分主流浏览器客户端都是支持gzip的,就算小部分非主流浏览器不支持也不用担心,不支持gzip格式文件的会默认访问源文件的,所以不要配置清除源文件。

配置好之后,打开浏览器访问线上,F12查看控制台,如果该文件资源的响应头里显示有Content-Encoding: gzip,表示浏览器支持并且启用了Gzip压缩的资源

5. webpack相关配置优化

  1. 使用uglifyjs-webpack-plugin插件代替webpack自带UglifyJsPlugin插件来压缩JS文件;生产环境关闭源码映射,一方面能减少代码包的大小,另一方面也有利于系统代码安全;清除打印日志和debugger信息;配置SplitChunks 抽取公有代码,提升你的应用的性能

  2. 使用mini-xss-extract-plugin提取CSS 到单独的文件, 并使用optimize-css-assets-webpack-plugin来压缩CSS文件 。

注:具体相关webpack配置请点击juejin.im/post/5d2070…查看第一篇webpack文章,注释很详细哟。

6. 前端页面代码层面的优化

  1. 合理使用v-if和v-show

  2. 合理使用watch和computed

  3. 使用v-for必须添加key, 最好为唯一id, 避免使用index, 且在同一个标签上,v-for不要和v-if同时使用

  4. 定时器的销毁。可以在beforeDestroy()生命周期内执行销毁事件;也可以使用$once这个事件侦听器,在定义定时器事件的位置来清除定时器。详细见vue官网

最终优化后的效果如下图:vendor.js文件从1M以上优化到256K左右,体积减少接近80%,排除服务器影响的因素,界面渲染速度基本都在1s左右,达到秒开效果,比之前快了太多,体验一下就上来了嘻嘻。

❤️ 看完三件事

如果你觉得这篇内容对你挺有启发,我想邀请你帮我三个小忙:

  1. 点个「在看」,让更多的人也能看到这篇内容(喜欢不点在看,都是耍流氓 -_-)

  2. 关注我的博客 https://github.com/SHERlocked93/blog,让我们成为长期关系

  3. 关注公众号「前端下午茶」,持续为你推送精选好文,也可以加我为好友,随时聊骚。

在看点这里

Vue首屏加载速度优化,我用这几个技巧提升80%以上相关推荐

  1. Vue首屏加载速度优化,提升80%以上

    在Vue项目中,引入到工程中的所有js.css文件,编译时都会被打包进vendor.js,浏览器在加载该文件之后才能开始显示首屏.若是引入的库众多,那么vendor.js文件体积将会相当的大,影响首屏 ...

  2. vue首屏加载速度慢_Vue首屏加载速度优化如何提升80%?本文详解

    在Vue项目中,引入到工程中的所有js.css文件,编译时都会被打包进vendor.js,浏览器在加载该文件之后才能开始显示首屏.若是引入的库众多,那么vendor.js文件体积将会相当的大,影响首屏 ...

  3. vue 关闭 窗口后清除所有数据_Vue首屏加载速度优化,我用这几个技巧提升80%以上...

    前端潮咖 点击上面蓝字,关注我们! 关注 关注前端潮咖,每日精选好文 作者:谁动了我的橘子 来源:https://juejin.im/post/5edf5b22e51d4578975a7024 在Vu ...

  4. 浅谈Vue单页应用首屏加载速度优化方案

    心语:最不会利用时间的人,最会抱怨时间不够 趁着五一放假,刚好最近天气也是不好,.所以抽出一点时间写一点东西,也算是不辜负这个美好的假期吧!小编也祝愿大家五一快乐,玩得愉快哈 随着各大前端框架的诞生以 ...

  5. VUE单页应用首屏加载速度优化方案

    单页应用会随着项目越大,导致首屏加载速度很慢!!!以下给出在下知道的几种优化方案 使用CDN资源,减小服务器带宽压力 路由懒加载 将一些静态js css放到其他地方(如OSS),减小服务器压力 按需加 ...

  6. umi首屏加载速度优化

    以下内容来源于转载 作者:pro-xiaoy 链接:https://juejin.cn/post/6964352706832302117 来源:稀土掘金 umi应用首屏加载速度提高3倍+(通用的首屏优 ...

  7. VUE 首屏加载时间优化

    在Vue项目中,引入到工程中的所有js.css文件,编译时都会被打包进vendor.js,浏览器在加载该文件之后才能开始显示首屏.若是引入的库众多,那么vendor.js文件体积将会相当的大,影响首屏 ...

  8. vue首屏加载速度慢_vue项目首屏打开速度慢的解决方法

    最近接手了一个后台管理系统,技术栈主要是vue全家桶+elementui,老大打开测试环境页面的时候,说看到首页需要6秒钟,那如何进行优化呢? 首先我们需要安装webpack-bundle-analy ...

  9. vue路由懒加载_优化vue项目的首屏加载速度

    最近使用vue-cli3构建了一个小型的博客系统,完工之后,build打包出来发现一个chunk-vendors包就有1.1m,部署上去之后,访问的时候,首屏加载非常慢.居然需要21s,体验极差. 这 ...

最新文章

  1. Microsoft.Data.ConnectionUI.DataConnectionDialog
  2. 实现JDK没有提供的AtomicFloat
  3. 如何使用Apache的ab工具进行网站性能测试
  4. java练气期(2)----java高级(File类与IO流)
  5. printf()函数不能直接输出string类型
  6. 基于虹软人脸识别,实现RTMP直播推流追踪视频中所有人脸信息(C#)
  7. AKS使用Azure File实现动态持久化存储
  8. Spring Boot配置MinIO(实现文件上传、下载、删除)
  9. java ssh环境 eclipse_SSH在eclipse中环境搭建
  10. pythoncharm安装配置_pycharm的安装与配置
  11. 项目管理实践_8Manage:保险行业的项目管理实践
  12. EPS学习笔记3----------常用地物采集方法(房屋,斜坡,台阶)
  13. arcgis自动完成面怎么用_ArcGIS 自动生成线或者面
  14. 一元云购系统接入手机短信功能说明【V3版】
  15. Oblog 2.52导出日志最新漏洞
  16. TJUPT 无法与服务器建立连接问题的解决方法
  17. ESP32 学习日志(5)——NVS
  18. POI操作EXCEL删除行
  19. 京东上千页面搭建基石——CMS前后端分离演讲史读后感
  20. cv2.cv2.findContours opencv-python

热门文章

  1. android实现程序的后台运行
  2. linux磁盘乱序 UUID,【工程师笔记】第一期:小议Linux下磁盘乱序问题
  3. Jeston TX1配置Caffe教程-从裸板开始
  4. 48小时极限游戏开发比赛介绍以及Global Game Jam 历年主题和CiGA Game Jam 多年主题
  5. Ubuntu系统jpg和png互相转换的方法
  6. 【3D商城】调节色调映射和增加控制器
  7. Unresolved Dependencies
  8. BDH、CDH、DDH、DBDH、IDH、HDH(持续更新~~~~)
  9. 基于RT-THREAD的桌面小工具
  10. C# 操作LDAP查找组或人员信息