前言:挖掘微信小程序漏洞而学习准备的

知识点:微信小程序的分包

分包

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

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

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

PS:这也就说明了为什么在逆向的时候,打开小程序需要把相关的功能都点下,因为这样子相关的分包的资源才会保存到本地进行保存

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

整个小程序所有分包大小不超过 20M

单个分包/主包大小不能超过 2M

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

主包 uni_modules_分包

使用普通分包

开发者通过在 app.json subpackages 字段声明项目分包结构:

app.js

"subpackages": [
    {
      "root": "packageA",
      "pages": [
        "pages/cat",
        "pages/dog"
      ]
    }, 
    {
      "root": "packageB",
      "name": "pack2",
      "pages": [
        "pages/apple",
        "pages/banana"
      ]
    }
  ],

它会自动生成两个对应的文件夹,其中存储相关分包的资源

主包 uni_modules_字段_02

subpackages字段属性中存有四个属性,分别是如下四个

主包 uni_modules_分包_03

打包原则
  • 声明 subpackages 后,将按 subpackages 配置路径进行打包,subpackages 配置路径外的目录将被打包到主包中
  • 主包也可以有自己的 pages,即最外层的 pages 字段。
  • subpackage 的根目录不能是另外一个 subpackage 内的子目录
  • tabBar 页面必须在主包内
引用原则
  • packageA 无法 require packageB JS 文件,但可以 require 主包、packageA 内的 JS 文件;使用 分包异步化 时不受此条限制
  • packageA 无法 import packageB 的 template,但可以 require 主包、packageA 内的 template
  • packageA 无法使用 packageB 的资源,但可以使用主包、packageA 内的资源

使用独立分包(independent字段)

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

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

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

要实现独立分包,只需要在对应的普通分包上加上"independent": true即可实现

主包 uni_modules_分包_04

使用独立分包的限制

独立分包属于分包的一种。普通分包的所有限制都对独立分包有效。独立分包中插件、自定义组件的处理方式同普通分包。

此外,使用独立分包时要注意:

独立分包中不能依赖主包和其他分包中的内容,包括 js 文件、template、wxss、自定义组件、插件等(使用 分包异步化 时 js 文件、自定义组件、插件不受此条限制)

主包中的 app.wxss 对独立分包无效,应避免在独立分包页面中使用 app.wxss 中的样式

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

独立分包中暂时不支持使用插件

预分包加载(preloadRule)

预下载分包行为是当用户在进入某个页面时触发,通过在 app.json 增加 preloadRule 配置来控制。

preloadRule有如下两个属性,当用户加载某个页面的时候设置是否需要预加载其他的分包

主包 uni_modules_开发者_05

app.js定义如下

"preloadRule": {
    "pages/index/index": {
      "network": "all",
      "packages": ["packageA", "packageB"]
    }
  },
  
  "subpackages": [
    {
      "root": "packageA",
      "pages": [
        "pages/cat",
        "pages/dog"
      ]
    }, 
    {
      "root": "packageB",
      "name": "pack2",
      "pages": [
        "pages/apple",
        "pages/banana"
      ],
      "independent": true
    }
  ],

主包 uni_modules_主包 uni_modules_06