今天在小秘书上提了一个问题,关于 loadBundle 下文件 config.json和index.js

1.官方的 管线与任务 文档在开发中实践不够详细,在实际开发中,还是有几个问题,希望能继续完善下这一块的文档。
比如我在自定义管线时,对优先级还是有点疑惑,对第二个参数done还是有点疑惑,因为cc.assetManager.transformPipeline执行的async(task),就没有done这个参数等等。

2.为啥bundle内部的 config.json 和 index.js为啥不用 assetManager的 loadAny去加载呢?现在引擎内部的实现直接使用的XMLHttpRequest ,那么我在外面定义的pipeline无法操作到这里并创建 task,脱离了pipeline管线,官方是否可以考虑这里也是用 loadAny 去加载?

好深,我顶一顶

你需要对这两个做什么操作呀?

比如一种场景:我希望通过自定义管线,修改这2个文件的 Url,因为远程有一份,本地也有一份,只是由于解压,命名等操作,导致路径有比较大的差异,所以我希望在管线里做修改,使用加载本地的资源。为啥要这么搞2份?是由于ios不同系统的限制,在某些情况下,通过js-bridge加载本地资源只能拦截部分文件类型等等原因而采取的办法。

原先的方法,我们是统一优先走本地,加载失败走远程,由于这2个文件,导致 loadBundle 失败,并且不受 pipeline 管线控制,就没法控制了。
现在使用了另一个方法解决的这个问题,绕开规避了一下:统一先走远程,pipeline 拦截判断类型修改成本地(弊端就是可能有遗留了文件判断)。

这两个文件你是放在不同的文件目录下么?

同一个,不会那么错乱的管理,主要是整个 url 路径差异

如果是同一个的话,直接定制 urlTransformer 管线?这个管线是用来管理 url 拼接的

源码里我看 downloadJson 、 downloadScript 代码是直接走 XMLHttpRequest 调用的,我以为不行的。
如果定制 urlTransformer 可以的话,那我后面准备试试。

就是 cc.assetManager.transformPipeline 对吧?

用 urlTransformer 统一拼接,应该会挺快的,你可以先试试,遇到问题 cue 我

对,就是 transformPipeline

:ok_hand:好的,晚一点就试试

@EndEvil 我刚刚准备开始测试,发现我现在的代码就是用的 transformPipeline,这里 bundle 下的那2个文件,是没有进入task=>{}这个回调。我下面这个是你说的意思吗?

cc.assetManager.transformPipeline.append((task,done)=>{
            for(let i = 0;i<task.input.length;++i) {
                const item = task.input[i];
                const urlStr:string= item.url;
                //打印url ......
            }
            task.output = task.input;
            return null;
        });

是的,你看下,应该有个 item.ext 等于 ‘bundle’, 然后你去改这个 item.url 试试

是的,‘bundle’ 是一个类型,问题在于 downloadBundle 这个方法里面,针对这个 bundle 的加载实际就是加载 ‘index.js’ + ‘config.json’ ,而这2个文件的加载是在 downloadBundle 中拼接的 url = ‘assets/’+bundleName + '/config.json’等(见帖子一楼中源码的截图),在外面修改的 url 是无法带到 downloadBundle 方法内部的吧?

应该可以带进去,downloadBundle 里面应该有判断的,传路径的话,就不拼接了

好的,后面我尝试拉一下最新的引擎源码再看看。当然,实在不行,我也可以尝试修改一下引擎这里的代码。
最后:感谢!!

表示关注。正好有这方面的需求,目前是这样定制了下。
cc.assetManager.downloader.register({
“bundle”: (nameOrUrl, options, onComplete) => {},
});

另外想问问大佬,有没有遇到过 bundle 加载完成后,在onComplete回调里获取不到子包脚本里定义的全局对象的情况?
比如bundle打包出来的脚本index.js里有定义 window[‘foo’]={hello: “world”},但是在onComplete里获取window[‘foo’] 值为 undefine。非必现,有时候又可以获取到。