SPA首屏加载慢的优化方案

1、什么是首屏加载?

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

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

2、计算首屏时间的方法

  1. 监听DOMContentLoad 事件
    document.addEventListener('DOMContentLoaded', (event) => {
        console.log('首屏绘制完成啦!');
    });
  2. 利用 performance.getEntriesByName 
    let startTime = performance.getEntriesByName("first-contentful-paint")[0].startTime
    console.los('startTime')
  3. 在浏览器里也能直接看到(自己调试查看用)

3、导致首屏加载慢的可能原因

  • 网络太差
  • 资源文件体积过大
  • 同一个资源重复发送请求
  • 外部js文件引入或行内js代码放在了前面,导致需要先执行js,进而引起页面渲染阻塞

4、优化方案

 比较常见的几种优化方式如下:

a、减少入口文件体积

常用手段是 采用路由懒加载的方式去减少,不同的组件拆分成不同的代码块

//Vue 路由懒加载写法
// 将
import UserDetails from './views/UserDetails.vue'
// 替换成
const UserDetails = () => import('./views/UserDetails.vue')

const router = createRouter({
  // ...
  routes: [
    { path: '/users/:id', component: UserDetails }
    // 或在路由定义里直接使用它
    { path: '/users/:id', component: () => import('./views/UserDetails.vue') },
  ],
})

b、静态资源本地缓存

  • 合理利用本地缓存localStorage
  • HTTP缓存, 设置cache-control、Etag和Last-Modified
  • Service Worker缓存,它是一种利用Service Worker API实现的离线缓存功能,它可以使用户在离线的情况下访问网站内容,从而提高用户体验

c、尽可能采取按需引入资源

像element UI、Ant Design、ECharts等都是支持按需引入的,不把整个库直接引进来,能有效降低项目体积

 

d、避免组件重复打包 

webpackconfig文件中,修改CommonsChunkPlugin的配置

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

CommonsChunkPlugin:{ miniChunks: 3}

e、对图片资源进行压缩

图片资源是http请求里比较大的一个消耗,应该进行适当的压缩,对于一些icon,可以使用在线字体图标,比如阿里巴巴的矢量图标库 iconfont

f、开启Gzip压缩

GZip压缩能把资源体积压缩到只有原本的30%左右,如果项目够大,这个优化效果是非常可观的,我另一篇文章有详细介绍,这里不再赘述

前端性能优化之gzip压缩(压缩js、css、HTML,千万不能压缩图片!)_gzip.js-CSDN博客文章浏览阅读5.5k次,点赞2次,收藏13次。GZIP主要用来压缩html,css,javascript等静态文本文件,GZIP压缩的比率通常在3~10 倍之间,压缩后的体积能达到只有原本的30%左右,这样就能大大节省服务器的网络带宽和大大提升浏览器的浏览速度,如果项目够大,这个节省的时间就非常可观了!废话不多说上步骤:1、安装插件npm install compression-webpack-plugin -D2、在vue.config.js文件里添加以下代码const CompressionWebpackPlu..._gzip.jshttps://blog.csdn.net/weixin_40297452/article/details/108577463?spm=1001.2014.3001.5502

g、使用SSR

服务端渲染,在服务端生成好html字符串,再发送到浏览器,服务端计算速度肯定会比浏览器快,也是减少首屏时间的一个好方法,vue2和Vue3都推荐用Nuxt来实现ssr

服务端渲染 (SSR) | Vue.js

 

 

ps:简单总结记录,若有不恰当之处,欢迎沟通交流

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

oppo手机备忘录记录怎么转移到华为手机?

oppo手机备忘录记录怎么转移到华为手机?使用oppo手机已经有三四年了,因为平时习惯,在手机系统的备忘录中记录了很多重要的笔记,比如工作会议的要点、读书笔记、购物清单、朋友的生日提醒等。这些记录对我来说非常重要,我可以通过…

ChatGPT-PLUS AI大语言模型源码

ChatGPT-PLUS 是一个开源的 AI 助手解决方案,它采用了 Go、Vue3 和 element-plus 进行开发。这个系统自带运营管理后台,开箱即用,非常方便。它集成了 OpenAI、Azure、ChatGLM、讯飞星火、文心一言等多个平台的大语言模型,还支持 M…

算法入门-二分搜索(长期更新)

文章目录 情景一 : 二分查找情景二 : 找出一个 > num 的最左侧的位置情景三 : 找出一个 < num 的最右侧的位置leetcode 162 :寻找峰值leetcode 69 : x 的平方根 首先来简介一下二分搜索算法,二分搜索是一种每次砍半的算法,最经典的案例当然是我们的二分查找算法,但是大部…

数据结构从入门到精通——顺序表

顺序表 前言一、线性表二、顺序表2.1概念及结构2.2 接口实现2.3 数组相关面试题2.4 顺序表的问题及思考 三、顺序表具体实现代码顺序表的初始化顺序表的销毁顺序表的打印顺序表的增容顺序表的头部/尾部插入顺序表的头部/尾部删除指定位置之前插入数据和删除指定位置数据顺序表元…

PCB学习笔记4——生产过程

1开料&#xff0c;圆角&#xff0c;刨边 2 埋孔&#xff0c;盲孔&#xff0c;过孔 3沉铜 4压膜 5曝光 6显影

了解 SYN Flood 攻击

