微信小游戏分包加载 zip 包
确保模板中 AssetManager.js 和 game.json 内容正确
AssetManager 中, 修改 loadSubpackage 方法回调
game.json 中, 修改 subpackages 字段
settings.xxxxx.json 文件中, 将 remoteBundles 内容移至 subpackages 中
src/bundle-scripts 目录中 index.xxxx.js 批量改名为 game.js
将 remote 目录和 src/bundle-scripts 目录统一移至 subpackage 中
AssetManager 内容
function downloadBundle(nameOrUrl, options, onComplete) {
var bundleName = cc.path.basename(nameOrUrl);
var version = options.version || cc.assetManager.downloader.bundleVers[bundleName];
var suffix = version ? version + "." : "";
// console.log("[Z] nameOrUrl:" + nameOrUrl);
// console.log("[Z] bundleVer:" + cc.assetManager.downloader.bundleVers[bundleName]);
if (subpackages[bundleName]) {
var config = "subpackages/".concat(bundleName, "/config.").concat(suffix, "json");
loadSubpackage(bundleName, options.onFileProgress, function (err) {
if (err) {
onComplete(err, null);
return;
}
downloadJson(config, options, function (err, data) {
if (!data) {
console.error(bundleName);
return;
}
if (data.isZip) {
// 解压缩
console.log(`[Z] isZip; bundle=` + data.name);
if (!data) {
return;
}
var zipVersion = data.zipVersion;
var zipUrl = "subpackages/"
.concat(bundleName, "/")
.concat("res.")
.concat(zipVersion ? zipVersion + "." : "", "zip");
console.log(zipUrl);
options.__cacheBundleRoot__ = bundleName;
handleZip(zipUrl, options, function (err, unzipPath) {
if (err) {
onComplete && onComplete(err);
return;
}
console.log(`unzipPath:${unzipPath}`);
data.base = unzipPath + "/res/"; // PATCH: for android alipay version before v10.1.95 (v10.1.95 included)
// to remove in the future
var sys = cc.sys;
if (
sys.platform === sys.Platform.ALIPAY_MINI_GAME &&
sys.os === sys.OS.ANDROID
) {
var resPath = unzipPath + "res/";
if (
fs.accessSync({
path: resPath,
})
) {
data.base = resPath;
}
}
onComplete && onComplete(null, data);
});
} else {
data && (data.base = "subpackages/".concat(bundleName, "/"));
onComplete(err, data);
}
});
});
} else {
var js, url;
if (REGEX.test(nameOrUrl) || nameOrUrl.startsWith(getUserDataPath())) {
url = nameOrUrl;
js = "src/bundle-scripts/".concat(bundleName, "/index.").concat(suffix, "js");
cacheManager.makeBundleFolder(bundleName);
} else {
if (downloader.remoteBundles.indexOf(bundleName) !== -1) {
url = "".concat(downloader.remoteServerAddress, "remote/").concat(bundleName);
js = "src/bundle-scripts/".concat(bundleName, "/index.").concat(suffix, "js");
cacheManager.makeBundleFolder(bundleName);
} else {
url = "assets/".concat(bundleName);
js = "assets/".concat(bundleName, "/index.").concat(suffix, "js");
}
}
require("../../../" + js);
options.__cacheBundleRoot__ = bundleName;
var config = "".concat(url, "/config.").concat(suffix, "json");
downloadJson(config, options, function (err, data) {
if (err) {
onComplete && onComplete(err);
return;
}
if (data.isZip) {
var zipVersion = data.zipVersion;
var zipUrl = ""
.concat(url, "/res.")
.concat(zipVersion ? zipVersion + "." : "", "zip");
handleZip(zipUrl, options, function (err, unzipPath) {
if (err) {
onComplete && onComplete(err);
return;
}
data.base = unzipPath + "/res/"; // PATCH: for android alipay version before v10.1.95 (v10.1.95 included)
// to remove in the future
var sys = cc.sys;
if (
sys.platform === sys.Platform.ALIPAY_MINI_GAME &&
sys.os === sys.OS.ANDROID
) {
var resPath = unzipPath + "res/";
if (
fs.accessSync({
path: resPath,
})
) {
data.base = resPath;
}
}
onComplete && onComplete(null, data);
});
} else {
data.base = url + "/";
onComplete && onComplete(null, data);
}
});
}
}