1.前言

货拉拉自研H5离线包SDK,能显著提高H5翻开速度,已在多个事务中落地。车型介绍页运用离线包前后翻开效果如下:

图1 运用离线包前 图2 运用离线包后

货拉拉自研离线包具有如下特色:

安全可靠:无hook,无私有API,三重降级战略。

简单保护:三层架构形式和模块化规划。

功用齐备:功用可装备,数据埋点,开发者工具等功用一应俱全。

开源代码地址:github.com/HuolalaTech…

团队介绍:货拉拉移动技能团队/user/176848…

2.布景

Web 技能信任大家十分了解,它具有快速迭代发布的天然优势,在货拉拉App中广泛运用,比如金秋拉货节、余额、车型介绍页等,但也存在加载速度慢,体会差等问题。现在优化Web页面体会计划比较多,有Flutter、React Native、小程序、离线包,其中离线包技能对现有H5页面改造本钱小,技能最为成熟和安稳。

3.职业计划

腾讯开源了离线包计划VasSonic(github.com/Tencent/Vas…

计划名 长处 缺陷 备注
加载本地路径 简单可靠,无需hook和调用私有API 有跨域问题,影响cookie和localstorage,H5需做少数改动 货拉拉计划
恳求阻拦 不修正加载URL,没有跨域问题,且支撑网页部分资源离线化,灵活性和兼容性好 iOS端现在提供的NSURLProtocal和WKSURLSchemehandler阻拦计划有缺陷,前期完本钱钱高 www.jianshu.com/p/8f5e1082f… 网易云音乐计划zhuanlan.zhihu.com/p/347592487
本地Web Server 兼容性好 对客户端耗电和CPU功用有影响 暂未发现有公司选用,/entry/68449…
Service Worker 前端兼容性好 iOS端WKWebView不提供官方支撑,完结技能难度大 爱奇艺计划zhuanlan.zhihu.com/p/148931732

上述几种计划,本地树立Web Server方法对客户端功用影响大,先排除,Service Worker计划因为iOS端不支撑,不考虑。资源阻拦计划兼容性好,但需求处理WKWebview阻拦网络恳求难度大的问题,开发和测验作业量大,暂不必。结合完本钱钱和技能可靠性最后采纳加载本地路径的计划。

4. 技能完结

H5离线包的基本原理是将html、js、css、图片等静态资源打包成压缩包,然后下载到客户端并解压,H5加载时直接从本地读取静态资源文件,减少网络恳求,提高速度。加载本地文件路径存在的问题和处理方法:

存在问题 处理方法
cgi恳求跨域问题 在网关或者后端服务的跨域恳求头添加null域支撑
cookie跨域问题 现在静态js中无cookie操作,没有cookie跨域问题
localstorage跨域问题 暂时不涉及域名隔离问题,假如有需求,采纳调用原生的方法处理
绝对路径问题离线形式不支撑问题 改成相对路径

4.1 整体流程

如下图所示:

客户端发动后,先去长途装备服务器拉取离线包相关的功用装备,然后查看更新,假如有更新则下载离线包。webview加载时,假如本地缓存射中,则从本地磁盘加载html、js、css、图片等静态资源。

H5离线包和线上H5类似也能进行更新和晋级,有三个更新机遇:

1)webview容器翻开时更新。敞开离线包功用的H5页面每次翻开时,会去查看对应的离线包是否有更新。假如有更新,则下载离线包到本地,绝大部分场景是下次翻开时收效。

2)发动查询离线包更新。对于实时性要求比较高的页面,可装备在发动时更新离线包。

3)长衔接推送实时更新。更新实时性要求极高的场景运用。

4.2 架构改善

之前货拉拉webview容器(后续简称WebVC)选用的是两层结构,每个事务方从基础WebVC派生出自己的事务WebVC容器。两层结构在接入离线包时遇到如下问题:

离线包接入计划 长处 缺陷
集成到事务WebVC容器 不影响基础WebVC功用,影响规模小 通用性差,每个事务WebVC都需求修正,接入本钱高。
集成到基础WebVC容器 事务方接入简单,晋级基础WebVC即可 基础WebVC会变得臃肿,添加了离线包,调试工具,埋点功用,后续保护本钱高。

为了既不形成基础容器臃肿,保护本钱高,也要便利事务方快速接入,将webview改成了三层结构:

image.png

增强WebVC和基础WebVC 功用独立,已分成独立的仓库,由不同的开发保护,保护性大大提高。货拉拉基础WebVC容器代码暂未开源,开源代码中改成简化版完结,可自行定制和修正。

4.3 功用优化

1)查询并行化

现在已有多个H5页面选用离线包,为了提高查询效率,多个事务离线包查看的恳求采纳并行恳求的方法。因为HTTP2支撑多路复用,所以查询时共用一个NSURLSession目标,多次查询操作主动复用一个TCP衔接,减少树立衔接次数。考虑到后端改造本钱问题,现在不支撑聚合查询,计划在后续版别中完善。

