SPA首屏加载速度慢

2023-09-14 12:00:45

什么是首屏加载

首屏时间(First Contentful Paint),指的是浏览器从响应用户输入网址地址,到首屏内容渲染完成的时间,此时整个网页不一定要全部渲染完成,但需要展示当前视窗需要的内容

首屏加载可以说是用户体验中最重要的环节

关于计算首屏时间

通过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首屏优化方式:

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

减小入口文件体积

常用的手段是路由懒加载,把不同路由对应的组件分割成不同的代码块,待路由被请求的时候会单独打包路由,使得入口文件变小,加载速度大大增加

vue-router配置路由的时候,采用动态加载路由的形式

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

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

静态资源本地缓存

后端返回资源问题:

  • 采用HTTP缓存,设置Cache-ControlLast-ModifiedEtag等响应头

  • 采用Service Worker离线缓存

前端合理利用localStorage

UI框架按需加载

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

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

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

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

组件重复打包

假设A.js文件是一个常用的库,现在有多个路由使用了A.js文件,这就造成了重复下载

解决方案:在webpack的config文件中,修改CommonsChunkPlugin的配置

minChunks: 3

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

图片资源的压缩

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

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

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

开启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格式的文件 我的服务器是用express框架搭建的 只要安装一下compression就能使用

const compression = require('compression')
app.use(compression())  // 在其他中间件使用之前调用

使用SSR

SSR(Server side ),也就是服务端渲染,组件或页面通过服务器生成html字符串,再发送到浏览器

从头搭建一个服务端渲染是很复杂的,vue应用建议使用Nuxt.js实现服务端渲染


小结:

减少首屏渲染时间的方法有很多,总的来讲可以分成两大部分 :

  • 资源加载优化
  • 页面渲染优化
更多推荐

【HCIE】04.网络安全技术

端口隔离在同一VLAN中可以隔离二层与三层通信,让同VLAN内的设备可以通信或者不可以通信。定义一个端口隔离组,在一个组内无法互访,不在一个组里面可以进行互访port-isolateenablegroup1//使能端口隔离功能port-isolatemdoeall//全局模式实现二层隔离,三层互访intg0/0/1po

207. 课程表

207.课程表题目-中等难度示例1.bfs题目-中等难度你这个学期必须选修numCourses门课程,记为0到numCourses-1。在选修某些课程之前需要一些先修课程。先修课程按数组prerequisites给出,其中prerequisites[i]=[ai,bi],表示如果要学习课程ai则必须先学习课程bi。例如

MySQL面试题——隔离级别相关面试题

隔离级别相关面试题MySQL事务隔离级别未提交读——可以读到其他事务未提交的数据(最新的版本)错误现象:脏读、不可重复读、幻读的现象提交读(RC)——可以读到其他事务已提交的数据(最新已提交的版本)错误现象:不可重复读、幻读现象使用场景:希望看到最新的有效值可重复读(RR)——在事务范围内,多次读能够保证一致性(快照建

69、Spring Data JPA 的 @Query查询 和 命名查询(半自动:提供 SQL 或 JPQL 查询)

1、方法名关键字查询(全自动,既不需要提供sql语句,也不需要提供方法体)2、@Query查询(半自动:提供SQL或JPQL查询)3、自定义查询(全手动)@Query查询和命名查询的区别:命名查询与直接用@Query来定义查询的本质是一样,只不过它们定义SQL或JPQL语句的位置不同。直接用@Query来定义查询,写S

MyBatisPlus使用自定义JsonTypeHandler实现自动转化JSON

个人主页:金鳞踏雨个人简介:大家好,我是金鳞,一个初出茅庐的Java小白目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作我的博客:这里是CSDN,是我学习技术,总结知识的地方。希望和各位大佬交流,共同进步~背景在项目中使用了Mybatis-Plus框架,调用了Mapp

Android Jetpack解析之——LiveData

LiveData是一种可观察的数据存储器类。与常规的可观察类不同,LiveData具有生命周期感知能力,意指它遵循其他应用组件(如activity、fragment或service)的生命周期。这种感知能力可确保LiveData仅更新处于活跃生命周期状态的应用组件观察者。如果观察者(由Observer类表示)的生命周期

变量和配置文件

文章目录变量和配置文件1.变量1.1系统变量1.1.1系统变量分类1.1.2查看系统变量1.1.3修改系统变量的值1.2用户变量2.配置文件的使用2.1配置文件格式2.2启动命令与选项组2.3特定的MYSQL版本的专用选项组2.4同一个配置文件中多个组的优先级2.5命令行和配置文件中启动选项的区别变量和配置文件1.变量

ITR服务体系的常见问题和华为构建ITR的经验分享

大家好!前两天有一个企业负责客户服务、售后部门的朋友和华研荟探讨,企业的服务体系如何搭建,以及如何像华为一样构建ITR流程他的苦恼是,自己所带领的部门叫做客户服务中心,但是在公司内部不受重视,公司总觉得你们就是去现场安装、调试,出了问题去救个火,赶紧解决就好了,没什么难度嘛。在客户那边,每次出现问题总是一肚子抱怨,有的

Socks5代理、IP代理与网络安全:保护你的爬虫和隐私

在数字时代,数据是黄金,网络安全成为至关重要的问题。无论是保护个人隐私还是进行爬虫数据采集,代理技术已经成为网络工程师的必备工具。本文将深入探讨Socks5代理、IP代理以及它们在网络安全和爬虫应用中的重要性。1.了解Socks5代理Socks5代理是一种网络协议,允许应用程序通过中间服务器与目标服务器通信。与HTTP

分布式系统的 38 个知识点

天天说分布式分布式,那么我们是否知道什么是分布式,分布式会遇到什么问题,有哪些理论支撑,有哪些经典的应对方案,业界是如何设计并保证分布式系统的高可用呢?1.架构设计这一节将从一些经典的开源系统架构设计出发,来看一下,如何设计一个高质量的分布式系统;而一般的设计出发点,无外乎冗余:简单理解为找个备胎,现任挂掉之后,备胎顶

提高邮件营销效率,个性化推广利器——SerialMailer for Mac

在如今竞争激烈的市场中,个性化的营销和沟通对于吸引客户和保持关系至关重要。而SerialMailerforMac作为一款专业的邮件批量个性处理软件,能够帮助您轻松实现这一目标。SerialMailerforMac拥有强大且直观的界面,适用于任何规模的电子邮件营销活动。您可以轻松导入收件人列表,并根据收件人的个人信息、偏

热文推荐