小程序如何使用分包加载的实现方法


Posted in Javascript onMay 22, 2019

"离线包"机制

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

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

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

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

分包加载

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

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

总结如下:

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

特性

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

关于主包

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

关于分包

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

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

在小程序开发的过程中,小程序的体积会随着版本的迭代变的越来越大,这时候我们就希望能够将小程序分成多个包从服务器下载,这样既可以加快首屏的渲染也便于后续按需加载的实现。小程序在微信客户端 6.6.0,基础库 1.7.3 及以上版本开始支持 分包功能。

在构建小程序分包项目时,构建会输出一个或多个分包。每个使用分包小程序必定含有一个主包。所谓的主包,即放置默认启动页面/TabBar 页面,以及一些所有分包都需用到公共资源/JS 脚本;而分包则是根据开发者的配置进行划分。
在小程序启动时,默认会下载主包并启动主包内页面,当用户进入分包内某个页面时,客户端会把对应分包下载下来,下载完成后再进行展示。

小程序如何使用分包加载的实现方法

配置方法

小程序如何使用分包加载的实现方法

配置例子

{
 "pages": ["pages/index", "pages/shopcart"],
 "subpackages": [
  {
   "root": "packageA",
   "pages": ["pages/mine", "pages/order"]
  },
  {
   "root": "packageB",
   "name": "pack2",
   "pages": ["pages/detail", "pages/pay"]
  }
 ]
}
├── app.js
├── app.json
├── app.wxss
├── packageA
│  └── pages
│    ├── mine
│    └── order
├── packageB
│  └── pages
│    ├── pay
│    └── detail
├── pages
│  ├── index
│  └── shopcart
└── utils

打包原则

  • 声明 subpackages 后,将按 subpackages 配置路径进行打包,subpackages 配置路径外的目录将被打包到 app(主包) 中
  • app(主包)也可以有自己的 pages(即最外层的 pages 字段)
  • subpackage 的根目录不能是另外一个 subpackage 内的子目录
  • tabBar 页面必须在 app(主包)内

引用原则

  • packageA 无法 require packageB JS 文件,但可以 require app、自己 package 内的 JS 文件
  • packageA 无法 import packageB 的 template,但可以 require app、自己 package 内的 template
  • packageA 无法使用 packageB 的资源,但可以使用 app、自己 package 内的资源

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
让回调函数 showResponse 也带上参数的代码
Aug 13 Javascript
js下拉框二级关联菜单效果代码具体实现
Aug 03 Javascript
Javascript实现单例模式
Jan 24 Javascript
JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法
May 19 Javascript
详解vue中引入stylus及报错解决方法
Sep 22 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
Jan 25 Javascript
微信小程序上传图片实例
May 28 Javascript
JS实现移动端触屏拖拽功能
Jul 31 Javascript
JS复杂判断的更优雅写法代码详解
Nov 07 Javascript
Vue表单控件绑定图文详解
Feb 11 Javascript
ES6入门教程之变量的解构赋值详解
Apr 13 Javascript
node命令行工具之实现项目工程自动初始化的标准流程
Aug 12 Javascript
原生js实现trigger方法示例代码
May 22 #Javascript
koa router 多文件引入的方法示例
May 22 #Javascript
微信小程序template模板与component组件的区别和使用详解
May 22 #Javascript
微信小程序+腾讯地图开发实现路径规划绘制
May 22 #Javascript
详解wepy开发小程序踩过的坑(小结)
May 22 #Javascript
vue项目中mock.js的使用及基本用法
May 22 #Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
May 22 #Javascript
You might like
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
Cookie 小记
2010/04/01 Javascript
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
javascript中this的四种用法
2015/05/11 Javascript
Angular ng-repeat 对象和数组遍历实例
2016/09/14 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
jQuery时间验证和转换为标准格式的时间格式
2017/03/06 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
JS验证码实现代码
2017/09/14 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
2019/06/24 Javascript
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
[45:59]完美世界DOTA2联赛PWL S2 FTD vs GXR 第二场 11.22
2020/11/24 DOTA
python ip正则式
2009/05/07 Python
在Python的循环体中使用else语句的方法
2015/03/30 Python
python使用post提交数据到远程url的方法
2015/04/29 Python
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
2018/01/17 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
深入理解Tensorflow中的masking和padding
2020/02/24 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
2021/03/03 Python
一款纯css3实现的鼠标经过按钮特效教程
2014/11/09 HTML / CSS
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
武汉某公司的C#笔试题面试题
2015/12/25 面试题
法律六进活动方案
2014/03/13 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
2014年个人思想工作总结
2014/11/27 职场文书
2016年公司“3.12”植树节活动总结
2016/03/16 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
未来,这5大方向都很适合创业
2019/07/22 职场文书