某些情况下,开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载。

在构建小程序分包项目时,构建会输出一个或多个分包。每个使用分包小程序必定含有一个主包。所谓的主包,即放置默认启动页面/TabBar 页面,以及一些所有分包都需用到公共资源/JS 脚本;而分包则是根据开发者的配置进行划分。

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

对小程序进行分包,可以优化小程序首次启动的下载时间,以及在多团队共同开发时可以更好的解耦协作。

目前小程序分包大小有以下限制:

  1. 整个小程序所有分包大小不超过 20M。
  2. 单个分包/主包大小不能超过 2M。

使用分包:

开发者通过在 app.json subpackages 字段声明项目分包结构。subpackages 中,每个分包的配置有以下几项:

  1. root:分包根目录;
  2. name:分包别名,分包预下载时可以使用;
  3. pages:分包页面路径,相对于分包根目录;
  4. independent:分包是否是独立分包;
  1. 声明 subpackages 后,将按 subpackages 配置路径进行打包。
  2. subpackage 的根目录不能是另外一个 subpackage 内的子目录。
  3. subpackages 配置路径外的目录将被打包到 app(主包) 中。
  4. app(主包)也可以有自己的 pages(即最外层的 pages 字段)。
  5. tabBar 页面必须在 app(主包)内。

不需要担心低版本的兼容问题。会由微信后台编译来处理旧版本客户端的兼容,后台会编译两份代码包,一份是分包后代码,另外一份是整包的兼容代码。 新客户端用分包,老客户端还是用的整包,完整包会把各个 subpackage 里面的路径放到 pages 中。

假设支持分包的小程序的目录结构如下:


那么要在 app.json 中进行如下配置:

{"pages":["pages/index","pages/logs"],"subpackages": [{"root": "packageA","pages": ["pages/cat","pages/dog"]}, {"root": "packageB","name": "pack2","pages": ["pages/apple","pages/banana"]}]
}
  1. packageA 无法 require packageB JS 文件,但可以 require app、自己 package 内的 JS 文件。
  2. packageA 无法 import packageB 的 template,但可以 require app、自己 package 内的 template。
  3. packageA 无法使用 packageB 的资源,但可以使用 app、自己 package 内的资源。

独立分包:

独立分包是小程序中一种特殊类型的分包,可以独立于主包和其他分包运行。从独立分包中页面进入小程序时,不需要下载主包。当用户进入普通分包或主包内页面时,主包才会被下载。

开发者可以按需将某些具有一定功能独立性的页面配置到独立分包中。当小程序从普通的分包页面启动时,需要首先下载主包;而独立分包不依赖主包即可运行,可以很大程度上提升分包页面的启动速度。

一个小程序中可以有多个独立分包。

开发者通过在 app.json 的 subpackages 字段中对应的分包配置项中定义 independent 字段声明对应分包为独立分包。

微信客户端 6.7.2,基础库 2.3.0 及以上版本开始支持。在低于6.7.2版本的微信中运行时,独立分包视为普通分包处理,不具备独立运行的特性。在兼容模式下,主包中的 app.wxss 可能会对独立分包中的页面产生影响,因此应避免在独立分包页面中使用 app.wxss 中的样式。

独立分包属于分包的一种,普通分包的所有限制都对独立分包有效。
独立分包中不能依赖主包和其他分包中的内容,包括js文件、template、wxss、自定义组件、插件等。主包中的app.wxss对独立分包无效,应避免在独立分包页面中使用 app.wxss 中的样式。
独立分包中暂时不支持使用插件。

假设小程序目录结构如下:

那么在 app.json 中要进行如下配置:

{"pages": ["pages/index","pages/logs"],"subpackages": [{"root": "moduleA","pages": ["pages/rabbit","pages/squirrel"]}, {"root": "moduleB","pages": ["pages/pear","pages/pineapple"],"independent": true}]
}
关于 getApp():

App 只能在主包内定义,独立分包中不能定义 App,会造成无法预期的行为。

