转转:微信小程序分包加载实战

转转:微信小程序分包加载实战

「离线包」机制

微信小程序采用的是类似离线包加载方案,以转转小程序为例,当用户第一次打开时会先下载好所有代码,然后再加载页面;当用户再次进入转转小程序时,会直接使用已下载的代码,省去了代码下载的过程,打开速度更快。

看似很美好的设计,但有两个问题:

  • 第一次打开转转小程序时白屏时间很长,因为要下载接近2.5M的代码量,也就是说你的代码越多,白屏时间越长,而转转APP采用的网页离线机制体验更佳:在用户打开APP时就下载/更新离线包,这样在用户进入对应的网页时,代码已经下载好了,没有漫长的白屏过程。
  • 代码有部分更新时,没办法进行增量更新,导致每次发版后,用户都需要重新下载全部代码

问题看似不大,但对转转有很大影响,例如进行微信广告投放时,用户从点击广告到加载第一个页面之间的流失率竟能到达 40%,这显然是 FE 无法接受的性能,而小程序分包加载机制能够在一定程度上解决上述问题。

分包加载

小程序的分包加载机制实际上是离线包和 M 页的一种结合机制,即你可以把代码划分成主包 +N 个分包,官方定义:

在小程序启动时,默认会下载主包并启动主包内页面,如果用户需要打开分包内某个页面,客户端会把对应分包下载下来,下载完成后再进行展示。

总结如下:

  • 打开小程序,默认先加载主包
  • 进入分包页面时,再加载对应分包

这样的好处是进入主包页面时,需要下载的代码量小了很多,白屏时间更短,体验更佳。

特性

  • 1.7.3 及以上基础库开始支持,不支持的版本默认使用整包的方式
  • 整个小程序所有分包大小不超过 4M,单个分包/主包大小不能超过 2M
  • 分包数量目前没有限制,也就是说你可以放 N 个分包,甚至每个页面一个分包
  • 入口页面 / Tab 页面必须在主包里

关于主包

  • 第一次进入小程序,默认下载主包代码
  • 分包以外的所有代码,都会被打入主包
  • 分包内代码可以引用主包内代码

关于分包

  • 因为存在资源依赖关系,微信的机制是先下载主包,后下载分包
  • 分包目录不能在主包目录下面
  • 分包可以引用自己包内、主包内的资源,不能引用其他分包内的资源

  • 小程序的打包机制仅仅是根据文件目录打包,分包内require/import的任何文件,只要不在同一个目录下面,都不会被打进分包,也就是说,类库及一些公共文件,只能放在主包里面,如果主包分包划分不好的话,主包的大小也很难降下来
  • 安卓系统进入分包页面时,会出现一个丑陋的系统级的loading层,这一定程度上影响了安卓的体验

转转的分包加载

转转小程序在使用分包之前,压缩后的代码量大概是2.45M,也就是说,每个新用户第一次都需要下载的2.45M代码才能进入页面,使用分包机制后,主包大小降为1M左右,也就是说,如果是进入主包页面,下载时间大约降低了60%

文件结构:

├── libs
├── components
├── pages  主包根目录
├────index 首页
├────post  发布页
├────...
├── subPages  分包根目录
├────trade    交易分包
├────mine     我的页面分包
├────...
复制代码

我们根据用户访问的轨迹,分成了 20 个左右的分包。 例如 trade 包,里面包含详情页、下单页、支付页、支付成功页等,这条线的页面,用户可能不需要一进入小程序就使用,但一旦使用可能是使用整个链条,因此可以作为一个分包。

历史入口兼容

一个页面放入分包之后,路径会发生变化,例如详情页由 /pages/detail 变为 /subPages/trade/detail,意味着如果用户访问了以前的 page 则得不到正确的页面响应(例如:分享出去的小程序卡片、二维码、公众号推送消息等),这些静态不可改变的历史入口怎么办?我们目前采用如下方案:

原来主包内的每个页面都保留,但代码只保留跳转逻辑,用户进来后立即跳到对应的分包页面,用户几乎是无感知的

这样也会产生一点小问题:这些跳转页面也占用一定的空间,接下来我们会优化成在 onLaunch、页面跳转时进行判断,直接跳入正确的分包页面。

以上是转转在分包加载方面的实战记录,欢迎小程序开发者与我们交流经验。

