Creator 3D的这个引擎bug很久了,官方真的解决不了吗

就是多个个脚本相互调用会出问题
看下面截图
1.

多个脚本互相调用属性面板出错是一个问题,有时整个项目都跑不起来

这个叫循环引用

项目代码多的时候根本避免不了,cocos2d循环调用就没多大问题

循环引用问题从设计上来说是可以避免的,互相引用确实不太好。
不过你要这么使用的话,可以参考这个解决方案:

循环引用在 JS 中一般不会出现问题,但是在 TS 中,TSC 和 Babel compiler 遇到类似的情形都会导致无法解析部分类型。不过目前引起循环引用的主要原因还是你展示的 @property 导致的,我们在研究如何解决,需要一些时间来确定最佳的解决方案。

大佬啊,上面那个还是小事,挂载不了对象我还可以通过其它方式获取对象。
但是下面这个问题就太杀人诛心了
看以下截图
1.

附上测试项目
TestPrj.rar (696.9 KB)

总结问题关键是枚举Test1_Type是声明在脚本Test1内部的。如果是声明在外部的独立脚本里就没事。还有,如果在Test2里声明属性,不添加@property({type:Enum(Test1_Type)})这行也是没事的。Test1只调用Test2也是只会在编辑器控制台报模块加载失败的异常,运行还是没错。如果随便调用项目里的第三方类,运行就一定报异常了,为什么引用第三方类就暴雷,还搞不明白,因为和这两个类毫无瓜葛。

这个问题害得我搞了一整天,从几十个脚本里慢慢删除排查最后才发现了这个错误规律,这问题太杀人了,要是项目的脚本有一百多个问题就没法查了。你们好好重视这个问题吧

我觉得,循环引用这个问题,的确有些麻烦,如果习惯不好的话。
解决问题的办法就是不循环引用,优化你的脚本引用结构

用Rollup吧,编码逻辑是ES6,但能输出CommonJS(分散或打包输出都可以),还可以不给模块名加_1导致调试不爽。L家的用了这个,很好用。

所有的技术试验我都是试验过的。不是吹牛的,真的好用。

不对,不能用CommonJS输出,一旦用CommonJS输出就加了_1,用ES6,分散输出,调试不成问题。发布时有需要就用CommonJS

这得去掉修饰器@property,这个修饰器在js load就生效,无法在module load生效。可以考虑
a:cc.Node
a_property: {typeinfo}
丑是丑点,保证不会出错。

可以自动化修改实现,现在的代码不变,通过自动化工具去掉修饰器修改成额外信息。

感谢建议,我们用了 rollup,问题的核心还是 @property 造成的解释期依赖,确实有一些办法可以解决,比如直接使用字符串作为 property type,但是我们还是希望找到更完美,对用户无损的方案。

期待官方彻底修复这个问题,还好我现在还没正式开始做3D的项目,目前只是尝试阶段。

循环引用不是Creator所能解决的,js本身就如此。rollup也并不能解决循环引用问题。最好的做法是好好设计你的代码,避免全局作用域下的循环引用。至于函数体内的循环引用,是完全可以的。