自2.0版本起,Angular就已支持了AOT(Ahead-of-time)編譯,該功能在服務器端對代碼進行編譯,這可以免去標準的JIT(Just-in-time)方式每次都在瀏覽器運行時進行編譯的消耗,優化了客戶端的渲染速度及代碼的網絡傳輸效率。同時谷歌還推出了Angular-cli工具,進一步簡化了Angular項目的管理、編譯過程。
然而,在今年年初,有用戶指出在使用Angular-cli對大型項目進行AOT編譯時遇到內存溢出(OOM)的情況,導致編譯失敗。谷歌的Angular-cli工程師Hans表示,問題的原因是,在Angular-cli使用的Webpack插件中,路徑解析沒有很好地處理遞歸問題,從而導致大量內存占用,目前還沒有找到很好的解決方案。
Angular的AOT編譯會進行代碼靜態分析、無用代碼及依賴的剪枝、縮小代碼體積等一系列優化,這個過程勢必會消耗一定時間。該功能在帶來運行時性能提升的同時,拖慢了編譯速度,從而遭到不少用戶的吐槽。官方也建議,在開發過程中使用JIT的編譯方式,而只在正式發布時使用AOT編譯。
目前能夠暫時緩解內存溢出這一問題的方法是為其分配更多可用的內存,使編譯器能夠完成編譯,但這畢竟治標不治本,隨著項目的不斷增長,在可預見的將來還是會遇到同樣的問題。將獨立應用拆分成小型的模塊會是一個不錯的選擇,同時也有人提出投奔Vue、Ember或React等其他框架。
社區中已有不少用戶遇到了這個內存溢出的問題,并能夠成功將其重現,然而目前谷歌官方并沒有對該問題提出明確的解決方案,值得注意的是AngularDart并沒有出現類似情況。社區對該問題的出現產生了些許擔憂,Angular將來是否能很好地支持大型應用?谷歌最終會不會更傾向于推廣AngularDart?現在只能希望Angular在后續版本中針對該問題進行更好的性能優化。