背景

随着公司业务的不断壮大,最近老是有用户反应公司APP内的商城打开比较慢,这可不行啊,慢了容易流失用户,流失用户减少公司业绩,公司业绩少我的年终奖就少…………,所以为了公司,也为了自己,开始优化之路。

商城系统是去年开发的,是一个基于vue2.0的spa项目,最好的优化思路当然是与原生移动端同学合作将它hybird化,但是这样时间周期太长,改造也太大,而且年后原生移动端的同学也有离职的,导致人手不足,所以只能自己改造。

相关系列文章:

移动spa商城优化记(二)--- webpack打包速度优化篇

开始

这一篇是首屏优化篇,只讲首屏优化部分,先来看一下首屏完全加载出来长啥样,

加载步骤图

首先从原生app点击底栏的商城进入H5页面,此时瞬间大概长这样,

然后经过1-2s左右的时间(无缓存情况)会看到到下面这个loading动画,

然后loading2-3s左右完全加载出来

加载总时长在3-5s左右。

1.进入h5页之前的优化

此处白屏时间主要是移动端webview初始化以及在加载H5的静态资源,此处优化点有四个:

1.全局WebView

方法:

  • 在客户端刚启动时,就初始化一个全局的WebView待用,并隐藏;

  • 当用户访问了WebView时,直接使用这个WebView加载对应网页,并展示。

这种方法可以比较有效的减少WebView在App中的首次打开时间。当用户访问页面时,不需要初始化WebView的时间。

此处需要移动端同学配合。

2.前端代码打包优化

首先,要看看首屏都加载了哪些东西,最主要就是这几个,其中app和vendor都有上百k

然后开始分析文件为什么这么大,执行

npm run build --report

然后会看到一张类似这样的图(是不是很装逼~)

(图是网上找的,并没有用项目的分析图,怕被总监说泄漏源码~)

然后,一看vendor.js里面有部分lodash和moment以及第三方的一些插件的包,这都是当时赶进度偷懒留的坑啊,于是能手写的全部自己手写,去掉第三方一些包的体积。然后再把一些首页用不到的包进行懒加载,不再放到全局引用。

其他优化体积的方法如:

tree-shaking:去除没用过的代码

UglifyJsPlugin:压缩代码

ExtractTextPlugin:提取css出来

这些在之前就用过了,不在这次优化任务里面,不再细说,可以自行查阅插件用法。

3.pwa

此处推荐一个webpack插件offline-plugin,具体用法看这篇文章:

使用offline-plugin搭配webpack轻松实现PWA

这次用pwa主要是用了它的离线缓存,和http cache缓存一样,但是相对来说缓存更可控。

4.loading动画前移

现在只有H5的静态资源加载完毕后才会看到loading动画,H5静态资源优化的再小中间也是有白屏时间的,所以我们在移动端加上了loading动画,而把H5的loading动画去掉换用了骨架屏,具体在下面说。

2.进入h5页之后的优化

此处h5静态资源加载完后会看到loading动画,loading动画时在做什么呢?请求A接口,A接口返回后请求B接口,B接口返回后请求………此处优化点有四个:

1.骨架屏

一进页面先加载骨架屏占位,然后再去数据填充。

我们骨架屏是自己写的,也可以用插件

vue-skeleton-webpack-plugin

用法可以看这里:

为vue项目添加骨架屏

2.部分前端请求改为服务端内网请求

比如用户信息这类接口本来是前端请求完后拿到用户信息,再拿着用户信息去请求与用户相关的页面数据,但是有些网络不稳定的地方接口串行很容易慢,如果一个超时了还得再请求一遍,所以这类移到服务端去做,直接变成内网调用接口,不受客户端网络环境影响。

3.拆分接口,页面分批渲染,部分接口数据做localstorage缓存

之前首页的数据接口为了赶时间,所有数据都是一个接口返回的,所以后端要查好多表,这次我们把一个接口拆分为多个接口,分批加载填充,另外商品分类等这种不太经常变化的数据前端缓存到localstorage中,一进页面先去localstorage中拿数据渲染,然后再动态更新。

先拿到不用区别用户的通用首页数据,并把可以缓存的缓存起来,下次直接用不走接口。

然后与用户有关的数据也回来了,再分批渲染上

最终优化后的结果是:

无白屏时间,原生loading动画1s后看到H5骨架屏,2s之内看到所有数据加载完成。

整体速度从原来的3-5s优化到1-2s之间,有缓存情况可以做到秒开,当然还有其他可以优化的地方,以后优化完了再补充。

首屏优化为什么没用vue-ssr

有同学评论问首屏优化为啥不用vue-ssr,其实是该用的,但是公司因为有更重要的项目排进来了,金三银四公司人手不太够,所以先在旧的基础上进行了优化,等抽出时间会进行服务端渲染的优化,到时候改完会再次分享一篇关于spa迁移ssr的优化文章~

