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

满满的干货啊 :laughing:

做的多了就知道了,不是啥 麻烦事儿

永远有做不完的需求,加油:rofl:

是啊,除非被裁了……

各位大佬,我想跟帖问个问题:如果有很多个子游戏,然后通用的bundle包有A包和B包,子游戏想根据情况调用对应的通用bundle包的内容,关于文件引用的问题要怎么处理?动态import A包和B包的类吗?

已知的情况除了预览,其他环境import没用。下面是跨bundle访问代码方式,都需要bundle先加载后调用——

1、访问脚本可以单独用cc.js.getClassByName(“类名”),所有环境下通用,但局限于只能拿到脚本;

2、访问代码文件可以用

  • 2.x版本用__require(‘文件名’),仅限打包环境,兼容预览环境可以在入口类加image

  • 3.x用System,每个小版本差异挺大,3.6以上用System[Object.getOwnPropertySymbols(System)[0]][‘chunks:///_virtual/{文件名}’](没具体看过其他版本),不限环境image

附注:如果一定要把通用的代码放子bundle,那最好只放脚本,其他文件获取方式太恶心了;然后是import的问题,代码不要直接引用类对象,而是只做类型说明,否则预览好好的,打包就挂了:
this.node.addComponent(ChildBundleComp)——错误方式;
this.node.addComponent(‘ChildBundleComp’) as ChildBundleComp——正确方式;

谢谢大佬!

你说的index.js 在哪里,我配置远程包remote文件夹里,怎么没有index.js?

打包,是指远程包么?我打的远程包中,怎么没有index.js文件,而且用loadBundle加载的话就报错,找不到index.js文件

我目前解决远程包里脚本组件报错的做法是,把脚本挂到全局,不要用import就可以了。

已经实现一个新建的空工程,加一个5行代码的自运行脚本,就可以跑任何游戏,而且不限平台,H5、Android、Ios只要loadBundle能读远程包的平台都有效。

但是3.8.4之前的版本,导出远程包AnimationClip会丢失,3.8.5修复了。

1赞

过来支持

image native构建完后bundle应该文件夹目录下面index.js或者index.xxx.js

本质是优先级没理顺,模块不清晰
我这边的做法是:首场景脚本(仅负责加载下个bundle)-> 公共脚本(一般是一个公共库) -> 数据层脚本 -> 资源数据加载脚本(通常与上一个脚本放在一个bundle) -> 游戏脚本

没有,一点都没有

资源文件夹配制成远程包。就一个.json 文件,其他的什么也没有。连图片都没有。这是哪门子的远程包。还有如果用小游戏分包,所有的资源都会被放到调用他的地方,用几次就会复制几次。这算哪门子优化呀。我不太明白,很疑惑

把资源做成一个bundle,代码做成一个bundle是吧。start-scene只有很少的内容。
然后你start-scene的脚本,会加载代码bundle,但是你不知道怎么使用这些代码?
start-scene的脚本,不能import别的代码,因为不在一个bundle,所以不知道怎么写?
你可以加载好代码bundle后,使用 this.node.addComponent(“代码名”),就能使用这个脚本了。然后这个脚本,就可以随便import任何脚本

整个项目的公共代码、资源、首场景,放在“首Bundle”里
然后每个页面一个Bundle,比如:
Loading页面的所有代码、资源一个bundle
封面的所有代码、资源一个Bundle
战斗页面的所有代码、资源一个Bundle
……
公共Bundle、每个页面单独的Bundle统统上传远程oss服务器
本地就一个自运行脚本,loadBundle加载“公共Bundle”,加载完loadScene首场景
然后公共Bundle里的代码会调用loadBundle加载Loading页面的Bundle
Loading页面里的代码会等Loading结束加载封面Bundle(假设Loading后面是封面)
依次类推,反正本地5行代码,啥也没有,任何平台都能运行任何游戏。

你们这个很麻烦,代码如果每个模块都要分bundle。那么使用起来很麻烦。A.ts 想要使用B.ts的函数,就非常麻烦。因为A,B不在一个Bundle,代码不能import 。一般代码放一个bundle,要启动游戏,就node.addComponent(“xx”)。xx就可以随便import其他代码

请问最后你是怎么解决的呢,目前我也有这个问题

其实在加载了bundle后可以使用 类似 require("…/…/ab/login/LoginCtrl").LoginCtrl 这样的导入,不使用import,这样在已知导入的情况 ,在后续引用的地方直接使用类名