一、什么是首屏加载?

首屏时间,指的是浏览器从响应用户输入网址地址,到首屏内容渲染完成的时间,此时整个网页不一定要全部渲染完成,但需要展示当前视窗需要的内容。首屏加载可以说是用户体验中最重要的环节。

关于计算首屏时间

通过DOMContentLoad或者performance来计算出首屏时间

// 方案一:
document.addEventListener('DOMContentLoaded', (event) => {console.log('first contentful painting');
});
// 方案二:
performance.getEntriesByName("first-contentful-paint")[0].startTime// performance.getEntriesByName("first-contentful-paint")[0]
// 会返回一个 PerformancePaintTiming的实例,结构如下:
{name: "first-contentful-paint",entryType: "paint",startTime: 507.80000002123415,duration: 0,
};

二、SPA 首屏加载时间慢的原因?

  • 网络延时问题
  • 资源文件体积是否过大
  • 资源是否重复发送请求去加载了
  • 加载脚本的时候,渲染内容堵塞了

三、解决方案

常见的几种SPA首屏优化方式

  • 减小入口文件积
  • 静态资源本地缓存
  • UI框架按需加载
  • 图片资源的压缩
  • 组件重复打包
  • 开启Gzip压缩
  • 使用SSR

1、减小入口文件体积

常用手段是路由懒加载,把不同路由对应的组件分割成不同的代码块,待路由被请求的时候会单独打包路由,使得入口文件变小,加载速度大大增加。
分享路由懒加载的常用3种方式,click me
(1) vue异步组件技术—异步加载
vue-router配置路由 , 使用vue的异步组件技术 , 可以实现按需加载 .
但是,这种情况下一个组件生成一个js文件
vue异步组件技术

{ path: ‘/home’, name: ‘home’, component: resolve => require([’@/components/home’],resolve) },

{ path: ‘/index’, name: ‘Index’, component: resolve => require([’@/components/index’],resolve) },

{ path: ‘/about’, name: ‘about’, component: resolve => require([’@/components/about’],resolve) }
(2)组件懒加载方案二 路由懒加载(使用import)
在vue-router配置路由的时候,采用动态加载路由的形式

routes:[ path: 'Blogs',name: 'ShowBlogs',component: () => import('./components/ShowBlogs.vue')
]

以函数的形式加载路由,这样就可以把各自的路由文件分别打包,只有在解析给定的路由时,才会加载路由组件

2、静态资源本地缓存

后端返回资源问题:

  • 采用HTTP缓存,设置Cache-Control,Last-Modified,Etag等响应头

  • 采用Service Worker离线缓存

前端合理利用localStorage

3、UI框架按需加载

在日常使用UI框架,例如element-UI、或者antd,我们经常性直接引用整个UI库

import ElementUI from 'element-ui'
Vue.use(ElementUI)

但实际上我用到的组件只有按钮,分页,表格,输入与警告 所以我们要按需在js文件中设置并引用

import { Button, Input, Pagination, Table, TableColumn, MessageBox } from 'element-ui';
Vue.use(Button)
Vue.use(Input)
Vue.use(Pagination)

4、图片资源的压缩

图片资源虽然不在编码过程中,但它却是对页面性能影响最大的因素

对于所有的图片资源,我们可以进行适当的压缩

对页面上使用到的icon,可以使用在线字体图标(如阿里的iconfont),或者雪碧图,将众多小图标合并到同一张图上,用以减轻http请求压力。

5、组件重复打包

假设A.js文件是一个常用的库,现在有多个路由使用了A.js文件,这就造成了重复下载
解决方案:在webpack的config文件中,修改CommonsChunkPlugin的配置

minChunks: 3

minChunks为3表示会把使用3次及以上的包抽离出来,放进公共依赖文件,避免了重复加载组件

6、开启GZip压缩

拆完包之后,我们再用gzip做一下压缩 安装compression-webpack-plugin

cnmp i compression-webpack-plugin -D

在vue.congig.js中引入并修改webpack配置

