移动spa商城优化记(一)---首屏优化篇

背景

随着公司业务的不断壮大,最近老是有用户反应公司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打包速度优化,代码封装优化,动画优化等方面的个人经验,如果喜欢就点个赞吧~。


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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hprose for java 教程_hprose for java源码分析-4

4.1 疑窦丛生书接上回。上回说到,从HproseClient.java ------------------------- (#0)invokeHandler.handle()开始,将经历一个漫长的调用过程,下面把整个调用链粘出来,先认识下这个庞然大物。( >>> 表示调用到&#xff…

java批量提取文件夹名称_bat 批量提取指定目录下的文件名

bat 批量提取指定目录下的文件名下面是批量获取指定目录下的文件名的核心代码echo offecho text inputset inputset /p input:echo %input% is inputcd %input%rem echo onfor %%a in (*) do (echo %%a is input)cd ..如下是sql server执行对应脚本文件sqlcmd -Spcserver -dmas…

埃及分数The Rotation Game骑士精神——IDA*

IDA*:非常好用的搜索,可以解决很多深度浅,但是规模大的搜索问题。 估价函数设计思路:观察一步最多能向答案靠近多少。 埃及分数 题目大意: 给出一个分数,由分子a 和分母b 构成,现在要你分解成一…

美团扫码付的前端可用性保障实践

开篇 2017年,美团金融前端遇到了很多通用性问题,特别是在保障前端可用性的过程中,我们团队也踩了不少“坑”,在梳理完这些问题以后,我们还专门做了第31期线下沙龙给大家进行了分享。不管是在面试过程中与候选人讨论&a…

Servlet上传文件和下载文件示例

Java Web应用程序中的文件上载和下载以及常见任务。 由于最近我写了很多有关Java servlet的文章 ,因此我想提供一个使用servlet上传和下载文件的示例示例。 用例 我们的用例是提供一个简单HTML页面,客户端可以在其中选择要上传到服务器的本地文件。 在提…

java创建异步多线程_Java创建多线程异步执行实现代码解析

实现Runable接口通过实现Runable接口中的run()方法public class ThreadTest implements Runnable {public static void main(String[] args) {Thread thread new Thread(new ThreadTest());thread.start();}Overridepublic void run() {System.out.println("Runable 方式…

hive基本操作与应用

通过hadoop上的hive完成WordCount 启动hadoop Hdfs上创建文件夹 上传文件至hdfs 启动Hive 创建原始文档表 导入文件内容到表docs并查看 用HQL进行词频统计,结果放在表word_count里 查看统计结果 转载于:https://www.cnblogs.com/cairuiqi/p/9048256.html

Apache log4j是领先的日志记录框架

根据 从零周转开始的调查中, Apache log4j是领先的Java日志记录框架。 这实际上是一个非常有趣的调查。 它显示SLF4J最常用作伐木外墙,占61%。 但是,它似乎最常与Apache Log4j一起使用,52%的调查参与者都…

Centos6.8通过yum安装mysql5.7

Centos6.8通过yum安装mysql5.7 2017年07月13日 14:19:10 阅读数:1067 1.安装mysql的yum源 a.下载配置mysql的yum源的rpm包 根据上面3张图片中的操作下载下来的rpm文件可以通过如下命令获取: wget https://dev.mysql.com/get/mysql57-community-release-e…

Mvc+Hui+SqlSugar+Autofac+NLog+T4 架构设计(一)

一、前言 作为小菜鸟第一次写博客的我还有点小激动,最近开始打算着手写一个属于自己架构。算下来差不多最近花一周多的下班时间了来写这个框架,本来想整体架构开发完成测试完成后才写博客,怕自己没时间或失去动力,就先把自己架构设…

房价在手,天下我有 --反手就撸一个爬虫(终)

接上篇,科科,好,我们继续 我们在这里先把json数据入库吧~ 首先,database/scheme里定义好数据类型。 const mongoose require(mongoose)const detailHouseSchema new mongoose.Schema({ //定义数据模式link:String…

Spring MVC:带有CNVR卷的REST应用程序。 1个

不久前,我阅读了Paul Chapman撰写的有关内容协商视图解析器 (CNVR)的文章。 Spring Framework Blog上的那篇文章启发了我研究这个框架的领域。 因此,我开发了一个基于Spring MVC和CNVR的 REST示例应用程序。 该应用程序演示了REST…

《精通Spring 4.x 企业应用开发实战》学习笔记

第四章 IoC容器 4.1 IoC概述 IoC(Inverse of Control 控制反转),控制是指接口实现类的选择控制权,反转是指这种选择控制权从调用类转移到外部第三方类或容器的手中。 也就是由Spring容器借由Bean配置来进行控制。 DI(D…

微前端——无界wujie

B站课程视频 课程视频 课程课件笔记: 1.微前端 2.无界 现有的微前端框架:iframe、qiankun、Micro-app(京东)、EMP(百度)、无届 前置 初始化 新建一个文件夹 1.通过npm i typescript -g安装ts 2.然后可…

java executor spring_Spring+TaskExecutor实例

一 TaskExecutor接口Spring的TaskExecutor接口等同于Java.util.concurrent.Executor接口。 实际上,它存在的主要原因是为了在使用线程池的时候,将对Java 5的依赖抽象出来。 这个接口只有一个方法execute(Runnable task),它根据线程池的语义和…

小程序居然可以用WXS模拟实现过滤器!

小程序目前官方还没有出过滤器,特别不方便,但是可以用wxs来模拟过滤器,话不多说,直接上代码。当然,不熟悉wxs的可以先看一下 官方文档 1.新建一个filter.wxs的文件我个人建议是一个过滤器写一个wxs,避免引用…

ADF:使用HTTP POST方法进行URL任务流调用

众所周知,可以通过某些URL直接从浏览器或某些外部应用程序调用有限任务流。 如果任务流的属性“ URL invoke”设置为“ url-invoke-allowed”,则启用此功能,该功能通常在集成项目中使用。 通常,客户端(或调用者&#x…

java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...

一、缓存当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象。所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从缓存里查…

Spring MVC:带有CNVR卷的REST应用程序。 3

这是带有CNVR的Spring MVC REST教程的最后一部分。 在这里,我将演示所有这些东西如何工作,这是我在前两部分中开发的。 对于每种类型的CRUD操作,这将分为四个部分:CREATE,READ,UPDATE,DELETE。 …

java 中io的删除文件_总结删除文件或文件夹的7种方法-JAVA IO基础总结第4篇

本文是Java IO总结系列篇的第4篇,前篇的访问地址如下:如果您阅读完成,觉得此文对您有帮助,请给我点个赞,您的支持是我不竭的创作动力。为了方便大家理解,我特意制作了本文对应的视频:总结删除文…