# 分包加载

# 使用方法

1.分包配置

假设游戏的目录结构如下:

├── game.js
├── game.json
├── images
│   ├── a.png
│   ├── b.png
├── stage1
│   └── game.js
│   └── images
│       ├── 1.png
│       ├── 2.png
└── stage2.js

game.json 中的配置:

注意这里 subPackages 是驼峰命名

{
  ...
  "subPackages": [
    {
      "name": "stage1",
      "root": "stage1/" // 可以指定一个目录,目录根目录下的 game.js 会作为入口文件,目录下所有资源将会统一打包
    }, {
      "name": "stage2",
      "root": "stage2.js" // 也可以指定一个 JS 文件
    }
  ]
  ...
}

subPackages 中,每个分包的配置有以下几项:

字段 类型 说明
name string 分包别名,tap.loadSubpackage可以使用
root string 分包根目录或者 js

2.分包加载

通过 tap.loadSubpackage API 来触发分包的下载,调用 tap.loadSubpackage 后,将触发分包的下载与加载(如果分包指定的是一个目录,则自动加载目录下的 game.js, 如果分包指定的是一个 js 文件,则自动加载该 js 文件),在加载完成后,通过 tap.loadSubpackage 的 success 回调来通知加载完成。 同时,tap.loadSubpackage 会返回一个 LoadSubpackageTask,可以通过 LoadSubpackageTask 获取当前下载进度。

示例代码:


const loadTask = tap.loadSubpackage({
  name: 'stage1', // 填写 game.json 中 subPackages 填写的分包名称 name
  success: function(res) {
    // 分包加载成功后通过 success 回调
  },
  fail: function(res) {
    // 分包加载失败通过 fail 回调
  }
});

loadTask.onProgressUpdate(res => {
  console.log('下载进度', res.progress);
  console.log('已经下载的数据长度', res.totalBytesWritten);
  console.log('预期需要下载的数据总长度', res.totalBytesExpectedToWrite);
});

# 打包原则

配置在 subPackages 字段内的目录或 js 文件,将按照配置打包成一个个「分包」,没有配置在 subPackages 中的目录和 js,将会被打包到主包中。

# 引用原则

  • stage1 无法引用 stage2 的 JS 文件,但可以引用自己 package 内的 JS 文件
  • stage1 无法使用 stage2 的资源,但可以使用自己 package 内的资源