另外,本文作者转转前端负责人张所勇,也会在掘金开发者大会・微信小程序专场分享转转小程序开发经验,演讲主题是「小程序 WebView 应用实践」。

具体内容:从小程序基础库 1.6.4 开始,微信小程序支持 web-view 组件。web-view 组件是一个可以用来承载网页的容器,会自动铺满整个小程序页面。但在 WebView 实践中,性能、多端适配、小程序能力、存量 M 页处理等都是开发中的痛点。我会在此次分享中,向大家介绍转转针对这些痛点设计的 Adapter,也会针对方法执行时机、 formID 收集、通信、支付等问题介绍转转的解决方案。

专属福利

掘金开发者大会 ∙ 微信小程序专场现已开始正式报名,现在正在 8 折优惠中。我们特意为本文读者带来了参与活动的专属福利:扫码进入小程序,输入专属优惠码:zz,立减 99 元(限量 10 名)!活动中,不仅有干货满满的技术盛宴,还包众多福利奖品和价值 299 元的自助午餐哦! 活动信息:

  • 官网:conf.juejin.im
  • 时间:2018年9月16日(周日)
  • 地点:北京富力万丽酒店
  • 人数:600 名开发者
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101479.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是hard code

    什么是hard code写死 英文称 hardcode hardcoding 指的是在软体实作上 把输出或输入的相关参数 例如 路径 输出的形式 格式 直接写死在原始码中 而非在执行时期由外界指定的设定 资源 资料 或者格式做出适当回应

    2025年8月2日
    8
  • mybatis批量插入并返回主键(xml和注解两种方式)

    mybatis批量插入在mysql数据库中支持批量插入,所以只要配置useGeneratedKeys和keyProperty就可以批量插入并返回主键了。比如有个表camera,里面有cameraNo,chanIndex,cameraName这三个字段,其中cameraNo是自增主键。下面是批量插入的Dao层接口:voidbatchInsertCameras(@Param(“li…

    2022年4月9日
    47
  • php layer弹出层更改背景,详解Layer弹出层样式[通俗易懂]

    php layer弹出层更改背景,详解Layer弹出层样式[通俗易懂]前言:学习layer弹出框,之前项目是用bootstrap模态框,后来改用layer弹出框,在文章的后面,我会分享项目的一些代码(我自己写的)。layer至今仍作为layui的代表作,她的受众广泛并非偶然,而是这五年多的坚持,不断完善和维护、不断建设和提升社区服务,使得猿们纷纷自发传播,乃至于成为今天的Layui最强劲的源动力。目前,layer已成为国内最多人使用的web弹层组件,GitHub自然…

    2022年7月13日
    15
  • 一个字节等于多少位?「建议收藏」

    一个字节等于多少位?「建议收藏」一个字节=一个byte=8位一个字=两个byte=16位,java中:byte=8位short=2byte=16位int=4byte=32位long=8byte=64位float=4byte=32位double=8byte=64位char=4byte=32位string=可占用Integer.MAX_VALUE个char=(32*Integer.MAX_VALUE)位…

    2022年9月27日
    1
  • Js二代身份证号码正则验证

    Js二代身份证号码正则验证一代身份证号码是十五位,2013年1月1日开始,咱们中国全面停止使用一代身份证了。二代身份证号码:1-6位:表示行政区划的代码。1、2位,所在省(直辖市,自治区)代码;3、4位,所在地级市(自治州)代码;5、6位,所在区(县,自治县,县级市)的代码;7-14位:表示出生年、月、日15-16位:所在地派出所代码17位:性别。奇数(1、3、5、7、9)男性,偶数(2、4、…

    2022年6月27日
    28
  • 微信个人号机器人

    微信个人号机器人前段时间公司需求开发一套自定义的微信机器人,需求是可以自批量添加好友,自动聊天,自动回复,发朋友圈,转发语音,以及定时群发等,还可以提取聊天内容,进行数据汇总,what????微信还可以这样做!!调研开发了3个月,3个月啊!!!(主要被各种技术走偏路),终于成功了,都是走过的心酸泪,分享给大家,大家学习完,记得给我点个赞!!!大家一般需求点无非是以下几个需求:1.开发个人微信营销系统2.开发自定义的微信机器人,3.开发微信智能聊天客服系统4.定制行业内的群数据分析功能需求很

    2022年5月7日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号