微信小程序页面分包异步化

本文介绍一种保持小程序路径不变,同时可以灵活分包的实践。

完整代码片段:
developers.weixin.qq.com/s/VpoHtdmJ7...

「墨问便签」小程序的体积接近 2M 的小程序包上限了,于是需要进行分包,以支持更大的体积。

目前把个人主页的子版块,打入了一个分包中,并使用了预加载。例如「设置」页,可以线上看效果。

先来看看传统的分包方案:

方案一: 使用小程序文档的示例方式配置

页面路径 /pages/foo/index

分包后路径 /packageA/pages/foo/index

路径的变化,是破坏性改动:

  1. 需要改动页面跳转的代码;
  2. we 分析的数据会中断,也需要重新配置新的页面;
  3. 已经分享出去的页面,需要做兜底。

那么如何保持路径不变呢?

方案二: 每个页面分为 1 个包

分包后页面路径依然为 /pages/foo/index

这么做存在 2 个问题:

  1. 分包最多 100 个,无法支持无限的页面;
  2. 拆的太细,包体积很小。预加载的逻辑会变复杂。

那么使用「分包异步化」来解决这个问题吧。

分包是一个下载单位,分包异步化可以很灵活的加载自定义组件、JS 文件。核心思路是把页面变为一个自定义组件。

项目文件结构如下:

分包配置如下:

⚠️注意,目前由于开发者工具有问题,分包暂时需要有个页面来占位,不影响分包的的组件。

加上 "pages": "index"

页面内会先加载全局占位组件 page,这里特别写了 id page,在组件挂载时展示 loading。等异步组件加载好了,占位组件卸载,关闭 loading。传统方案一的 loading 刚出现时圆圈会卡住转不动,这里会很顺畅。

接着会加载分包的组件,首先把分包的 Page 换成 Component。更换后,原先页面加载的 onLoad 流程替换为自定义生命周期 login。

其它没有什么改动了,wxml 依然使用 page 组件。

page 组件是 scroll-view + 导航栏的封装,通过组件来处理下拉刷新、上拉加载行为。

对于页面分享的方法 onShareAppMessage,可以放在父包处理。不过用户能够首个打开的页面,建议放在主包中,以便得到更好的打开速度。

自定义生命周期的封装,原理是在 app.js 里,重写了 Page 和 Component 方法。

封装自定义生命周期,要注意的是 skyline 渲染模式下:

  1. 正常进入分包页面时,触发顺序为 onLoad,attached;
  2. 返回再次进入分包页面时,触发顺序为 attached,onLoad。

原因是返回再次进入时,不会加载占位组件。

webview 渲染模式则始终加载占位组件,触发顺序为 onLoad,attached。

相关推荐
benbenAItalk7 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
2601_962885728 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
西瓜太郎12348 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
陈随易10 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
水域安全老周10 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
计算机魔术师11 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing9811 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
EatFan11 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
梦想平凡12 小时前
百游棋牌源代码开发搭建教程(五):房间创建、座位分配与请求幂等实现
前端·javascript·数据库·源代码管理
IT_陈寒12 小时前
Redis的Set操作居然能把我的服务整挂了?
前端·人工智能·后端