H5首屏提速的一些思考

总结

1. webview初始化耗时优化
    1. webview提前加载(缓存池)
        1. webview初始化会占用很大一部分时间,提前加载备用可以避免耗时
        2. 注意点
            1. webview重用时,页面资源需要clear,例如需要清空history队列、页面内容清空
            2. 可能存在native堆栈多次push webview的情况。即页面的push不是webview内部加载HTML,而是通过native端push新的UIviewcontroller,加载新的webview。这种情况,会造成webview的大量出现,同时无法提前加载合适数量的webview。
    2. webview与请求并行加载
        1. request的请求需要依赖webview的初始化完成,避免等待webview初始化的时间,考虑并行加载
        2. webview单独加载,request通过网络请求通道单独请求,当webview加载完成(或者request完成),加载请求结果到初始化完成的webview
2. 资源加载耗时优化--加载离线资源
    1. 基于NSURLProtocol的拦截加载本地资源
        1. H5容器首先区分是UIWebview还是WKwebview
            1. Apple已弃用UIWebview,APP内部线程运行,存在内存问题,效率低,js交互性能差等劣势,但可以完美使用NSURLProtocol
            2. wkwebview是iOS8之后出现,但很多新功能会受限于iOS系统版本。性能优于UIWebview,单独进程运行,js交互方便。但NSURLProtocol的使用有很大问题
            3. 综上,只适用UIWebview
    2. 针对wkwebview,无法使用nsurlprotocol,可以考虑自定义的schemehandle拦截
        1. 只支持自定义scheme,无法对http、https、file使用
        2. 版本要求,iOS11以上
    3. 离线包技术
        1. 基于本地路径,加载本地H5页面和资源
            1. UIWebview的loadHTMLString:baseURL:
            2. wkwebview的loadFileURL:allowingReadAccessToURL:
            3. webview loadrequest时,根据url dispatch到本地资源路径,加载本地离线资源
        2. 若H5资源存在动态化可能,需要离线包版本管理逻辑,以及版本同步策略,自建服务端发布平台
        3. 可能问题:
            1. 二向箔。本地相对路径方式,所有静态资源,都会产生离线化要求
            2. 访问本地资源还会导致资源路径泄漏产生安全问题
            3. 还会有一些浏览器的安全设置无法通过
            4. 无法实现跨域资源请求,会让前端开发人员无法访问外部cdn(实测可以http://xxx/xxx.png方式后获取到资源)
    4. 模板加载
        1. 针对某些新闻类页面,样式固定,数据内容不同
        2. 可以本地离线template HTML,请求新数据,本地重写填充template,并加载显示
3. 前端优化
    1. 服务端提前渲染,静态直出
        1. 页面在服务器端拉取首屏数据后通过NodeJs进行渲染,然后生成一个包含了首屏数据的Html文件
        2. 首屏数据不用在客户端执行脚本加载处理,直接渲染HTML
    2. 资源迁移到CDN,请求响应加速
    3. 页面分离:HTML自定义增量标签,类似于模板加载
        1. 首次加载template HTML,native端并行拉取最新数据,将增量标签替换成新数据,并刷新页面
    4. 业务逻辑优化,减少js页面逻辑耗时
4. 基于浏览器webview容器的优化,设计webview底层加载优化,Android上可能,参考UC团队https://www.infoq.cn/article/9UKos4Xh_6wL4Fh1FOGL

参考文章:


1. 几种首屏提速策略简述(推荐阅读)
    1. https://juejin.im/post/5cd4fda8f265da03a00febe1#heading-6
    2. 离线包:通过获取沙盒H5路径直接加载
        1. 步骤
            1. 将所有的h5文件都放入一个文件夹中。
            2. 将这个文件夹以相对路径的方式倒入到工程代码中。
            3. 获取本地的文件路径。
        2. 核心方法:
            1. loadFileURL:allowingReadAccessToURL:
            2. loadHTMLString:baseURL:
        3. 可能问题:
            1. 二向箔。本地相对路径方式,所有静态资源,都会产生离线化要求
            2. 访问本地资源还会导致资源路径泄漏产生安全问题
            3. 还会有一些浏览器的安全设置无法通过
            4. 无法实现跨域资源请求,会让前端开发人员无法访问外部cdn(实测可以http://xxx/xxx.png方式后获取到资源)
    3. 基于NSURLProtocol进行请求拦截(参考内容图2--百度Android拦截实现方案)
        1. 拦截APP内HTTP/HTTPS请求,返回本地缓存资源
        2. 在UIWebview完美支持实现加载缓存,但wkwebview不支持
            1. WKWebview与NSURLProtocol兼容问题https://www.zhihu.com/question/39434803
    4. 基于WKURLSchemeHandler进行自定义scheme注册拦截
        1. 只支持自定义scheme,无法对http、https、file使用
        2. iOS11以上
    5. 自建本地服务器加载本地资源
        1. 实质是:离线包技术+自建服务器拦截请求,具备两种方案的优点
        2. 技术成本高
    6. webview预加载,节省加载时间。
        1. webview pool,实现webview的重复利用
        2. 用完放回,需要清空webview,即重新加载空白页
    7. 结合native功能
        1. 网络请求、资源加载可考虑通过js调用native接口实现
1. 手机QQ优化方案
    1. VasSonic(https://mp.weixin.qq.com/s/5SASDtiBCHzoCN-YBZy1nA)
    2. 静态直出(服务端渲染):为了优化首屏体验,大部分主流的页面都会在服务器端拉取首屏数据后通过NodeJs进行渲染,然后生成一个包含了首屏数据的Html文件,这样子展示首屏的时候,就可以解决内容转菊花的问题了。
    3. 离线包:提前下载H5资源(HTML,js,image等),本地加载(loadFileURL:allowingReadAccessToURL:或loadHTMLString:baseURL:)
    4. 并行加载:webview和资源并行加载,避免等待时间,见参考内容图一
    5. 动态缓存:缓存已打开的HTML,通过NSURLProtocol拦截请求,本地直接返回(针对UIWebview)
    6. 页面分离:HTML增加自定义标签,增量更新标签内容
2. 支付宝mpaas-nebula动态化方案
    1. https://segmentfault.com/a/1190000017043584
    2. 实质是离线包技术
    3. 特点是提供平台级的一整套支持服务,从开发、测试到后期运维提供多方保障
    4. 虚拟域名,疑似自建本地服务器加载技术方案
    5. fallback降级技术
3. UC 信息流正文“闪开”优化实践
    1. https://www.infoq.cn/article/9UKos4Xh_6wL4Fh1FOGL
    2. 极致优化—>浏览器webview内核优化
    3. UI 页面 = F 模板 (Data 数据)
        1. 将模板和数据分拆,并尽可能保障在用户触达前获取,然后根据场景选择合适的组装“地点”

注图:

  1. H5加载流程
image.jpeg

初始化 webview -> 请求页面 -> 下载数据 -> 解析HTML -> 请求 js/css 资源 -> dom 渲染 -> 解析 JS 执行 -> JS 请求数据 -> 解析渲染 -> 下载渲染图片

  1. 百度App安卓采用的请求拦截方式
image.jpeg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335