最后

其实性能优化没有公式,还是要根据具体项目具体分析,每个项目的可优化点及优化方式都不一样,不能只会死板硬套雅虎军规这种公式类优化准则。

这是移动spa商城优化的第一篇,以后还会说下有关此项目的webpack打包速度优化,代码封装优化,动画优化等方面的个人经验,如果喜欢就点个赞吧~。

(文章原创整理,转载请注明出处,谢~)

移动spa商城优化记(一)---首屏优化篇相关推荐

  1. html 手机访问优化,移动端首屏优化

    [TOC] ## 页面加载 为什么打开一个 H5 页面会有一长段白屏时间?因为它做了很多事情,大概是: ~~~ 初始化 webview -> 请求页面 -> 下载数据 -> 解析HT ...

  2. 【前端面试】首屏优化

    [前端面试]首屏优化 多一些不为什么的坚持

  3. vue项目的首屏优化策略

    虽然标题是vue项目的首屏优化策略,但是里面绝大部分的方法,对于其他语言写成的单页应用同样适用 1.使用路由懒加载 首屏进入时,直接加载和首屏相关路由,其他全部路由组件实现懒加载,即打开该路由时再去加 ...

  4. 时间都去哪了-移动Web首屏优化实践

    时间都去哪了-移动Web首屏优化实践 首屏时间 可用性的前提,后面用户是否使用你app很重要的因素之一: 我们PC上访问其实现在的带宽已经很好了,百兆光宽带,但是在移动端就不一样了,很多用户还是使用的 ...

  5. 首屏优化,减少白屏时间

    1.加速或减少HTTP请求损耗:使用CDN加载公用库,使用强缓存和协商缓存,使用域名收敛,小图片使用Base64代替,使用Get请求代替Post请求,设置 Access-Control-Max-Age ...

  6. 百度APP-Android H5首屏优化实践

    一.背景 百度App自2016年上半年尝试Feed流业务形态,至2017年下半年,历经10个版本的迭代,基本完成了产品形态的初步探索.在整个Feed流形态的闭环中,新闻详情页(文中称为落地页)作为重要 ...

  7. 【Android高级工程师系统学习视频】百度APP-Android-H5首屏优化实践

    百度App自2016年上半年尝试Feed流业务形态,至2017年下半年,历经10个版本的迭代,基本完成了产品形态的初步探索.在整个Feed流形态的闭环中,新闻详情页(文中称为落地页)作为重要的组成部分 ...

  8. 【优化】1288- 分享我的webpack优化经验,首屏渲染从9s到1s

    今天给大家分享一篇性能优化实战.本文基于vue2(虽然vue3已出,但是本文也很实用) 谈到webpack优化大部分人可能都看腻了,无非就那几招嘛,我之前也是看过许多类似的文章,但都没有自己真正上手过 ...

  9. 接手同事vue项目两个月的血和泪,关于vue项目性能优化,缩短首屏加载时间

    最近接手了别人做的vue项目,项目跑起来后,有些页面很卡,首屏加载也慢,打包速度也慢.于是,研究了很久vue的项目性能优化,下面我将从两个部分来详解vue项目的性能优化: 代码优化 webpack打包 ...

最新文章

  1. 混沌、无序、变局?探索之中,《拟合》开启
  2. Docker持续部署图文详解
  3. 35岁的程序员是“都挺好”还是“都挺惨”?\n
  4. 2.Spring Cloud Alibaba教程:Linux安装Nacos1.3.1以及配置MySQL持久化
  5. 网站遭遇CC及DDOS攻击紧急处理方案
  6. scrapy使用meta在各个模块的组件之间传递数据
  7. 新发现的两个Delphi要点。
  8. CSS3学习笔记之loading动画
  9. 如何使用bcrypt在PHP中对密码进行哈希处理?
  10. 使用Angular Router导航基础
  11. Short, Integer, Long缓存
  12. 利用ArcGIS Python批量拼接遥感影像(arcpy batch processing)
  13. vgcreate 创建卷组
  14. RabbitMQ入门篇、介绍RabbitMQ常用的五种模式
  15. C++ 使用Poco库进行文件操作
  16. Python解决羊车门问题
  17. 和风天气ouc——about页面
  18. WEBSHELL姿势之SQL一句话
  19. 使用Docker构建服务(6)
  20. java 面试知识点总结

热门文章

  1. android 退出多个activity,Android 中 退出多个activity的经典方法
  2. Php的定界符有哪些了,php中定界符
  3. NOIP模拟测试30「return·one·magic」
  4. 问题 1074: 数字整除
  5. Centos7 开启端口
  6. Linux基础练习题(二)
  7. 安卓学习 intent
  8. GCD6: 在GCD上异步执行非UI相关任务
  9. Win7下硬盘安装Redhat双系统
  10. 使用Mockito时遇到的一些问题