uni-app开发小程序如何进行分包优化、分包的预下载(详尽版)

3,106 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

一、为什么需要进行分包

在我们的小程序开发过程中,随着版本的不断迭代,体积会变得越来越大,如果代码包过大,会影响小程序首次启动的时间,甚至可能出现代码无法上传,无法进行打包的情况,分包的提出很好的帮助我们解决这些问题,下面我们一起来认识下小程序的分包。

二、分包的基本概念

所谓分包,是指把一个小程序项目,按照功能需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载。

三、分包有什么好处

  • 对于开发者而言,能使小程序有更大的代码体积,承载更多的功能与服务;
  • 对于用户而言,可以更快打开小程序,同时在不影响启动速度的前提下使用更多的功能与服务。

四、分包前后小程序项目的基本构成

分包前,小程序项目中的所有页面和资源都被打包到一起,导致项目的体积过大,影响首次启动的时间。

image.png

分包后,小程序项目由1个主包+多个分包构成。

  • 主包:放置默认启动页面/TabBar页面,以及一些所有分包都需用到公共资源/JS脚本;
  • 分包:只放置和当前分包有关的页面和私有资源。

image.png

  • 注意:主包中的公共资源可以供所有分包进行使用,而分包中的私有资源只允许当前的分包进行使用。

五、分包的体积大小限制

  • 整个小程序所有分包的体积大小不能超过20M(主包 + 所有分包);
  • 单个分包/主包的体积大小不能超过2M。

六、分包的加载规则

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

七、uni-app中配置分包

1、项目的目录结构

image.png

2、使用optimization属性开启分包优化
属性类型说明
subPackagesBoolean是否开启分包优化

manifest.json文件中加入"optimization": {"subPackages": true}

image.png

3、在pages.json文件的subPackages节点中声明项目分包结构

subPackages节点接收一个数组,数组中的每一项都是应用的子包,其属性值如下:

属性类型是否必填描述
rootString子包的根目录
pagesArray子包由哪些页面组成

注意:subPackages节点中的pages的路径是root下的相对路径,不是全路径。

// pages.json
{
  // 主包:只存放Tabbar页面以及公共页
  "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
    {
      "path": "pages/index/index",
      "style": {
        "navigationBarTitleText": "uni-app"
      }
    },
    {
      "path": "pages/course/index",
      "style": {}
    },
    {
      "path": "pages/my/index",
      "style": {}
    }
  ],
  
  // 分包
  "subPackages": [
    {
      "root": "packageA", // 分包的根目录
      "pages": [{         // 该分包下的所有页面
        "path": "detail/index"
      }]
    },
    {
      "root": "packageB",
      "pages": [{
        "path": "address/index"
      }]
    },
    {
      "root": "packageC",
      "pages": [{
        "path": "order/index"
      }]
    }
  ],
  "globalStyle": {
    "navigationBarTextStyle": "black",
    "navigationBarTitleText": "pms",
    "navigationBarBackgroundColor": "#F8F8F8",
    "backgroundColor": "#F8F8F8"
  }
}
4、分包的打包规则
  • 使用subPackages属性对分包的路径进行声明,subPackages之外的目录将被打包到主包中;
  • tabBar里面配置的页面必需放到主包内;
  • 不通的分包之间的私有资源不能相互引用,但都可以引用主包中的公共资源。
5、分包的引用原则
  • 主包无法引用分包内的私有资源;
  • 分包之间不能相互引用私有资源;
  • 分包可以引用主包内的公共资源。
6、如何查看代码包的大小

点击微信开发者工具右上角详情按钮,在基本信息下方的本地代码可以看到主包以及各个分包的体积大小。

image.png

八、分包预下载

1、什么是分包预下载

分包预下载,就是在进入小程序某个页面时,由框架自动预下载可能需要的分包,提升进入后续分包页面时的启动速度。

2、如何配置分包的预下载

pages.json文件的preloadRule节点中配置分包预下载规则,预下载的行为,会在进入指定的页面时触发。

preloadRule 中,key 是页面路径,value 是进入此页面的预下载配置,每个配置有以下几项:

字段类型必填默认值说明
packagesStringArray进入页面后预下载分包的 root 或 name__APP__ 表示下载所有包。
networkStringwifi在指定网络下预下载,可选值为:all(不限网络)、wifi(仅 wifi 模式下进行预下载)
示例代码如下:
{
  "preloadRule": { // 分包预下载规则配置
    "packageA/detail/index": { // 触发分包预下载的页面路径
      // network 表示在指定的网络模式下进行预下载
      // 可选值为:all(不限网络) 和 wifi(仅 wifi 模式下进行预下载)
      // 默认值为:wifi
      "network": "all",
      // packages 表示进入页面后预下载哪些分包
      // 可以通过 root 或 name 指定预下载哪些分包
      // 如果是 __APP__ 表示下载所有包
      "packages": ["packageA"]
    }
  },
}
3、如何查看分包预下载是否成功

进入触发预加载页面时查看Console日志信息,如果打印preloadSubpackages: success信息,表示分包预下载成功。

image.png

结语:如有不足之处,欢迎在评论区指教,不胜感激!