【包教包会】CocosCreator3.x全局单例最优解
演示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实战案例——100行代码的追踪导弹Demo
3、CocosCreator3.x框架——多分辨率屏幕适配、横竖屏翻转
3、CocosCreator3.x框架——音频声音模块(无需导入、无需常驻节点)
4、2D图片实现3D透视效果(支持3.x、支持原生、可合批)
5、CocosCreator3.x图片和文字渐变色(支持3.x、支持原生、可合批)
6、CocosCreator3.x——拖尾(支持3.x、支持原生、可合批、高性能)