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

news2024/12/25 23:37:32

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

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

二、加载慢的原因
在页面渲染的过程,导致加载速度慢的因素可能如下:

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

三、解决方案
常见的几种SPA首屏优化方式

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

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

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

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

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

静态资源本地缓存
后端返回资源问题:

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

采用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实现服务端渲染

小结:
减少首屏渲染时间的方法有很多,总的来讲可以分成两大部分 :资源加载优化 和 页面渲染优化

下图是更为全面的首屏优化的方案
在这里插入图片描述

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

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

相关文章

分享156个ASP源码,总有一款适合您

ASP源码 分享156个ASP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 156个ASP源码下载链接:https://pan.baidu.com/s/1Mc-zWjUyk9Lx8TXv5cvZTg?pwds2qi 提取码&#x…

Office 365用户登录审核

黑客访问端点设备,以窃取公司特定数据、员工个人数据或任何其他可能对他们有任何用处的有价值的信息。 为了帮助您防止这种攻击,我们编写了一个参数列表,可以帮助您识别异常日志,这通常是攻击的第一个标志。异常登录活动是安全漏洞…

Vue使用ElementUI的确认框进行删除操作(包含前后端代码)

前言 今天做自己项目的时候,有一个删除的业务,正好遇到了确认框,在此纪念一下。 这里我是使用的ElementUI的确认框! 首先ElementUI的确认框是这么说明的: 从场景上说,MessageBox 的作用是美化系统自带的 …

Java程序员跳槽,三面全过,面试官:你这样的,我们招不起

程序员小李在沿海城市工作了8年,那里涨幅飞快的房价限制了程序员小李在一线城市安家的想法,再加上突然发生的疫情暴露了远在他乡工作的不便,在种种因素下,程序员小李决定回家工作。 既然已经下定决心告别一线城市回家乡发展&…

数据分析面试-sql练习

SQL汇总1. SQL执行顺序2. 开窗函数3. 经典SQL题3.0 数据准备3.1 ☆ 查询‘01’课程比‘02’课程成绩高的学生3.2 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩3.3 查询在SC表存在成绩的学生信息3.4 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总…

Github每日精选(第96期):微软的机器学习课程ML-For-Beginners

12 周,26 节课,52 道测验,适合所有人的经典机器学习。 添加链接描述 初学者机器学习 - 课程 Microsoft 的 Azure Cloud Advocates 很高兴提供为期 12 周、26 节课的全部关于机器学习的课程。在本课程中,您将了解有时称为经典机器…

【C++】面向对象:继承

🐱作者:傻响 🐱专栏:《C语法》 🔥格言:你只管努力,剩下的交给时间! 目录 C中的继承 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.3 继承关系和访问限定符 1.4 继承基类成…

ES6中扩展运算符的9种用法

1. 拷贝数组对象 const years [2018, 2019, 2020, 2021]; const copyYears [...years];console.log(copyYears); // [ 2018, 2019, 2020, 2021 ]扩展运算符拷贝数组,只有第一层是深拷贝,即对一维数组使用扩展运算符拷贝就属于深拷贝 2. 合并数组 先…

c++入门语法

文章目录1. 命名空间1.1 域的介绍1.2 命名空间的定义1.3 命名空间的三种使用方式2. C输入&&输出3. 缺省参数3.1 概念3.2 缺省参数分类4. 函数重载4.1 概念4.2 C支持函数重载的原理--名字修饰5. 引用5.1 概念5.2 特性5.3 常引用5.4 使用场景5.5 指针和引用的区别6. 内联…

OpenCV-PyQT项目实战(3)信号与槽机制

欢迎关注『OpenCV-PyQT项目实战 Youcans』系列,持续更新中 OpenCV-PyQT项目实战(1)安装与环境配置 OpenCV-PyQT项目实战(2)QtDesigner 和 PyUIC 快速入门 OpenCV-PyQT项目实战(3)信号与槽机制 …

健身大神都戴什么耳机、健身大佬的耳机清单分享

平时,我们总能看到许多运动健身的人群,在锻炼时都佩戴着耳机。但运动耳机的选择,同样是大有学问的。如果佩戴传统的真无线蓝牙耳机,有可能出现佩戴不稳、耳道肿胀等问题,影响运动体验。所以今天我们特意给大家带来几款…

【大数据实时数据同步】OGG异构多路映射同步原表审计表只存删除数据表实现方案(二)

文章目录前言十一、将SCOTT下所有已同步的HIS表逻辑同步配置改为DEL表操作1、首先来看一下抽取进程和应用进程我们要修改成什么样的配置2、开始前先停止源端的抽取进程3、清除原来HIS表非DELETE操作数据4、启动抽取进程和应用进程验证总结前言 这里是后续!&#xf…

尚医通 (一)项目介绍

目录一、功能简介二、技术点三、业务流程四、系统架构一、功能简介 尚医通即为网上预约挂号系统,网上预约挂号是近年来开展的一项便民就医服务,旨在缓解看病难、挂号难的就医难题,许多患者为看一次病要跑很多次医院,最终还不一定…

微信小程序 python垃圾分类知识科普系统 uniapp

目 录 摘 要 III Abstract 4 1 系统概述 5 1.1 概述 5 1.2课题意义 5 1.3 主要内容 5 2 系统开发环境 6 2.1微信开发者工具 6 2.2小程序框架以及目录结构介绍 6 3 需求分析 1 3.1 系统设计目标 1 3.2需求分析概述 1 3.3 系统可行性分析…

分享160个ASP源码,总有一款适合您

分享160个ASP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 160个ASP源码下载链接:https://pan.baidu.com/s/1xMcHd2x-EW0PP4TdVCU5vA?pwd3hby 提取码:3hby…

嵌入式开发:如何在嵌入式市场中平衡敏捷

敏捷方法的好处是有据可查的,但是在遵从驱动的市场中,向敏捷过渡对于嵌入式开发团队来说是一个挑战。需要可追溯性和文档来证明遵从性,但是这可能与敏捷的精神相矛盾,敏捷的精神仍然受到伴随着方法论成长起来的不准确神话的困扰。…

创建者模式—原型模式(深克隆和浅克隆的区别)

目录 1.原型模式 1.1概念 1.2结构 1.3实现 1.4案例 1.5深克隆(扩展) 2.浅克隆和深克隆 2.1克隆的特点 2.2浅克隆和深克隆的区别 1.原型模式 1.1概念 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对…

【分布式任务调度】XXL-JOB快速搭建教程

XXL-JOB1. XXL-JOB简介2. XXL-JOB搭建2.1 准备工作2.1.1 下载源码2.1.2 数据库准备 数据库脚本在doc路径下,将其执行之后可以创建一个数据库,如图3所示:2.2 搭建调度中心2.3 搭建“执行器”3. 测试3.1 新增执行器3.2 新增任务3.3 启动任务测试…

【工作笔记0036】C#中Decimal小数取整容易犯错的坑

这两天排查一个bug,数据库中同样的计算公式 和 C#代码中一毛一样的计算公式,最后结果为 Decimal 类型的小数,需求保留两位小数。但是结果是数据库中 和 代码中的结果总是对不上。整理并简化了一下项目中代码计算公式:decimal a 3…

vitest第一章(初始vitest)

从三个角度分析vitest 他能做什么? 为什么要使用他? 使用它的优势是什么? vitest官网cn.vitest.dev/ 1.vitest能做什么 从官网介绍说这是一个单元测试框架,大家听到有测试两个字觉得这个是测试同学写的东西,其实这个…