微信小程序 - 分包加载

打印 上一主题 下一主题

主题 1069|帖子 1069|积分 3211

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
分包加载

小程序的代码通常是由很多页面、组件以及资源等构成,随着小程序功能的增加,代码量也会逐渐增加,体积过大就会导致用户打开速率变慢,影响用户的利用体验。
分包加载是一种小程序优化技能。将小程序不同功能的代码,分别打包成不同的子包,在构建时打包成不同的分包,用户在利用时按需进行加载,在构建小程序分包项目时,构建会输出一个或多个分包。每个利用分包小程序必定含有一个主包。每个分包可以包罗多个页面、组件、样式和逻辑等。当小程序需要利用某个分包时,才会加载该分包中的代码。
主包: 包罗默认启动页面 / TabBar 页面 以及 全部分包都需用到公共资源的包
分包: 根据开发者的配置进行分别出来的子包
小程序分包后加载方式
在小程序启动时,默认会下载主包并启动主包内页面,在用户访问分包内某个页面时,微信客户端才会把对应分包下载下来,下载完成后再进行展示。
目前小程序分包大小有以下限定:**

  • 整个小程序全部分包大小不超过 20MB
  • 单个分包/主包大小不能超过 2MB
   注意事项
  ​ 整个小程序全部分包大小大概会随时调解,停止到目前整个小程序全部分包大小不超过 20M
  分包的根本利用

在进行分包加载之前,需要对小程序的业务逻辑进行分析,将代码分别成多个模块。每个模块应该有一个明确的功能,并与其他模块之间有明确的依赖关系
   需要按照功能拆分分包,并且每个分包都需要与其他包有依赖关系(可以通过 a 分包跳转到 b 分包)
  开发者在小程序的配置文件 app.json 中,通过 subPackages 大概 subpackages字段声明项目分包结构。
每个分包需要指定 root 字段、name 字段和 pages 字段

  • root 字段指定了分包的根目录,该目录下的全部文件都会被打包成一个独立的包
  • name 字段为分包的名称,用于在代码中引用该分包
  • pages 字段指定了该分包中包罗的页面,可以利用通配符 * 匹配多个页面
  1. {
  2.   "subPackages": [
  3.     {
  4.       "root": "modules/goodModule",
  5.       "name": "goodModule",
  6.       "pages": [
  7.         "pages/list/list",
  8.         "pages/detail/detail"
  9.       ]
  10.     },
  11.     {
  12.       "root": "modules/marketModule",
  13.       "name": "marketModule",
  14.       "pages": [
  15.         "pages/market/market"
  16.       ]
  17.     }
  18.   ]
  19. }
复制代码
打包和引用原则(注意事项)

打包原则:

  • tabBar 页面必须在主包内
  • 最外层的 pages 字段,属于主包的包罗的页面
  • 按 subpackages 配置路径进行打包,配置路径外的目录将被打包到主包中
  • 分包之间不能相互嵌套,subpackage 的根目录不能是另外一个 subpackage 内的子目录
引用原则:

  • 主包不可以引用分包的资源,但分包可以利用主包的公共资源
  • 分包与分包之间资源无法相互引用, 分包异步化时不受此条限定
独立分包的配置

独立分包

独立分包是小程序中一种特殊范例的分包,可以独立于主包和其他分包运行
从独立分包中页面进入小程序时,不需要下载主包,但是当用户进入普通分包或主包内页面时,主包才会被下载 !
开发者可以将功能相对独立的页面配置到独立分包中,因为独立分包不依赖主包即可运行,可以很大程度上提升分包页面的启动速率
   如果是独立分包,不需要下载主包,直接就能够访问,独立分包是自己独立运行的
  而如果是其他分包,需要先下载主包,通过路径访问,才能加载对应路径的分包
    注意事项:
  

  • 独立分包中不能依赖主包和其他分包中的资源
  • 主包中的 app.wxss 对独立分包无效
  • App 只能在主包内定义,独立分包中不能定义 App,会造成无法预期的活动
  配置独立分包

开发者在app.json中找到需要配置为独立分包的subpackages字段
在该字段配置项中定义independent字段声明对应分包为独立分包。
  1. {
  2.   "subPackages": [
  3.     {
  4.       "root": "modules/goodModule",
  5.       "name": "goodModule",
  6.       "pages": [
  7.         "pages/list/list",
  8.         "pages/detail/detail"
  9.       ]
  10.     },
  11.     {
  12.       "root": "modules/marketModule",
  13.       "name": "marketModule",
  14.       "pages": [
  15.         "pages/market/market"
  16.       ],
  17. +       "independent": true
  18.     }
  19.   ]
  20. }
复制代码
分包预下载

分包预下载是指访问小程序某个页面时,预先下载分包中的代码和资源,以进步用户的利用体验。当用户需要访问分包中的页面时,已经预先下载的代码和资源可以直接利用,通太过包预下载加快了页面的加载速率和显示速率
小程序的分包预下载需要在 app.json 中通过 preloadRule 字段设置预下载规则。preloadRule 是一个对象,对象的 key 表示访问哪个路径时进行预加载,value 是进入此页面的预下载配置,具有两个配置项:
字段范例必填默认值说明packagesStringArray是无预下载的分包名称,进入页面后预下载分包的 root 或 name
__APP__ 表示主包。networkString否wifi在指定网络下预下载,
可选值为: all: 不限网络 wifi: 仅wifi下预下载
  1. {
  2.   "subPackages": [
  3.     {
  4.       "root": "modules/goodModule",
  5.       "name": "goodModule",
  6.       "pages": [
  7.         "pages/list/list",
  8.         "pages/detail/detail"
  9.       ]
  10.     },
  11.     {
  12.       "root": "modules/marketModule",
  13.       "name": "marketModule",
  14.       "pages": [
  15.         "pages/market/market"
  16.       ],
  17.       "independent": true
  18.     }
  19.   ],
  20.   "preloadRule": {
  21.     "pages/index/index": {
  22.       "network": "all",
  23.       "packages": ["modules/goodModule"]
  24.     },
  25.     "modules/marketModule/pages/market/market": {
  26.       "network": "all",
  27.       "packages": ["__APP__"]
  28.     }
  29.   }
  30. }
复制代码
  1. {
  2.   "pages": [
  3.     "pages/index/index",
  4.     "pages/user/user"
  5.   ],
  6.   "subPackages": [
  7.     {
  8.       "root": "pages/music",
  9.       "name": "music",
  10.       "pages": [
  11.         "player/player",
  12.         "lyric/lyric"
  13.       ]
  14.     },
  15.     {
  16.       "root": "pages/settings",
  17.       "name": "settings",
  18.       "pages": [
  19.         "theme/theme",
  20.         "language/language"
  21.       ]
  22.     }
  23.   ],
  24.   "preloadRule": {
  25.     "pages/music/player/player": {
  26.       "packages": ["settings"],
  27.       "network": "wifi"
  28.     }
  29.   }
  30. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表