与普通分包不同,独立分包运行时,APP 并不一定被注册,因此 getApp() 也不一定可以获得 APP 对象。

  1. 当用户从独立分包页面启动小程序时,主包不存在,APP 也不存在,此时调用 getApp() 获取到的是 undefined。当用户进入普通分包或主包内页面时,主包才会被下载,App 才会被注册。
  2. 当用户是从普通分包或主包内特免跳转到独立分包页面时,主包已经存在,此时调用 getApp()可以获取到真正的 App。

由于这一限制,开发者无法通过 App 对象实现独立分包和小程序其他部分的全局变量共享。为了不再独立分包中满足这一需求,基础库2.2.4版本开始 getApp 支持 allowDefault 参数,在 App 未定义时返回一个默认实现。当主包加载,App 被注册时,默认实现中定义的属性会被覆盖合并到真正的 App 中。

// 独立分包中
const app = getApp({allowDefault: true})
app.data = 456
app.global = {}//app.js中
App({data: 123,other: 'hello'
})
console.log(getApp()) // {global: {}, data: 456, other: 'hello'}
关于 App 生命周期:

当从独立分包启动小程序时,主包中 App 的 onLaunch 和首次 onShow 会在从独立分包页面首次进入主包或其他普通分包页面时调用。

由于独立分包中无法定义 App,小程序生命周期的监听可以使用 wx.onAppShow,wx.onAppHide 完成。App 上的其他事件可以使用 wx.onError,wx.onPageNotFound 监听。

分包预下载:

开发者可以通过配置,在进入小程序某个页面时,由框架自动预下载可能需要的分包,提升进入后续分包页面时的启动速度。对于独立分包,也可以预下载主包。

基础库2.3.0开始支持,低版本需做兼容处理。
分包预下载目前只支持通过配置方式使用,暂不支持通过调用 API 完成。
同一个分包中的页面享有共同的预下载大小限额2M,限额会在工具打包时校验(如:页面 A 和 页面 B 都在同一个分包中,A 中预下载总大小 0.5M的分包,B 中最多只能预下载总大小1.5M的分包)。

预下载分包行为在进入某个页面时触发,通过在 app.json 增加 preloadRule 配置来控制。preloadRule 中,key 是页面路径,value 是进入此页面的预下载配置,每个配置有以下几项:

  1. packages:进入页面后预下载分包的 root 或 name。__APP__ 表示主包。
  2. network:在指定网络下预下载,可选值为:all(不限网络)、wifi(仅wifi下预下载)。
{"pages": ["pages/index"],"subpackages": [{"root": "important","pages": ["index"],},{"root": "sub1","pages": ["index"],},{"name": "hello","root": "path/to","pages": ["index"]},{"root": "sub3","pages": ["index"]},{"root": "indep","pages": ["index"],"independent": true}],"preloadRule": {"pages/index": {"network": "all","packages": ["important"]},"sub1/index": {"packages": ["hello", "sub3"]},"sub3/index": {"packages": ["path/to"]},"indep/index": {"packages": ["__APP__"]}}
}

