SPA(单页应用)首屏加载速度慢怎么解决?

简介: SPA(单页应用)首屏加载速度慢怎么解决?

一、什么是首屏加载?


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


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


二、加载慢的原因


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


网络延时问题

资源文件体积是否过大

资源是否重复发送请求去加载了

加载脚本的时候,渲染内容堵塞了


三、解决方案


常见的几种SPA首屏优化方式


减小入口文件积

静态资源本地缓存

UI框架按需加载

图片资源的压缩

组件重复打包

开启GZip压缩

使用SSR


1、减少入口文件体积:


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


8c5a75fc7b8e3d17c616cadcf6aa42ff_c54e96a0099a48b7bb301357b769f2c7.png


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


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


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


2、静态资源本地缓存?


后端返回资源问题:


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


采用Service Worker离线缓存


前端合理利用localStorage


3、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)


4、组件重复打包


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


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


minChunks: 3


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


5、图片资源的压缩


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


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


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


6、开启GZip压缩


拆完包之后,我们再用gzip做一下压缩 安装compression-webpack-plugin


npm 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())  // 在其他中间件使用之前调用


7、使用SSR


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


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


总结


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


  • 资源加载优化
  • 页面渲染优化


下图是更为全面的首屏优化的方案,可以根据自己项目的情况选择各种方式进行首屏渲染的优化。

817b52ea95c8cb647d65b609d0a2c9a0_f4efb3f6c27946b5808f09b6ad233af8.png


目录
相关文章
|
9月前
|
数据采集 JavaScript 前端开发
在vue中,说说你对 SPA 单页面的理解,它的优缺点分别是什么?
在vue中,说说你对 SPA 单页面的理解,它的优缺点分别是什么?
193 4
|
9月前
|
存储 JavaScript API
❤Nodejs 第十三章(文件上传接口以及token添加)
【4月更文挑战第13天】Nodejs第十三章介绍了文件上传接口和Token添加。使用Multer库处理文件上传,设置存储引擎和静态文件目录,定义上传接口,支持单个文件上传。上传成功返回文件信息和访问路径。为解决静态文件访问需要Token认证的问题,更新expressjwt配置,排除包含uploads的路径,确保静态文件可正常访问。
150 2
|
JSON 小程序 数据格式
微信小程序动态修改页面标题title
微信小程序动态修改页面标题title
1885 0
微信小程序动态修改页面标题title
|
XML 前端开发 JavaScript
【前端】taro 启动文件app.ts 修改成app.tsx
【前端】taro 启动文件app.ts 修改成app.tsx
699 0
|
机器学习/深度学习 存储 运维
Exabeam的UEBA调研
Exabeam的UEBA调研
1670 0
|
9月前
|
JavaScript Go
VUE3+vite项目中动态引入组件和异步组件
VUE3+vite项目中动态引入组件和异步组件
973 1
|
JavaScript
在created和mounted这两个生命周期中请求数据有什么区别呢?
在created和mounted这两个生命周期中请求数据有什么区别呢?
197 0
在created和mounted这两个生命周期中请求数据有什么区别呢?
|
8月前
|
JavaScript
Vue - 超强实现网页禁止浏览器缩放功能
Vue - 超强实现网页禁止浏览器缩放功能
|
JavaScript
Vue回炉重造之图片加载性能优化
图片加载优化对于一个网站性能好坏起着至关重要的作用。所以我们使用Vue来操作一波。
|
JavaScript 前端开发 API
Vue3组件库打包指南,一次生成esm、esm-bundle、commonjs、umd四种格式
本文为`Varlet`组件库源码主题阅读系列第二篇,读完本篇,你可以了解到如何将一个Vue3组件库打包成各种格式
666 0

热门文章

最新文章