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

一、什么时首屏加载

首屏事件,执得时浏览器从响应用户输入网址地址,到首屏内容渲染完成的时间,此时整个页面不一定要全部渲染完成,但需要展示当前视窗需要的内容。首屏加载可以说是用户体验中最重要的环节。

关于计算首屏时间

通过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",
entryTyp:"paint",
startTime:507.80000002123415,
duration:0,
};

二、SPA首屏加载时间慢的原因?

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

三、解决方案

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

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

1、减小入口文件

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

(1)vue异步组件技术-异步加载

vue-router配置路由,使用vue的异步组件技术,可以实现按需加载

但是,这种情况下一个组件生成一个js文件

vue异步组件技术

{path:'/home',name:'home',component:resolve=>require(['@/components/home'],resolve)}

{path:'/index',name:'index',component:resolve=>require(['@/components/index'],resolve)}

{path:'/about',name:'about',component:resolve=>require(['@/components/about'],resolve)}

(2)组件懒加载方案二:路由懒加载(使用import)

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

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

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

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)

但实际上我用到的租价只有按钮,分页,表格,输入与警告所以我们按需在js文件中设置并引用

import {Button,Input,Pagination,Table,TableColumn,MessageBox} from 'element-ui'
Vue.use(Button)
Vue.use(Input)
Vue.use(Pagination)
Vue.use(Table)
Vue.use(TableColumn)
Vue.use(MessageBox)

4、图片资源的压缩

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

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

对页面的使用到的icon,可以使用在线字体图标(如阿里的iconfont),或者是精灵图,将众多小图标合并到同一张图上,用以减轻http请求压力

5、组件重复打包

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

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

minChunk:3

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

6、开启GZip压缩

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

cnpm i compression-webpack-plugin -D

在Vue.config.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的数据进行压缩
                        deleteOriginal Assets:false//是否删除原文件
    })]
                                
}
}
}

在服务器我们也要做相对应的配置 如果发送请求的浏览器支持gzip,就发送给它gzip格式的文件

7、使用SSR

SSR(Server side),也就是服务端渲染,组件或页面通过服务器生成html字符串,再发送到六拉起从头搭建一个服务端是很复杂的,vue应用建议使用Nuxt.js实现服务端渲染

你可能感兴趣的:(前端,javascript,开发语言)