背景
我们是不是习惯将一些常用的东西都归纳总结起来,做成一个框架,方便后续项目的复用,形成自己的“框架”,但是随着时间的迁移,这个框架会越来越“臃肿”,那我们有什么办法解决这个问题呢?
方案
一般针对这种情况,各种编辑器会有两种做法
直接剔除“无用”资源
无用的意思是编辑器检测到没有“引用”,比如CocosCreator(后面称CC)对非动态引用的资源剔除方案,比如AndroidStuiod(后面称AS)的shrinkResources
配置。
[PS1: 因为Cocos打包后的资源都不是通过Android本身直接引用的,所以这个字段在Cocos的安卓工程中应该要配置为false)。]
值得注意的是,AS中的代码混淆(minifyEnabled),不但会混淆方法,而且也会将无用的代码剔除,所以如果是通过反射调用的代码,我们也要进行混淆剔除。
[PS2: 比如在CocosCreator 中用callStaticMethod方法通过反射方式js调用java代码,那么我们要么不启用混淆,要么将混淆的方法写到proguard-rules.pro
文件中]
通过宏来剔除代码
这类比较常见在c++、oc语言中,比如iOS工程在XCode中,通过Preprocessor Macros
设置宏。
因为CC已经支持资源剔除了,那么,代码上我们有什么办法剔除呢?从方案来讲,如果使用方案一,感觉更省力,但是考虑js的特性,很难做到这种效果,那么CC是怎么做的呢?
CocosCreator的方案
是的,CC选择的是宏的方式,这种方式与webpack其实是一致的,但是在CC3.0以前,只有官方内置的宏(主要是平台宏),其实是无法满足我们的需求的,但是在CC3.x,开放了自定义宏的方式,这种对我们就简单多了,下面介绍CC的使用方式
步骤一
从顶部项目菜单打开项目设置,选择宏配置,然后添加自定义宏,比如我定义一个宏为CUSTOM_TEST,如果要启用该宏,打钩即可。如下
步骤二
在代码中,用ifelse判断即可,编译时编辑器会自动剔除代码。如下
import { _decorator, Component, Node } from 'cc';
import { CUSTOM_TEST } from 'cc/userland/macro';
const { ccclass, property } = _decorator;
@ccclass('Test')
export class Test extends Component {
start() {
if (CUSTOM_TEST) {
// TODO 宏开启要做的事
} else {
// TODO 宏关闭要做的事
}
}
}
这样就结束了~
[PS3: CC的宏配置保存在settings/v2/packages/engine.json文件的macroCustom字段中,可以写个插件控制该字段]
结尾
本次分享的功能极其简单,只是在相关技术群讨论时,感觉很多人还没用过甚至不知道,所以分享出来
[PS4: 3.8.2 以前可能存在问题, 3.8.2 已经修复]
[PS5: 感谢麒麟子大佬取的标题]