引擎如何處理js腳本
舉例一個js腳本來剖析到底引擎都會我們編寫的腳本做了什么工作
腳本源碼為:
引擎在run過程中,會加載所有的js腳本
這里出現(xiàn)了nodejs里面經(jīng)常提到的module.exports,
?
可以看到腳本源碼被cc._RF進行了封裝處理,而module.func來源自cc.registerModuleFunc()
換而言之,我們寫的腳本源碼其實在引擎run的過程,都會被執(zhí)行一遍,function在js中也被認為是一個變量,所以,我們可以進一步驗證我們的猜想,我們增加了如下代碼
如果不出意外,那么TestFunc肯定是在第一個scene啟動之前就執(zhí)行了,也許你能得到一點啟發(fā),但是這種寫法,不建議濫用
module.exprots / require
我們在使用腳本的時候,經(jīng)常會使用require("ScriptName")來引入我們的組件腳本,那么require到底做了什么呢?追查源碼發(fā)現(xiàn),最終是在調(diào)用cc.require()
很熟悉的func,但是我們可以看到有m.module的判斷,這個func是啥呢
也是之前很熟悉的代碼,就是能執(zhí)行我們js腳本的一個function,更多細節(jié)就不再說啦,可以仔細翻看源碼
下邊重點說說module.exports,這個東西其實是nodejs的一個設(shè)計思想,詳細參考資料看這里
簡而言之,每個node模塊,都可以理解為一個單例,一單程序加載,是永久暫留到內(nèi)存中的
那么new是怎么回事呢?為什么cc.Class要new呢?其實cc.Class返回的是function,至于在js中
new function(){
}
可以參考這篇文章: https://www.cnblogs.com/pizitai/p/6427433.html
那么require又干了什么事情呢?
可能這張圖就有點復(fù)雜了,不過能幫助你真正理解require
可以看到editor環(huán)境代碼其實和runtime環(huán)境代碼是在一起的,用CC_EDITOR作了區(qū)分
總結(jié)
- 以下情況建議這么編碼:
- 該腳本和界面無關(guān)
- 單純的邏輯腳本
- 單例模式
那么這樣也是可以在任何地方直接使用cc.moduleA,因為run()的過程,已經(jīng)正確加載了模塊cc.moduleA = module.exports ={ propertyA:1, }
- 和界面有關(guān)的腳本建議使用cc.Class(),因為本身cc.Class()和引擎的關(guān)系更密切