用版本号进行bundle的远程加载无效吗?

根据官网文档 传入版本号就能 绕过缓存 加载指定版本的bundle

封装了一个接口


传入 bundle名和版本号
image
传一个版本号
image
得到的还是原来的bundle
image

bundle配置

抖音和微信平台都不行

请问这个API需要怎么调用才能生效

咦?你这样调用竟然没报错?用的哪个版本?我之前应该是用3.8.0试的,抖音和微信直接报错了,定位过问题,是因为加载bundle时需要干两件事:下载bundle的config.json文件和加载index.js脚本,这边传入版本号之后,就会下载 config.xxx.json 并加载 index.xxx.js;然后微信和抖音所有脚本都是在打包的时候保留在主包下的,此时由于原来的主包目录src/bundle-scripts下不存在index.xxx.js,直接就报加载错误,寄掉了。 :joy:

用的3.8.3 你的这个报错src/bundle-scripts下不存在index.xxx.js 我尝试的时候出现过 就是先把这个目标bundle 先removeBundle 然后再去加载 就会报这个错image

那可能是有改动过了,我之前没有加载旧的,直接指定版本去加载新的,也是不行。

在微信入口用http请求自己setting.json替换setting.js的version配置就可以了

我刚看了下 是有2个地方都加载了这个bundle 然后我这个是第2次加载 我把前面那个注释之后 就出现了你说的报错了

那我如果要更新 新的bundle是直接改setting里面的 版本号吗 我有试过直接改远程上的setting中的版本号image 然后再加载的时候 直接没任何反应

就是这个味 :joy:
这个没法解决,后续我就没继续折腾了。

有个绕过bundle的做法就是直接把资源改成普通的remote资源,通过loadRemote接口去下载,这个就随便用了。

顺带吐槽一下,真心没看懂官方为每个bundle都搞一个index.js的用途是啥。目前来看,如果是纯资源的bundle,index.js的内容都一毛一样。如果能增加个区别代码包和资源包的功能,然后资源包不需要绑定index.js,就非常nice了。

我也想过做成普通的remote 但是我在编辑器上浏览的时候 也只能去加载remote吗 我想在编辑器模式下 可以去加载本地的路径 但是用loadRemote 我不知道url 如果用本地路径下的资源要怎么填

可以全部都使用loadRemote的方式加载,或者,试试我新鲜出炉的方案:

function loadHotFixBundle(bundleName: string, options: any, onCompleted: (err: Error, bundle: AssetManager.Bundle) => void) {
    let oldBundle = assetManager.bundles.get(bundleName);
    if (oldBundle) {
        // 卸载旧bundle缓存
        oldBundle.releaseAll();
        assetManager.bundles.remove(bundleName);
    }

    let suffix = options && options.version ? `${options.version}.` : '';
    let baseUrl = `${assetManager.downloader.remoteServerAddress}remote/${bundleName}/`;
    let configUrl = `${baseUrl}config.${suffix}json`;

    // 清除可能存在的config缓存
    assetManager.cacheManager.removeCache(configUrl);

    assetManager.loadRemote(configUrl, (err, data: JsonAsset) => {
        if (err) {
            onCompleted?.(err, null);
            return;
        }

        let bundle = new AssetManager.Bundle();
        let config = data.json as any;
        config.base = baseUrl;
        bundle.init(config);
        assetManager.bundles.add(bundleName, bundle);
        onCompleted?.(null, bundle);
    });
}

注意:热修复资源要和原始资源存放在相同的资源服务器目录下(assetManager.downloader.remoteServerAddress)。

目前只尝试资源替换,没试过新增的,有需要可以完整测试一下。

我测了下有效 感谢!
新增和删除 感觉没必要 因为是小游戏的热更表 如果你改了表结构或者增加新表的话 你本身代码无法热更的情况下就已经报错了 所以表热更只能改数值 或者添加数据 不能改字段和结构

请问config是指构建后bundle文件夹的config文件吗

是的,没错