為什麽說 Babel 將推動 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 應用和發展的主要動力。
轉自:https://www.infoq.cn/article/2015%2F05%2FES6-TypeScript
為什麽說 Babel 將推動 JavaScript 的發展【轉】