vue异步加载的简单试验

6 篇文章 1 订阅

网络上关于vue的优化手段非常多,有些有效有些就一般般了,习惯了ctrl+c/v拿来主义的人来说,直接照搬过项目就好了,然而这些优化手段是不是都用上才会秒开呢?或者说也许我们只要一个就好?因为优化的目的就是为了减少项目体积,增强体验的。下面利用工作之余 我做了些优化手段的简单对比,也让新手们知道怎么去做简单的对比试验来检验自己的优化效果。

注明:以下测试都是本地、wifi环境  实际生产环境优化效果会更明显!!

  • 路由的异步加载

项目代码

通过使用webpack提供的import方法可以让对应的模块异步加载,这个方法返回的是一个promise函数,可以使用.then 和.catch来获取结果和捕获错误进行组件异步重加载

使用异步加载路由结果::

可以看到异步加载路由虽然因为增加了几个js映射索引文件,请求数多了,但是总的加载体积是要小的  这就大大的缩小了dom的解析和布局压力,缩减了页面白屏和首屏渲染时间

切换路由时可以看到 每次切换路由favicon.ico都会发起请求,这是不合理的,应该让favicon.ico缓存起来。

对比使用同步加载路由结果::

可以发现如果在路由加载环节使用异步加载  首次资源解析时间会缩减50%左右,这个数字随着路由数量越多越客观,是不是很香。

  • 单独页面组件或模块的异步加载

1.首页全部组件一起加载

  1. 首页仅加载部分组件

对比可以看到如果将首页所有的组件都一起全部加载,load的时长比Dom解析时长多了将近1s多,主要原因是因为有个组件的图片特别多,也没有使用懒加载等手段优化。要知道静态资源加载时间越长将会直接用户某些可交互时间延长

而测试用的组件都是非常基本的dom  组件越复杂,性能优化效果会越明显,是不是很香。

那我们如何减少首屏的体积或者是只显示首屏的组件呢?答案是依然利用import来异步加载组件

具体怎么骚操作,请君继续往下看↓

这里我们借助了v-if来让组件显隐,同时利用component可以接受一个对象的特征,写了一个AsyncComponent函数来返回异步组件的相关逻辑,可以看到使用了异步加载,首屏将ImgList组件给屏蔽了,也就是说它一开始并没有被请求。

作为对比,我们点击按钮看看:

可以看到,图片组件这个时候才开始进行渲染。

上面那种方式用户主动点击的,那我们如何让它自动在滚动到指定位置后再异步加载呢?因为很多场景都是用户无感加载的,比如电商业务的首页,商品详情页、推荐栏等。

答案是使用 IntersectionObserver  但是要注意的是,这个api在IE全版本不支持

 需要自己hake一个兼容版的,可以利用传统的距离api,比如getBoundingClientRect

只要判断bottom<clientHeight和top>0是否在屏幕内就好了

代码如下:

好了 经过以上处理,我们首屏已基本完成了按组件来进行异步加载了,减少了首次加载资源的体积。

但是对于图片较多的首页来说,尤其是对于电商业务、活动h5页面,图片资源的加载也会导致整体的Load时间延长,那我们怎么去处理这块呢?

方式就是利用图片的懒加载!

懒加载的原理就是先放一张默认图片进行占位,然后监听该img节点是否在可视范围,如果在则将真实的url地址替换之前的默认地址src.

好了,经过以上的简单处理,相信新手们很容易就能快速上手自己去体验啦,优化就这么简单,先有现象找出问题原因,再有针对性的去优化,借助可视化工具比如speedpage,lighthourse、performance.timing等

由于篇幅有限,需要以上代码的童鞋可以移步到这 

 https://github.com/woshiitdaniu

或者是直接npm install v-ssr-async-loadicon-default.png?t=LA92https://www.npmjs.com/package/v-ssr-async-load

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值