演示Demo:https://gitee.com/szrpf/GlobalModuleDemo
打开Demo,运行场景HelloWorld,控制台打印结果:
打开HelloWorld.ts可以发现,aa无需导入就可以在任意脚本中使用
挂在aa下面的属性和方法就是全局的
打开Global/Base.ts
Audio.ts 和 Palette.ts同理,可以类比全局的音频模块和全局的自定义组件
Q:为什么属性和方法可以扩展到全局
A:globalThis是全局对象,aa挂在globalThis下面就成为全局对象
aa的属性和方法,就可以通过aa来访问,类似2.x的cc
Q:为什么要declare global,并将aa声明成module
A:declare global的作用是告诉ts,globalThis里有哪些属性和方法
aa只是一个对象,但declare global里将aa伪装成module,这样ts里可以把aa当module用
Q:为什么要用globalThis,而不是window
A:↓↓↓deepseek的答案↓↓↓
Q:为什么要用aa,是否可以换别的名字
A:可以换任意名字,也可以声明任意数量的全局module
但个人喜欢极简,就像2.x的cc一个足够了
Q:跟全局单例比,全局module的优势
A:1、挂在全局单例下的enum、类无法作为类型声明,这样会失去类型提示
例如:let pal: aa.Palette = labelNode.addComponent(aa.Palette);
如果aa只是个单例,那么aa.Palette无法作为pal的类型声明
2、全局单例的属性和方法必须写在一个文件中,想在其他文件中扩展很困难
全局module可以在任意文件中扩展,并在任意文件中访问里面的所有内容
3、全局单例需要导入,而全局module不需要,甚至不需要编写.d.ts文件
如果全局组件脚本放在远程bundle中,import会有异常,但是全局module无需import就不存在这个隐患
综上,全局module是最优解
加油






Gitee地址:https://gitee.com/szrpf
EMail地址:27185709@qq.com
推荐链接:
1、CocosCreator3.x框架——音频声音模块(无需导入、无需常驻节点)
2、CocosCreator3.x框架——节点扩展(仿2.x风格直接设置属性、渐变色、振动、实时销毁)
2、【包教包会】CocosCreator Assembler经典案例第一期——2D实现3D透视翻转(附Demo源码)
3、【包教包会】对CocosCreator富文本RichText进行全面优化
5、权重随机算法,解决游戏中一切可控随机(刷怪、掉宝、转盘、抽卡等等)






