標籤:href char 系統 超過 web開發 pes 抽象 翻譯 https
Babel是一個轉換編譯器,它能將ES6轉換成可以在瀏覽器中啟動並執行代碼。Babel由來自澳大利亞的開發人員Sebastian McKenzie建立。他的目標是使Babel可以處理ES6的所有新文法,並為它內建了React JSX擴充及Flow類型註解支援。
據codemix創始人Charles Pick介紹,Babel是所有ES6轉換編譯器中與ES6規範相容度最高的,甚至超過了Google建立已久的Traceur編譯器。Babel允許開發人員使用ES6的所有新特性,而且不會影響與老版本瀏覽器的相容性。此外,它還支援許多不同的構建&測試系統,使開發人員很容易將它整合到自己的工具鏈中。
Charles認為,Babel從根本上講是一個平台,這是它與compile-to-JS語言CoffeeScript和TypeScript最大的不同。Babel的外掛程式系統允許開發人員自訂代碼轉換器並插入到編譯過程。這些轉換器會接收一棵抽象文法樹,並在代碼轉換成可執行檔JavaScript之前對其進行操作。codemix已經嘗試開發了靜態&運行時類型檢查、閉包消除、JavaScript“健康宏(hygienic macros)”等外掛程式。
Babel不僅跟蹤ES6的進展情況,而且還是ES7或ES2016的實驗場。比如,它已經支援async/await, 使開發人員更容易編寫非同步JavaScript代碼,而且與使用回調或Promises相比,代碼更簡潔易懂。雖然主流瀏覽器可能還需要幾年的時間才能支援 這種非同步JavaScript代碼編寫方式,但Babel使開發人員現在就可以用上它。這得益於Babel與JavaScript技術委員會(TC39)保持著高度一致,能夠在ECMAScript新特性標準化之前為開發人員提供現實世界可用的實現。而同時,這也有利於JavaScript的進一步發展,因為其團隊可以在ECMAScript規範最後定稿前就獲得來自現實世界的反饋。
Babel還能提升JavaScript的執行速度。由於JavaScript 檔案載入和執行速度慢會嚴重影響使用者體驗,所以JIT沒有時間在運行時執行所有技術上可行的最佳化。相比之下,Babel是在編譯時間運行,沒有這麼嚴格的時 間限制。藉助強大的範圍跟蹤和類型推斷功能及外掛程式系統,開發人員可以構建轉換器來執行此類最佳化,比如上文提到的閉包消除可以將閉包轉換成平常的函數。 Babel本身也內建了一些最佳化,比如通過utility.deadCodeElimination轉換器執行常量合并/常量傳播。在接下來的幾個月裡,我們還有望看到如下外掛程式:
任意函數內聯:將函數內聯至調用點,實現效能最大化,避免多態和函數調用開銷;
函數複製:在JavaScript中,多態是導致代碼執行慢的一個常見原因。因此,在函數無法內聯的地方,應該產生一個函數副本,確保函數保持單態;
迴圈內不變代碼外提:將迴圈體內不變的代碼移至迴圈體外;
迴圈展開:如果迴圈次數N固定,則移除迴圈,將迴圈體複製N份。
codemix後續將發布多個執行此類最佳化的外掛程式,感興趣的讀者可以聯絡他們或者關注其Twitter。關於JavaScript引擎可以做哪些不同的最佳化,可以查看這裡。
Babel外掛程式並局限於效能提升,比如,還可以做下面這些事情:
i18n/翻譯轉換器:翻譯特定字串並替換;
自訂日誌系統:通過環境變數設定記錄層級,控制日誌粒度;
面向可選模板系統(如Mustache或Handlebars)的編譯時間轉換器:將標籤模板字串直接轉換成JavaScript代碼;
文檔產生器:利用Flow類型註解和類型推斷產生文檔。
上述外掛程式,有一部分已經實現。
總之,Charles認為,Babel是一款優秀的軟體,必將成為每個Web開發人員工具箱的一部分,而作為ECMAScript的實驗場,它在不遠的將來很可能會成為推動ES6和ESNext應用和發展的主要動力。
為什麼說Babel[?be?bl]將推動JavaScript的發展