【包教包会】3.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是最优解

加油:sunglasses::sunglasses::sunglasses::sunglasses::sunglasses::sunglasses::sunglasses:

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、权重随机算法,解决游戏中一切可控随机(刷怪、掉宝、转盘、抽卡等等)

mi

6赞

还需要确保加载顺序

除了@property(aa.Palette)
这种写法会存在未加载的可能性,其他都不存在顺序问题

高效、高产 :smiley:

不一定哦,比如在类似代码处于bundle中的时候,这时候跟就bundle的加载顺序强相关。

其实我的做法也是这样的,就是相关的类库bundle要确保首先加载

其实挂在全局下的就算主包了,分包的不挂上去也行,或者分包算分包的

是的,既然放远程bundle包了,越底层越先加载

和我的ikun框架一样 都是 aa, https://github.com/iwae/coinGame
image

既然是ikun框架,为什么不用ikun……

AAAikun

我也是设置一个无需引入的全局变量管理类,然后将所有工具模块放在这个管理类中。
然后整个框架的入口就是这个管理模块了,超级方便,有脚本提示,还不需要引入。
只是我的写法和你不一样,我是直接将这个管理类设置成全局的,不需要写额外提示声明。

大家都有一个自己的cc :joy:

这个方案我以前用过,存在帖子里提到的瓶颈,所以改成module方案了

我看你写的那3点对比
第1点确实是无法作为类型声明,这种情况下我都是直接引入引入声明的,这一点确实不太方便。
第2点的话,确实也会如此,但是我个人的想法是,既然已经弄了全局单例,如果需要将属性和方法拆开写的需求,那其实可以弄多个单例,这没有什么影响。
第3点我就不认同了,既然是全局单例,肯定是不需要引入,直接就能使用的,没有循环引入的问题,而且也不需要编写.d.ts文件,直接就有提示。不然弄全局单例等于本末倒置了。

我的全局单例写法是在脚本类的后面,将该类直接声明为全局单例。

全局单例问题很多: 状态追踪,状态更新,响应式更新,并发安全,性能优化等。