const CompressionPlugin = require('compression-webpack-plugin')configureWebpack: (config) => {if (process.env.NODE_ENV === 'production') {// 为生产环境修改配置...config.mode = 'production'return {plugins: [new CompressionPlugin({test: /\.js$|\.html$|\.css/, //匹配文件名threshold: 10240, //对超过10k的数据进行压缩deleteOriginalAssets: false //是否删除原文件})]}}

在服务器我们也要做相应的配置 如果发送请求的浏览器支持gzip,就发送给它gzip格式的文件

7、使用SSR

SSR(Server side ),也就是服务端渲染,组件或页面通过服务器生成html字符串,再发送到浏览器
从头搭建一个服务端渲染是很复杂的,vue应用建议使用Nuxt.js实现服务端渲染

SPA首屏加载速度慢怎么解决?相关推荐

  1. [vue] SPA首屏加载速度慢的怎么解决?

    [vue] SPA首屏加载速度慢的怎么解决? 1.通过Gzip压缩 2.使用路由懒加载 3.利用webpack中的externals这个属性把打包后不需要打包的库文件都分离出去,减小项目打包后的大小 ...

  2. 单页应用首屏加载速度慢怎么解决?

    1.什么是首屏加载时间? 首屏加载时间是指浏览器从相应用户输入网址到首屏内容渲染完成的时间,从用户的角度来说就是:"地址栏输入网址之后网页呈现的速度".整个网站并不需要全部加载完成 ...

  3. 面试官:SPA(单页应用)首屏加载速度慢怎么解决?

    故心故心故心故心小故冲啊 文章目录 一.什么是首屏加载 二.加载慢的原因 三.解决方案 小结: 参考文献 一.什么是首屏加载 首屏时间(First Contentful Paint),指的是浏览器从响 ...

  4. 面试官:首屏加载速度慢怎么解决?

    文章目录 前言 首屏加载时间的计算 首屏的定义 首屏加载过程 计算首屏时间 加载慢的原因 面试中常涉及的解决方案 减小入口文件体积 懒加载 减小文件大小 静态资源本地缓存 UI框架按需加载 组件重复打 ...

  5. vue单页应用首屏加载速度慢如何解决

    首屏时间(First Contentful Paint),指的是浏览器从响应用户输入网址地址,到首屏内容渲染完成的时间. 一.加载慢的原因 在页面渲染的过程,导致加载速度慢的因素可能如下: 网络延时问 ...

  6. umi首屏加载速度优化

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

  7. SPA单页面应用首屏加载速度提升方法

    SPA单页面应用首屏加载速度提升方法 首屏加载 计算首屏加载时间公式 解决方法 减少入口文件体积 静态资源本地缓存 UI框架按需加载 避免组件重复打包 图片资源压缩 开启GZip压缩 首屏加载 首屏加 ...

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

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

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

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

最新文章

  1. 王飞跃:平行汽车到平行驾驶,从“功能汽车”到“智能汽车”
  2. Redis的安装部署
  3. 武大计算机学院推免清北,南大2020年推免生来自哪儿?山大73,武大41,清北5人...
  4. TestNG 入门教程
  5. 杭电的题,输出格式卡的很严。HDU 1716 排列2
  6. python中不论类的名字是什么歌_Python自动猜歌名,还愁排名上不去嘛?
  7. php 数组 定义 遍历,php针对数组的定义、遍历及删除
  8. Oracle认证体系的重大变化,你需要知道这些...
  9. SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka
  10. 安装caffe-yolov3时报错:ImportError: No module named torch(环境变量设置)
  11. C# 线程知识--异步编程模型(APM)
  12. tomcat 7下spring 4.x mvc集成websocket以及sockjs完全参考指南(含nginx/https支持)
  13. 初中参观机器人博物馆的作文_参观足球机器人实验室_550字
  14. 爬虫——xpath爬取图片
  15. 雷军在金山的奋斗历程(我的金山我的青春)
  16. 修改AspNetPager的CustomInfoHTML,添加自定义样式
  17. 向量数量积公式_向量数量积公式是什么
  18. Command not found 解决
  19. Mac如何共享wifi热点
  20. gazebo可以另存为world

热门文章

  1. 我用wxPython搭建GUI量化系统之wx.grid实现excel功能
  2. 如何通过BIOS设置自动开机
  3. vue即时通讯,一个很好用的插件
  4. java生成二维码海报,面经解析
  5. VS Code + Latex + SumatraPDF 环境(实用)
  6. 写给喜欢数学和不喜欢数学的朋友们
  7. 【概率论】事件的独立与事件的互斥(或互不相容)、以及它们之间的关系
  8. AcWing寒假每日一题2022-第1周
  9. 帮你学会webpack
  10. 在AD中添加logo