《十六》微信小程序中的分包相关推荐

  1. 《十》微信小程序中自定义组件的组件模板和样式

    组件 WXML 模板: 组件模板的写法与页面模板相同. 模板数据绑定: 与普通的 WXML 模板类似,可以使用数据绑定. <!-- custom-component.wxml --> &l ...

  2. 五十、微信小程序云开发中的云数据库

    @Author:Runsen 今天是2020年7月24日.不学习,不复习,那根一条咸鱼差不多. 今天继续学习复习微信小程序中的云开发. 文章目录 云开发 云数据库 云开发 开发者可以使用云开发开发微信 ...

  3. Canvas 动画引擎解析与微信小程序中的应用

    点击观看大咖分享 抗击疫情,腾讯云在行动.在开发微信小程序的过程中,我们经常需要展现一些图形和图表.目前市面上有好几款常用的图形库,在这些图形库的底层都有渲染引擎在支撑. ZRender 是其中一款非 ...

  4. 微信小程序中使用动态echarts

    微信小程序中使用动态echarts,套值可用 1.先在微信开发者工具中创建一个项目 2. 在echarts-for-weixin中下载项目 解压后打开,把ec-canvas文件夹复制到项目pages同 ...

  5. 微信小程序中使用全局变量解决页面的传值问题

    微信小程序中使用全局变量解决页面的传值问题 由于项目需要,最近便在做 一个类似于美团的餐饮平台的的微信微信小程序 ,项目有十几个页面,那么页面间的传值被经常用到.在小程序中页面间的传值主要有使用全局变 ...

  6. 五分钟学会在微信小程序中使用 vantUI 组件库

    前言 我们在开发微信小程序时,设计和实现好用的用户界面无疑是至关重要的一步.但是微信小程序官方自带的 UI 组件库无法满足很多使用场景,这个时候就需要我们使用一些第三方的 UI 组件库.而 vant ...

  7. 微信小程序中嵌套html_在微信小程序中渲染HTML内容3种解决方案及分析与问题解决...

    大部分Web应用的富文本内容都是以HTML字符串的形式存储的,通过HTML文档去展示HTML内容自然没有问题.但是,在微信小程序(下文简称为「小程序」)中,应当如何渲染这部分内容呢? 在微信小程序中渲 ...

  8. 教你解决Taro微信小程序中使用Echarts体积过大的问题

    教你解决Taro微信小程序中使用Echarts体积过大的问题 背景 为什么选择Echarts? 单包超过2M,如何处理? 以为到此就结束了? 最后 背景 近期笔者在使用Taro进行微信小程序开发,当引 ...

  9. 微信小程序setinterval_微信小程序中setInterval的使用方法

    微信小程序中setinterval的使用方法 看了下小程序的画布功能,简单的使用了一下,用蹩脚的逻辑做了个 "弹啊弹,弹走鱼尾纹的小球",一起来看下吧.过程不重要主要是画布的使用哦 ...

最新文章

  1. 问题 seata_架构设计 | 基于Seata中间件,微服务模式下事务管理
  2. java 线程状态_【19期】为什么Java线程没有Running状态?
  3. 头脑风暴算法代码_混乱的头脑导致混乱的代码
  4. 查看linux是否lvm分区,linux LVM分区查看dm设备
  5. linux删除文件夹命令6,Linux下创建、删除文件和文件夹命令
  6. 【C语言函数】 - 库函数、自定义函数、函数参数、函数调用、嵌套调用链式访问、递归与迭代、缓冲区
  7. 获取历史市盈率的地方
  8. Python模拟鼠标按键(长按)
  9. [爬虫实践blog]之——GET公众号封面图
  10. 【EGE】五子棋小游戏 (鼠标控制)
  11. 洛谷-P1478-陶陶摘苹果(升级版)
  12. 什么是python自动化测试?
  13. python中search、findall、finditer的区别
  14. java输出每一列数据左对齐_Java(或Excel) - 如何对齐乱序的列数据
  15. 汽车理论第六章matlab,汽车理论第二章作业
  16. 在公司,有些建议不能提
  17. 子网掩码是什么,IP段的24是什么写法
  18. AMOS试用期过期激活
  19. 卷积-CNN-GCN-LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation论文笔记
  20. Impala shell命令

热门文章

  1. 2021-06-04 wms仓库管理常见的问题
  2. css 参考手册 部署到本地
  3. tab栏切换html
  4. 给定一个任意的大写字母A~Z,转换为小写字母。
  5. 免费影像数据下载网站汇总——2010年7月28[转自ESRI中国]
  6. 欧洲为何没有牛逼的互联网公司?
  7. 汇信软件入选山东省优秀软件企业、标志性软件产品项目
  8. 巨头进军社区团购后,团长却更焦虑了:被削权、难赚钱、没未来
  9. 今天,阿里云亮出四张“王牌”,平头哥首次交货!
  10. 苹果IWatch真香,包邮送一个!