分包加载的介绍

大部分小程序都会由某几个功能组成,通常这几个功能之间是独立的,但会依赖一些公共的逻辑,并且这些功能通常会对应某几个独立的页面。那么小程序代码的打包,大可不必一定要打成一个,可以按照功能的划分,拆分成几个分包,当需要用到某个功能时,才加载这个功能对应的分包。



兼容

微信 6.6.0 版本开始支持分包加载,而对于低于这个版本的客户端,我们做了兼容处理,开发者不需要对老版本微信客户端做兼容。

通过 wx.getSystemInfo 或 wx.getSystemInfoSync也可以通过 wx.canIUse

兼容方式 - 接口

对于新增的 API,可以用以下代码来判断是否支持用户的手机。

if (wx.openBluetoothAdapter) {
  wx.openBluetoothAdapter()
} else {
  // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示
  wx.showModal({
    title: '提示',
    content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
  })
}

兼容方式 - 参数

对于 API 的参数或者返回值有新增的参数,可以判断用以下代码判断。

wx.showModal({
  success: function(res) {
    if (wx.canIUse('showModal.cancel')) {
      console.log(res.cancel)
    }
  }
})

兼容方式 - 组件

对于组件,新增的组件或属性在旧版本上不会被处理,不过也不会报错。如果特殊场景需要对旧版本做一些降级处理,可以这样子做。

Page({
  data: {
    canIUse: wx.canIUse('cover-view')
  }
})
<video controls="{{!canIUse}}">
  <cover-view wx:if="{{canIUse}}">play</cover-view>
</video>

分包加载

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

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

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

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

  • 整个小程序所有分包大小不超过 4M
  • 单个分包/主包大小不能超过 2M

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

使用方法

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

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





├── app.js



├── app.json



├── app.wxss



├── time



│ └── pages



│ ├── cat



│ └── dog



├── list



│ └── pages



│ ├── apple



│ └── banana



├── pages



│ ├── index



│ └── logs



└── utils






{



"pages":[



"pages/index",



"pages/logs"



],



"subPackages": [



{



"root": "time",



"pages": [



"pages/cat",



"pages/dog"



]



}, {



"root": "list",



"pages": [



"pages/apple",



"pages/banana"



]



}



]



}



文件结构

unity微信分包_微信小程序


打包原则

  • 声明 

subPackages

  •  后,将按 

subPackages

  •  配置路径进行打包,

subPackages

  • app(主包)也可以有自己的 pages(即最外层的 pages 字段)

subPackage

  •  的根目录不能是另外一个 

subPackage

  • 首页的 TAB 页面必须在 app(主包)内

引用原则

packageA

  •  无法 require 

packageB

  •  JS 文件,但可以 require 

app

  • 、自己 package 内的 JS 文件

packageA

  •  无法 import 

packageB

  •  的 template,但可以 require 

app

  • 、自己 package 内的 template

packageA

  •  无法使用 

packageB