一直以来, 咱们H5活动转化率都很低; APP入口点击 ->到达H5活动页 转化率只有 30% ~ 45%, 有很是大的提高空间;网页应用启动速度慢(尤为是用户首次访问时)、点击转化率低等问题,使其难以进入核心业务技术选型。本文档主要讨论提升转化率的具体落地方案;javascript
先来看一个例子:css
这是在中国wifi下打开咱们某个页面 的h5的视频,很快(算是吧,用PC打开,手机也同样) 这是在印度办公室打开的 html
可见。。。。。问题很是严峻。。。前端
下面咱们根据业界的方法,提出一下解决的愚见方法。java
最近咱们分析了一下整个加载过程的耗时(印度)react
WebView initialization | Node router | html/css/js CPR | interface data/img(loading state) loading...whatever |
---|---|---|---|
500ms —— 1000ms | 2000ms——3000ms | 2000ms-3000ms | It depends on the biz |
无响应白色(低端手机估更长) | 白屏(低端手机估更长),app上面一条加载线从webview到此UV流失率20%以上 | 白屏(低端手机估计更长),app上面一条加线从webview到此UV流失率50%以上 | 菊花/部分数据展现 |
问题一直存在。。。ios
此模块由客户端实现,主要功能:web
此模块由Web前端实现,相似pwa的service worker.主要功能:typescript
// 预加载器核心代码示例 function prefetch(url) { return self.fetch == null ? xhrPrefetchStrategy(url) : fetch(url, { credentials: `omit` }); } function xhrPrefetchStrategy(url) { return new Promise((resolve: () => {}, reject: () => {}) => { const req = new XMLHttpRequest(); req.open(`GET`, url, (req.withCredentials = false)); req.onload = () => { req.status === 200 ? resolve() : reject(); }; req.send(); }); } 复制代码
客户端打开APP空闲时下载 白名单列表, 下载成功后缓存, 白名单可在 CMS 配置;前期考虑快速迭代, 白名单可先不配置,直接客户端固定白名单; 白名单列表:json
const h5_white_list = [ "https://a.com", "https://b.mobi", "https://c.app" ]; 复制代码
此模块由服务端实现,一般以管理配置平台的形式,开放给全部业务线接入,主要功能:
// URL列表配置接口示意 // 资源列表接口URL:https://www.company.com/prefetch-platform/config.json // 资源列表接口响应体示例 // 实际返回给预加载器页面的结果,须要对此配置中的assetsURL进行请求后,返回实际要加载的URL地址 { "prefetch": true, // 全局预加载开关 "end":"appName" //对应哪一个端 "assets": [ // 资源URL列表 { "name": "projectA", // 接入项目名称 "assetsURL": "https://www.company.com/projectA/prefetch-assets.json", // 接入项目资源列表接口地址 "prefetch": true // demo项目预加载开关 }, { "name": "projectA", "assetsURL": "https://www.company.com/projectB/prefetch-assets.json", "prefetch": true } ] } 复制代码
接入方要接入App预加载功能,须要:
// 接入方式示例 // 一、构建URL列表 // 资源列表接口URL:https://www.company.com/projectA/prefetch-assets.json // 资源列表接口响应体: { "prefetch": true, // 是否开启预加载 "end":"appA" "assets": [ // 资源URL列表 "https://www.company.com/projectA/js/index.abcd1234.js", "https://www.company.com/projectA/css/index.abcd1234.css", "https://www.company.com/projectA/img/index.abcd1234.png" ] } // 二、资源跨域头设置 location ~* \.(html|js|css|png)$ { add_header Access-Control-Allow-Origin *; } 复制代码
上面咱们已经对网页中的JavaScript/CSS等资源进行了预加载,咱们还须要对html进行预先加载 入口HTML一般设置为不缓存,每次请求都会从服务端获取最新内容。 这就致使HTML没法进行预加载,进而致使整个网页应用没法实现离线化(断网可用)。 要解决这一问题,咱们须要给HTML文档增长版本号,并应用新的缓存策略。主要实现思路以下
例如: 服务器增长一个额外的接口
{ currentVersion:1.0, project:'projectA', link:'https://gamewhateverstuff.app' } 复制代码
// 配置URL示例 { "prefetch": true, "assets": [ "https://www.company.com/projectA/index.20190501124536.html", "https://www.company.com/projectA/index.20190501124536.html?from=test", "https://www.company.com/projectA/js/index.abcd1234.js", "https://www.company.com/projectA/css/index.abcd1234.css" ] } 复制代码
对这些资源进行预加载后,即可以实如今用户首次访问页面时,全部的静态资源都从本地缓存读取。主要收益:
因为用户浏览行为的难以预测性,静态资源预加载会带来必定的流量浪费,须要对这部分红本进行核算。
以预加载一个H5项目(资源大小100KB)1000万次为例,增长流量 = 1000万 * 100KB ≈ 1TB。
以预加载50个网页项目为例,增长的手机流量 = 50 * 100KB ≈ 5MB,仅在WIFI下载则用户成本更低。 这里须要指出的是,并不是每次App启动都会下载5MB。在一个项目上线周期内,缓存资源失效前,仅会下载1次,后续资源预加载请求也会命中缓存。 预加载并不是适合全部的项目场景,不一样项目的投入产出比是不一样的,须要具体项目具体分析,以上给出的是成本分析的计算方法。 下面给出一些适用的项目场景:
若是上述成本还没法接受,咱们能够经过静态化和动态化策略,进一步降成本。
上述部分策略,需经过服务端管理平台落地,实如今合适的时机下载合适的项目。
动态策略举例:仅针对未登陆用户,预加载登录网页的静态资源。 这里须要指出的是,部分动态化策略的实现,须要大量研发资源和计算资源的投入,这部分投入可能已经远远超过了流量成本,所以在实施动态化策略时,须要综合评估考虑。
经过前端的性能监控系统Nemo Metric来得知请求的静态资源是fromLocalCache仍是fromRemoteServer。 具体思路:performance.getEntries() ,能够获取每个静态资源的请求信息,其返回以下图:
缓存命中率 = fromLocalCache/ (fromRemoteServer + fromLocalCache) 这里须要指出的是,缓存命中率只是一个过程指标,在项目初期,建议将更多精力关注到彻底加载时间和页面加载成功率率等结果指标上。
在组件化、服务化盛行的今天,各个前端项目之间,共用了大量的基础库、组件库、业务框架,对于这些共用的部分,能够独立成一组公共静态资源,在App启动时预加载,直接内置到WebView缓存中。 这些资源咱们在每一个H5项目都会用到
# 13kb https://unpkg.com/react@16/umd/react.production.min.js # 103kb https://unpkg.com/react-dom@16/umd/react-dom.production.min.js # 13.4kb https://unpkg.com/axios/dist/axios.min.js 复制代码
业务项目只须要引用这些地址,即可以直接从WebView缓存中读取公共库。
在解决静态资源下载慢这一问题上,业界还有一种广为应用的技术方案,既:离线化/离线包方案。其主要思路是:
App应用的功能代码,一般在用户访问以前,就已经以安装包的形式,经过应用市场下载安装好了。而网页应用的功能代码(静态资源),则是在用户实际点击访问时,才实时下载运行。
这一『用时下载』的特色是一把双刃剑,既带来了实时更新的灵活性,也形成了应用启动的延迟,致使网页应用启动速度远远落后于App应用,形成交互体验和用户转化短板。
本文提出的基于静态资源预加载技术,提高App内网页启动速度的新方案。根据目前加载过程的耗时与流失请困高,此方案估计可显著提高网页启动速度(缩短页面加载时间30%-50%以上)、提升网页加载成功率。