一直以來, 咱們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%以上)、提升網頁加載成功率。