1. 程式人生 > >為什麽說Babel[?be?bl]將推動JavaScript的發展

為什麽說Babel[?be?bl]將推動JavaScript的發展

自定義 復制 創始人 規範 類型 無法 控制 合並 性能

  Babel是一個轉換編譯器,它能將ES6轉換成可以在瀏覽器中運行的代碼。Babel由來自澳大利亞的開發者Sebastian McKenzie創建。他的目標是使Babel可以處理ES6的所有新語法,並為它內置了React JSX擴展及Flow類型註解支持。
據codemix創始人Charles Pick介紹,Babel是所有ES6轉換編譯器中與ES6規範兼容度最高的,甚至超過了谷歌創建已久的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的發展