image.png

2)下载任务去重

下载进程也是并行进行,可一起下载多个离线包。因为查询操作有多个触发机遇,存在重复下载的状况。为了节省流量,选用下载URL作为key,不重复下载正在下载或已下载的文件。

3)发动预下载

大部分离线包查询和下载的机遇为翻开H5页面时,因为离线包查询、下载、解压整体耗时超过1秒,导致初次翻开无法射中离线包。所以货拉拉离线包支撑装备部分离线包在发动时查看和下载离线包,提高初次翻开H5页面离线包射中率。装备json格局为:

{
   "predownloadlist": //选填。需求发动就下载的离线包列表清单
    ["test-offline"]
}

4)断点续传

移动端网络安稳性不如固定网络,会出现因为无网络而导致下载中止的状况。货拉拉离线包接入了自研的下载SDK,支撑断点续传功用,节省了用户下载流量和时长。因为下载SDK代码暂时未开源,离线包对外开源代码中选用简化版别替代,没有完结断点续传功用。

5)解压异步化和串行化

解压进程是CPU和IO密集型操作,放在子线程中处理,有多个文件需求解压时,选用串行行列的方法,一次只解压一个文件,避免一起解压多个文件影响客户端功用。

4.4 可靠性规划

1)解压操作可靠性规划

文件解压耗时较长(大约30ms),假如程序异常退出可能会出现解压操作完结一半的状况,影响后续离线包功用。所以文件解压操作采纳先解压,然后重命名,保证最后得到的文件完整性。一起当离线包正在运用时,一般状况下采纳先解压,下次收效的战略,极点状况下马上收效,但会导致页面强刷,影响用户体会,运用较少。离线包存放时运用tmp、new、cur三个文件夹,不选用版别号命名,简化离线包缓存管理逻辑。解压细节如下:

image.png

2)三重降级战略

客户端主动降级。本地没有离线包时,客户端会主动将启用离线包的H5页面降级为线上H5页面。

长途装备降级。能够设置部分降级,即临时将某个运用离线包的H5页面降级为线上,也可设置全局降级,封闭所有页面的离线包功用。装备json为:

{
    "switch": 1, //总开关,1敞开,0封闭
    "disablelist": //选填,装备禁用某个离线包
     ["act-test"],
}

服务端接口降级。 服务端提供的离线包查询接口可设置将某个页面降级为线上H5,亦可装备客户端更新离线包后强制刷新。

降级战略流程图如下:

image.png

3)功用监控

货拉拉对webview的加载成功率,错误码、耗时进行了计算上报,经过监控面板查看。

此外离线包SDK还有离线包下载,恳求,解压的耗时、结果数据上报。监控和上报采纳的接口扩展方法,接入方根据事务特色选用具体的数据上报SDK。

4.5 效能优化

1)开发者工具

为了便利调试和查看,离线包中包含了开发者工具,仅在Debug形式下才干运用,可查看离线包版别和铲除离线包缓存。

2)离线包和URL映射装备化

客户端webview经过URL是否有offweb参数判别该页面走线上恳求仍是加载本地离线包。URL来历广泛,有客户端硬编码、运营系统下发、JS action调用多种来历,手动修正URL效率太低,因此经过长途装备,主动给指定URL添加离线包参数并射中对应的H5离线包。

image.png

装备json格局如下:首要经过host,path装备匹配规则。

{
    "rules" :[
        {
            "host" :[
                "test1.zzz.cn" ,
                "test2.zzz.cn"
            ],
            "path" :[
                "/testapp"
            ],
            "offweb" : "test-offline1"
        },
        {
            "host" :[
                "test3.xxx.cn" ,
                "test4.xxx.cn"
            ],
            "path" :[
                "test/offweb" ,
                "test/abc"
            ],
            "offweb" : "test-offline2"
        }
    ]
}

5. 收益分析

H5离线包经过多个事务上线验证,功用安稳,收益明显。

5.1 加载速度提高

改造完结的H5页面,平均加载速度从2s提高至1s。部分页面具体数据如下:

5.2 加载成功率提高

页面主结构(不考虑动态数据)加载成功率从96%提高到100%。

6.后期作业与展望

1)扩大开源规模。断点续传下载SDK,日志SDK后续会考虑开源。

2)单元测验用例完善。添加更多单元测验,保证安稳性。

7.参考资料

货拉拉离线包开源地址github.com/HuolalaTech…

携程增量更新zhuanlan.zhihu.com/p/34125968

Service worker zhuanlan.zhihu.com/p/148931732

github.com/yangfangkuo…

WKWebView完美网络恳求阻拦 www.jianshu.com/p/7b28cbd8f…

腾讯vassonic blog.csdn.net/oqzuser1587…