文章目录&#xff1a; 什么是 SYN Flood 攻击&#xff1f;对网络的影响SYN Flood 发生的迹象如何解决&#xff1f; 什么是 SYN Flood 攻击&#xff1f; SYN Flood&#xff08;SYN 洪水攻击&#xff09;是一种常见的分布式拒绝服务&#xff08;DDoS - Distributed Denial of Se…

【DDD】学习笔记-聚合和聚合根:怎样设计聚合?

今天我们来学习聚合&#xff08;Aggregate&#xff09;和聚合根&#xff08;AggregateRoot&#xff09;。 我们先回顾下上一讲&#xff0c;在事件风暴中&#xff0c;我们会根据一些业务操作和行为找出实体&#xff08;Entity&#xff09;或值对象&#xff08;ValueObject&…

Java+SpringBoot+Vue.js全栈实践:手机销售网站开发记

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

YOLOv9有效提点|加入SE、CBAM、ECA、SimAM等几十种注意力机制(一)

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、本文介绍 本文将以SE注意力机制为例&#xff0c;演示如何在YOLOv9种添加注意力机制&#xff01; 《Squeeze-and-Excitation Networks》 SENet提出…

翻硬币 刷题笔记

通过模拟观察 我们发现 按一下会改变相邻两个硬币的状态 将硬币排成一排 从对位置下标为5到下标为7 依次翻其本身和其右边的硬币 对5&#xff0c;6&#xff0c;7操作 操作次数为3 此时我们只改变了硬币5和硬币8的状态 因此 每两处不一样的地方&#xff0c;我们想改变…

Java | vscode如何使用命令行运行Java程序

1.在vscode中新建一个终端 2.在终端中输入命令 javac <源文件>此命令执行后&#xff0c;在文件夹中会生成一个与原java程序同名的.class文件。然后输入如下命令&#xff1a; java <源文件名称>这样java程序就运行成功了。&#x1f607;

递归与递推(蓝桥杯 c++)

目录 题目一&#xff1a; 代码&#xff1a; 题目二: 代码&#xff1a; 题目三&#xff1a; 代码&#xff1a; 题目四&#xff1a; 代码&#xff1a; 题目一&#xff1a; 代码&#xff1a; #include<iostream> #include<cstring> using namespace std; int …

HTML和CSS (前端共三篇)【详解】

目录 一、前端开发介绍 二、HTML入门 三、HTML基础标签 四、CSS样式修饰 五、HTML表格标签 六、HTML表单标签 一、前端开发介绍 web应用有BS和CS架构两种&#xff0c;其中我们主要涉及的是BS架构。而BS架构里&#xff0c;B&#xff08;Browser浏览器&#xff09;是客户端的…

一些可以访问gpt的方式

1、Coze扣子是新一代 AI 大模型智能体开发平台。整合了插件、长短期记忆、工作流、卡片等丰富能力&#xff0c;扣子能帮你低门槛、快速搭建个性化或具备商业价值的智能体&#xff0c;并发布到豆包、飞书等各个平台。https://www.coze.cn/ 2、https://poe.com/ 3、插件阿里…

2023国赛样题路由部分【RIP RIPNG ACLRIP ACLRIPNG ISIS NAT64】

RT1串行链路、RT2串行链路、FW1、AC1之间分别运行RIP和RIPng协议&#xff0c;FW1、RT1、RT2的RIP和RIPng发布loopback2地址路由&#xff0c;AC1 RIP发布loopback2地址路由&#xff0c;AC1 RIPng采用route-map匹配prefix-list重发布loopback2地址路由。RT1配置offset值为3的路由…

一文认识蓝牙(验证基于Aduino IDE的ESP32)

1、简介 蓝牙技术是一种无线通信的方式&#xff0c;利用特定频率的波段&#xff08;2.4GHz-2.485GHz左右&#xff09;&#xff0c;进行电磁波传输&#xff0c;总共有83.5MHz的带宽资源。 1.1、背景 蓝牙&#xff08;Bluetooth&#xff09;一词取自于十世纪丹麦国王哈拉尔Haral…

linux的通信方案(SYSTEM V)

文章目录 共享内存(Share Memory)信号队列&#xff08;Message Queue&#xff09;信号量(semaphore) 进程间通信的核心理念&#xff1a;让不同的进程看见同一块资源 linux下的通信方案&#xff1a; SYSTEM V 共享内存(Share Memory) 特点&#xff1a;1.共享内存是进程见通信最…

使用 Docker 部署 Answer 问答平台

1&#xff09;介绍 GitHub&#xff1a;https://github.com/apache/incubator-answer Answer 问答社区是在线平台&#xff0c;让用户提出问题并获得回答。用户可以发布问题并得到其他用户的详细答案、建议或信息。回答可以投票或评分&#xff0c;有助于确定有用的内容。标签和分…

笨办法学 Python3 第五版(预览)(二)

原文&#xff1a;Learn Python the Hard Way, 5th Edition (Early Release) 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 练习 19&#xff1a;函数和变量 现在你将把函数与你从之前练习中了解到的变量结合起来。如你所知&#xff0c;变量给数据片段一个名称&#x…

数据挖掘入门项目二手交易车价格预测之数据分析

文章目录 1. 相关库的引入2. 数据的加载3. 数据概况3.1 统计值查看3.2 查看数据类型 4. 判断缺失值4.1 统计每一列空值的数量4.2 可视化缺失值数量 5. 判断异常值5.1 异常值检测 6. 了解预测值的分布6.1 统计各预测值的分布6.2 总体分布概况6.2 查看预测值的具体频数6.3 查看sk…