當您觀察game欄位後,會發現這裡面的依賴順序一定是正確的,也就是說,當您執行egret build的時候,引擎內部分析您的項目代碼,生成了一份正確的依賴關係,並根據這份依賴關係來決定代碼的載入順序。這個功能使得開發者無需關心代碼的依賴順序,為開發者節省了很多用在檢查代碼依賴順序的時間(我在2013年開發白鷺引擎之前做HTML5遊戲的時候沒少因為這個問題各種坑) 。但是不幸的是,正是因為這個功能,導致了遊戲編譯速度在大型項目中比較緩慢,特別是在Windows筆記本設備中。
解決這個問題的關鍵在於,有沒有更好的方式去分析JavaScript(或者TypeScript) 的代碼依賴順序。在2014年白鷺引擎剛開發的時候答案是「沒有」,但是現在情況已經不一樣了,我們有了新的語法標準:ECMAScript 2015 Modules, 以及一個強大的社區驅動的工具:webpack。
如果您將上述代碼放在一個現代瀏覽器(比如Chrome)中,會發現即使只載入 b.js,他也會在執行前優先去載入 a.js,為了實現該功能,您需要修改兩處邏輯:
1、在 a.js 中將一個類標記為exports;
2、在 b.js 中在使用 A 之前添加一句import。
當然,上述代碼在TypeScript中也是完全一樣的,畢竟TypeScript是JavaScript的超集。
雖然上述代碼在現代瀏覽器上可以順利執行,但是開發一款HTML5遊戲必須考慮瀏覽器兼容性問題(從2018年開始還需要額外再考慮一下「小遊戲平臺兼容性問題」),所以這種寫法肯定是不能直接運行在全部設備上,好在我們還有一個名為webpack的工具,他可以幫助我們將上述代碼編譯成一個可以運行在所有瀏覽器中的單一文件。
當採用了ES2015+webpack後,白鷺引擎編譯器再也不需要計算依賴,只需要專註的執行TypeScript到JavaScript的代碼編譯即可,剔除這個步驟,再加上一些其他方面的零敲碎打的優化,編譯性能就得到了20倍的提升。
在這個過程中有一些事項需要和開發者說明:
首先,經過我們的測試,這項優化是在越大的項目提升越明顯,小型項目的提升只有兩三倍,而我們目前支持的正在開發中的重度遊戲(450個TypeScript文件,8萬行代碼,編譯後體積 1.5mb)提升有20倍,我們預計這個項目在正式完成上線後,隨著代碼量繼續膨脹,提升會更為明顯。
其次,開發者會發現,採用新方式會要求您修改現有所有代碼,為其添加import與 export,這可能對您的項目是一個巨大的工作量。好在我們為此開發了一個腳本,可以為您的項目自動添加import和export, 由於這個腳本是為我們作為對比參照的重度遊戲項目定製開發的,所以很難適配所有情況,這意味著我們無法實現將所有白鷺引擎製作的項目「一鍵升級」到新的方式,但是如果您希望在持續維護的項目中使用這項功能的話,我們可以有針對性的根據您的項目開發定製升級腳本(這將作為白鷺團隊引擎重度遊戲解決方案的一部分),如果您擔心風險過大,我們推薦您在新項目或者尚未上線的項目中使用 Egret Pro 的新編譯器。
再次,由於webpack本身配置量非常複雜,以及webpack每個大版本都有非常恐怖的不向下兼容的改動,再加上白鷺引擎團隊定製修改了TypeScript編譯器等諸多原因,雖然EgretPro的底層採用了webpack,但是我們不會將其暴露給開發者,所有的webpack配置都是按照白鷺引擎的規範硬編碼在編譯器中,暫不允許開發者自由擴展。
最後,import 語法在最新的 VSCode 中是可以自動生成的,開發者無需擔心新的編寫方式需要額外手工編寫許多import代碼,所以我們建議開發者使用 VSCode 編寫遊戲邏輯,並在白鷺新推出的Egret UI Editor或者Egret Wing中編輯皮膚。
以上就是 Egret Pro 帶來的20倍編譯速度提升背後的技術原理,Egret Pro將於下週三發布,感謝各位開發者一如既往對白鷺引擎的支持,幫助開發者提升開發效率是白鷺引擎團隊一如既往的使命。我們非常有自信這一次的編譯速度提升可以每天為您至少節省一個小時,把更多的時間用在有創造性的工作以及陪伴家人與朋友上。
推薦閱讀: