# 分包加载
# 使用方法
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 内的资源