怎么解决SPA首屏加载速度慢?

news2024/11/16 23:50:08

首屏加载

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

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

关于计算首屏时间

利用performance.timing提供的数据:

通过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配置路由的时候,采用动态加载路由的形式

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文件,这就造成了重复下载

解决方案:在webpackconfig文件中,修改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实现服务端渲染

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode第2577题-在网格图中访问一个格子的最少时间-python实现-图解思路与手撕代码

LeetCode第2577题-在网格图中访问一个格子的最少时间-python实现-图解思路与手撕代码 文章目录一、题目描述二、解题思路与代码实现1.解题思路2.代码实现总结一、题目描述 二、解题思路与代码实现 1.解题思路 这道题求最短距离,首先检查起始点0,0的右边0,1和下边1…

Linux配置mysql主从复制

Linux配置mysql主从复制 systemctl restart mysqld 重启mysql服务 Mysql主从复制 在linux里面部署mysql 主库Master 192.168.162.138 contos 7 从库Slave 192.168.162.137 contos 7测试 log-binmysql-bin町[必须]启用二进制日志 第三步:登录Mysql数据库,执…

oracle 19c 创建物化视图并测试logminer进行日志挖掘

1、创建物化视图 alter session set containerpdb; grant create materialized view to scott; create materialized view 物化视图名 -- 1. 创建物化视图 build [immediate | deferred] -- 2. 创建方式,默认 immediate refre…

LeetCode-2373. 矩阵中的局部最大值【矩阵,数组】

LeetCode-2373. 矩阵中的局部最大值【矩阵,数组】题目描述:解题思路一:原地修改。首先将每个3*3的矩阵的最大值存放在左上角的点,然后修改给的grid矩阵的大小。解题思路二:暴力,申请一个数组解题思路三&…

想学Java开发,有什么方式可以选择?

想学习软件开发Java高级编程语言的小伙伴看过来,这里有多年Java职业教育经验总结以及学习技巧分享,不容错过的精彩内容! 一年之计在于春,阳春三月是学习的好时光。万物复苏,一切都可以重新开始,如果你也在考…

一些开源的,好看的前端组件/样式库

以下是一些受欢迎的开源 CSS 样式库:Bootstrap:https://getbootstrap.com/Materialize CSS:https://materializecss.com/Bulma:https://bulma.io/Foundation:https://foundation.zurb.com/Semantic UI:http…

智慧燃气管理系统

在数字经济时代,迫切需要通过数字化建设智能天然气,提高天然气的基本安全水平,提高企业的智能管理水平。这是人们可以看到、触摸和使用的智能应用,也是为智能城市奠定良好基础的必修课。智能燃气是以GIS为基础,采用物联…

商简智能计划与排程SPS在纺织行业中的应用

企业背景 某织造、染色及后整理一体化工艺的纺织面料企业,主要从事户外功能运动服装、内衣、泳衣、汽车内饰等面料的研发和销售,年产值在20亿左右,是迪卡侬运动面料最优质供应商之一。 纺织行业特点 印染具有典型的流程行业特性&#xff0c…

从功能测试到自动化测试,我只花了67天,薪资翻倍

在这个吃技术的IT行业来说,我刚入行的时候每天做的也是最基础的工作,但是随着时间的消磨,我产生了对自我和岗位价值和意义的困惑。 随着移动互联网的发展,从业人员能力的整体进步,软件测试需要具备的能力要求越来越高…

Databend 开源周报 第 82 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.com 。Whats New探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。Features & Improvements :…

vue源码分析-基础的数据代理检测

简单回顾一下这个系列的前两节,前两节花了大量的篇幅介绍了Vue的选项合并,选项合并是Vue实例初始化的开始,Vue为开发者提供了丰富的选项配置,而每个选项都严格规定了合并的策略。然而这只是初始化中的第一步,这一节我们…

【计算机组成原理 - 第一章】计算机系统概论(完结)

本章参考王道考研相关课程: 【2021版】1.2.1_计算机硬件的基本组成_哔哩哔哩_bilibili 【2021版】1.2.2_认识各个硬件部件_哔哩哔哩_bilibili 【2021版】1.2.3_计算机系统的层次结构_哔哩哔哩_bilibili 【2021版】1.3_计算机的性能指标_哔哩哔哩_bilibili 目录 一、…

绘制带有角度的CAD图形

这个CAD图形用到的命令有CAD直线、CAD圆、CAD圆弧、CAD偏移和CAD旋转等多个CAD命令相结合才绘制出来。 目标对象 操作步骤 1.先使用直线命令画相交于A点的两条线段,然后A点为圆心画半径12和半径15的圆 2.然后以B点为圆心画半径2的圆,使用复制命令指定圆…

Maven的基本使用

1.Maven的基本介绍2.Maven中仓库的概念3.Maven中坐标的概念坐标示例如下&#xff1a;<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope>//这个是范围 &l…

elasticsearch 8 修改分词器并数据迁移

1. 安装中文索引 下载地址&#xff1a;https://github.com/medcl/elasticsearch-analysis-ik/releases 注意&#xff1a;版本要和ES版本对应 解压后放入plugins文件中 然后重启服务&#xff1a;docker-compose restart elasticsearch&#xff0c;大概需要1分钟 2. 数据迁移…

【Spark分布式内存计算框架——Spark Streaming】9. 获取偏移量 应用案例:百度搜索风云榜(上)

4.4 获取偏移量 当SparkStreaming集成Kafka时&#xff0c;无论是Old Consumer API中Direct方式还是New Consumer API方式获取的数据&#xff0c;每批次的数据封装在KafkaRDD中&#xff0c;其中包含每条数据的元数据信息。 文档&#xff1a;http://spark.apache.org/docs/2.4.…

重磅:Meta未来4年路线图曝光,Quest出货超2000万台

The Verge今天曝光了一份Meta内部AR/VR产品规划图&#xff0c;这份规划图为Meta高管为Reality Labs员工的内部分享&#xff0c;包括了大量AR/VR产品信息&#xff0c;下面我们一起来看看。一&#xff0c;未来四年规划Meta Reality Labs四年规划&#xff1a;1&#xff0c;2023年&…

你知道吗?火狐搜集您的数据?

导读请注意,打包在 Firefox Web 浏览器里面的地理位置服务即使浏览器关闭后也会在后台运行。我们还没有从关于浏览器插件丑闻的消息中平复下来。插件原本目的是保卫隐私&#xff0c;但现在却把信息卖给了第三方公司。然而更令人愤怒的是其规模完全超出我们的预计。MLS MLS&…

报错“FirewallD is not running”怎么办,如何解决?

目录 一、报错详情 二、解决方法—开启防火墙步骤 步骤一&#xff1a;先通过命令查看一下防火墙的状态。 步骤二&#xff1a;开启防火墙。 步骤三&#xff1a;再次查看防火墙状态 一、报错详情 在docker创建redis容器&#xff0c;在进行window访问redis容器端口进行绑定设…

IGKBoard(imx6ull)-ADC编程MQ-2烟雾传感器采样

文章目录1- ADC介绍2- MQ-2烟雾传感器介绍&#xff08;1&#xff09;工作原理&#xff08;2&#xff09;MQ-2应用电路3- MQ-2烟雾传感器硬件连接4- ADC驱动配置5- 编程查看当前浓度1- ADC介绍 ADC是Analog-to-Digital Converter的缩写&#xff0c;指模数转换器。真实世界的模拟…