引擎如何处理js脚本
举例一个js脚本来剖析到底引擎都会我们编写的脚本做了什么工作
脚本源码为:
引擎在run过程中,会加载所有的js脚本
这里出现了nodejs里面经常提到的module.exports,
可以看到脚本源码被cc._RF进行了封装处理,而module.func来源自cc.registerModuleFunc()

换而言之,我们写的脚本源码其实在引擎run的过程,都会被执行一遍,function在js中也被认为是一个变量,所以,我们可以进一步验证我们的猜想,我们增加了如下代码


如果不出意外,那么TestFunc肯定是在第一个scene启动之前就执行了,也许你能得到一点启发,但是这种写法,不建议滥用
module.exprots / require
我们在使用脚本的时候,经常会使用require("ScriptName")来引入我们的组件脚本,那么require到底做了什么呢?追查源码发现,最终是在调用cc.require()

很熟悉的func,但是我们可以看到有m.module的判断,这个func是啥呢

也是之前很熟悉的代码,就是能执行我们js脚本的一个function,更多细节就不再说啦,可以仔细翻看源码
下边重点说说module.exports,这个东西其实是nodejs的一个设计思想,详细参考资料看这里
简而言之,每个node模块,都可以理解为一个单例,一单程序加载,是永久暂留到内存中的
那么new是怎么回事呢?为什么cc.Class要new呢?其实cc.Class返回的是function,至于在js中
new function(){
}
可以参考这篇文章: https://www.cnblogs.com/pizitai/p/6427433.html
那么require又干了什么事情呢?
可能这张图就有点复杂了,不过能帮助你真正理解require

可以看到editor环境代码其实和runtime环境代码是在一起的,用CC_EDITOR作了区分
总结
- 以下情况建议这么编码:
- 该脚本和界面无关
- 单纯的逻辑脚本
- 单例模式
那么这样也是可以在任何地方直接使用cc.moduleA,因为run()的过程,已经正确加载了模块cc.moduleA = module.exports ={ propertyA:1, }
- 和界面有关的脚本建议使用cc.Class(),因为本身cc.Class()和引擎的关系更密切
网友评论