首屏事件,执得时浏览器从响应用户输入网址地址,到首屏内容渲染完成的时间,此时整个页面不一定要全部渲染完成,但需要展示当前视窗需要的内容。首屏加载可以说是用户体验中最重要的环节。
通过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首屏优化方式
常用手段就是路由懒加载,把不同路由对应的组件分割成不同的代码块,待路由被请求的时候会单独打包路由,使得入口文件变小,加载速度大大增加。
(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 路由,这样就可以把各自的路由文件分别打包,只有在解析给定的路由时,才会加载路由组件
后端返回资源问题
前端合理利用localStorage
在日常使用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)
图片资源虽然不在编码过程中,但是他却是对页面性能影响最大的因素
对于所有的图片资源,我们可以进行适当的压缩
对页面的使用到的icon,可以使用在线字体图标(如阿里的iconfont),或者是精灵图,将众多小图标合并到同一张图上,用以减轻http请求压力
5、组件重复打包
假设A.js文件是一个常用的库,现在有多个路由使用了A.js文件,这就造成了重复下载
解决方案:在Webpack的config文件中,修改CommonsChunkPlugin的配置
minChunk:3
minChunks为3表示会把使用3次及以上的包抽离出来,放进公共依赖包,避免了重复加载组件
拆完包之后,我们再用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格式的文件
SSR(Server side),也就是服务端渲染,组件或页面通过服务器生成html字符串,再发送到六拉起从头搭建一个服务端是很复杂的,vue应用建议使用Nuxt.js实现服务端渲染