1. 程式人生 > >為什麽說 Babel 將推動 JavaScript 的發展【轉】

為什麽說 Babel 將推動 JavaScript 的發展【轉】

哪些 code 次數 提升 ebo 集成 www www. 試驗場

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 的發展【轉】