首页 > 其他分享 >面试官:SPA首屏加载速度慢的怎么解决?

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

时间:2024-09-10 14:23:18浏览次数:12  
标签:面试官 Vue 渲染 首屏 vue SPA 路由 加载

面试官VUE系列总进度:19/33

1:说说你对vue的理解?
2:说说你对双向绑定的理解?
3:说说你对SPA(单页应用)的理解?
4:v-show和v-if有什么区别?使用场景分别是什么?
5:Vue实例挂载的过程?
6:请描述下你对vue生命周期的理解?在created和mounted这两个生命周期中请求数据有什么区别呢?
7:为什么Vue中的v-if和v-for不建议一起用?
8:SPA(单页应用)首屏加载速度慢怎么解决?
9:为什么data属性是一个函数而不是一个对象?
10:Vue项目中有封装过axios吗?主要是封装哪方面的?
11:你了解axios的原理吗?有看过它的源码吗?
12:Vue组件之间的通信方式都有哪些?
13:Vue中组件和插件有什么区别?
14:Vue项目中你是如何解决跨域的呢?
15:动态给vue的data添加一个新的属性时会发生什么?怎样解决?
16:你了解vue的diff算法吗?说说看
17:你有写过自定义指令吗?自定义指令的应用场景有哪些?
18:你是怎么处理vue项目中的错误的?
19:Vue中的过滤器了解吗?过滤器的应用场景有哪些?
image.png

一、什么是首屏加载

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

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

关于计算首屏时间

利用performance.timing提供的数据:

image.png

通过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

减小入口文件体积

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

image.png

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

小结:

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

下图是更为全面的首屏优化的方案

image.png

大家可以根据自己项目的情况选择各种方式进行首屏渲染的优化

标签:面试官,Vue,渲染,首屏,vue,SPA,路由,加载
From: https://blog.csdn.net/jiadsadfasfs/article/details/142098048

相关文章

  • 面试官:你是怎么处理vue项目中的错误的?
    一、错误类型任何一个框架,对于错误的处理都是一种必备的能力在Vue中,则是定义了一套对应的错误处理规则给到使用者,且在源代码级别,对部分必要的过程做了一定的错误处理。主要的错误来源包括:后端接口错误代码中本身逻辑错误二、如何处理后端接口错误通过axios的interc......
  • 分享一个基于python的电子书数据采集与可视化分析 hadoop电子书数据分析与推荐系统 sp
    ......
  • PHP 程序员学会了 Go 语言就能唬住面试官吗?
    大家好,我是码农先森。唬住了50k,唬不住就5k。这句话一直是PHP程序员之间相互吹捧、吹牛逼的笑点,每次面试过后都会挠挠头上仅剩的几根头发,回想自己是否吹牛逼会过了头。我经常在微信程序员撕逼群里,看到群友因为某个技术点而争执不休,时而讨论这个技术能不能在面试过程中突出自......
  • 面试官:如何实现线程池任务编排?
    任务编排(TaskOrchestration)是指管理和控制多个任务的执行流程,确保它们按照预定的顺序正确执行。1.为什么需要任务编排?在复杂的业务场景中,任务间通常存在依赖关系,也就是某个任务会依赖另一个任务的执行结果,在这种情况下,我们需要通过任务编排,来确保任务按照正确的顺序进行执行。......
  • 【Spark+Hive】基于大数据招聘数据分析预测推荐系统(完整系统源码+数据库+开发笔记+详
    文章目录【Spark+Hive】基于大数据招聘数据分析预测推荐系统(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)源码获取方式在文章末尾一、 项目概述二、研究意义三、背景四、国内外研究现状五、开发技术介绍六、算法介绍 七、数据库设计八、系统......
  • 如何在Spark键值对数据中,对指定的Key进行输出/筛选/模式匹配
    在用键值对RDD进行操作时,经常会遇到不知道如何筛选出想要数据的情况,这里提供了一些解决方法目录1、对固定的Key数据进行查询2、对不固定的Key数据进行模糊查询1、对固定的Key数据进行查询代码说明:SparkConf:配置Spark应用程序的一些基本信息。SparkContext:创建Spark......
  • Memory<T> 和 Span<T>
    Memory和Span是C#中的高效内存管理工具,特别适用于处理大数据集或需要避免不必要的内存分配的场景。它们提供了高性能、低分配的方式来操作内存。相比传统的数组和集合,它们有以下几个关键好处:零拷贝:Span和Memory允许对现有内存块进行切片操作,而不会产生新的数组或复制数据......
  • 命令空间(namespace)===> 用于防止名字冲突而引入的一种机制
    命令空间(namespace)用于解决同名实体:同名函数同名变量同名的类定义防止名字冲突而引入的一种机制。系统中可以定义多个命名空间,每个命名空间都有自己的名字,不可以同名可以看成一个作用域命名空间的定义#类似java中包的概念:在不同cpp文件中创建同名的方法等namesp......
  • spark为什么比mapreduce快?
    spark为什么比mapreduce快?首先澄清几个误区:1:两者都是基于内存计算的,任何计算框架都肯定是基于内存的,所以网上说的spark是基于内存计算所以快,显然是错误的2;DAG计算模型减少的是磁盘I/O次数(相比于mapreduce计算模型而言),而不是shuffle次数,因为shuffle是根据数据重组的次数而定,所以shu......
  • 【Azure Policy】分享Policy实现对Azure Activity Log导出到Log A workspace中
    问题描述使用AzurePolicy服务,对公司内部全部的订阅下的ActivityLog,都需要配置导出到LogAWorkspace中。以下Policy规则可以实现此目的。 Policy内容说明在PolicyRule部分中,选择资源的类型为 "Microsoft.Resources/subscriptions",效果使用 DeployIfNotExists(如果不存在,则......