代码放Bundle,怎么动态加载?

用cc.assetManager.loadBundle只能读取资源文件,代码文件取不到啊

1赞

我这边使用方法 resources.load()

打包后bundle内的index.js里面自动整合bundle内的代码文件了,所以代码不好认为是资源文件。不过加载bundle包含了代码。

试了可以的,用cc.assetManager.loadBundle加载bundle,里面的代码也会自动加载,只是没办法用getDirWithPath读取到代码文件的名称

用resources就不能分开加载了 :sweat_smile:

bundle的代码文件名不都是index.js或index.xxx.js吗?你是要md5值?

建议你在每个bundle里按规则添加一个cc.Compoent组件的代码,以Bundle命名,到时候加载完可以在外面用xxx.node.addComponent(bundleName) as BaseBundleCompoent

在主包里定义一个BaseBundleComponent里定义一些通用接口:如onBundleAdded(…params:Arra
y), onBundleRemoved等来进行统一的调用和销毁处理,每个bundle里自己实现自己的对应逻辑,外层只管调用和传参.这样既能统一,又相对美观

嗯 。。。。大概就是这样image

也不太清楚你为啥一定要拿到代码文件名,不过有方法可以直接在打包后记录下当前代码文件名(仅限打包后),一样的还是在“index.js”文件里作文章就行了,你用的是2.X是吧,随便写个插件监听构建,main.js内容如下——缓存bundle内的ts文件名到全局
image
打包完成后打印image
不过我很好奇为啥要获取所有代码文件名。。

1赞

真好奇是什么业务需要去拿代码的文件名

有个通用模块,把代码和资源放单独bundle,与主工程完全分开。
读取bundle的时候,如果知道当前读到了入口脚本,就把它添加上去,这样通用模块就激活了。
我是用bundle.getDirWithPath取bundle里的资源名称,但是取不到代码文件名称。

我知道bundle里有哪些代码文件,只是loadbundle的时候需要知道当前已读取的资源是啥。
getDirWithPath只能取到资源文件名,取不到代码文件名

看来我说的你是半点没听进去呀,我这个业务都写了好多年的大厅加子游戏了,你偏不信。这个方法没有任何问题的 :sweat_smile:

嗯嗯,刚仔细看了,没问题的已经实现了。
“加载完可以在外面用xxx.node.addComponent(bundleName) as BaseBundleCompoent”
其实我是想在bundle每读取一个文件都回调一下,如果判断读到的是入口文件,就马上addComponent上去,而不是等整个bundle都加载完才添加,所以才想知道,怎么获取当前加载的代码文件名称。

加载bundle只是加载bundle的配置,不会加载bundle的资源,加载bundle的资源是bundle.load(XXXX),所以只是单纯的loadbundle不会花费多少时间。所以不必在意这些,如果你想做成同步等待的,可以试试用promise

我是先cc.assetManager.loadBundle读取配置,拿到所有资源名称后分别bundle.load出来
问题是cc.assetManager.loadBundle只能取到bundle里资源文件名,取不到脚本文件名,也就不能触发bundle.load取脚本,这样我就不能在读取到脚本后马上添加了

你可以试试他们大厅加子游戏的做法,说真的,加载bundle耗时基本上就是加载一个json和一个代码的耗时,没那么久

我知道啊,所以现在只能退而求其次,等整个bundle读取完再添加入口脚本了

现在想想,bundle.load应该也不能读取脚本文件吧,脚本不属于cc.Asset的子类
我的理解是,读取bundle后脚本会自动读取,但是不能主动读取