爲何說 Babel 將推進 JavaScript 的發展【轉】

Babel是一個轉換編譯器,它能將 ES6 轉換成能夠在瀏覽器中運行的代碼。Babel 由來自澳大利亞的開發者Sebastian McKenzie建立。他的目標是使 Babel 能夠處理 ES6 的全部新語法,併爲它內置了React JSX 擴展及Flow類型註解支持。php

codemix創始人Charles Pick介紹,Babel 是全部 ES6 轉換編譯器中與 ES6 規範兼容度最高的,甚至超過了谷歌建立已久的Traceur編譯器。Babel 容許開發者使用 ES6 的全部新特性,並且不會影響與老版本瀏覽器的兼容性。此外,它還支持許多不一樣的構建 & 測試系統,使開發者很容易將它集成到本身的工具鏈中。node

Charles 認爲,Babel 從根本上講是一個平臺,這是它與 compile-to-JS 語言CoffeeScriptTypeScript最大的不一樣。Babel 的插件系統容許開發者自定義代碼轉換器並插入到編譯過程。這些轉換器會接收一棵抽象語法樹,並在代碼轉換成可執行的 JavaScript 以前對其進行操做。codemix 已經嘗試開發了靜態 & 運行時類型檢查閉包消除JavaScript「健康宏(hygienic macros)」等插件。react

Babel 不只跟蹤 ES6 的進展狀況,並且仍是 ES7 或 ES2016 的試驗場。好比,它已經支持async/await,使開發者更容易編寫異步 JavaScript 代碼,並且與使用回調或 Promises 相比,代碼更簡潔易懂。雖然主流瀏覽器可能還須要幾年的時間才能支持這種異步 JavaScript 代碼編寫方式,但 Babel 使開發者如今就能夠用上它。這得益於 Babel 與 JavaScript 技術委員會(TC39)保持着高度一致,可以在 ECMAScript 新特性標準化以前爲開發者提供現實世界可用的實現。而同時,這也有利於 JavaScript 的進一步發展,由於其團隊能夠在 ECMAScript 規範最後定稿前就得到來自現實世界的反饋。git

Babel 還能提高 JavaScript 的執行速度。因爲 JavaScript 文件加載和執行速度慢會嚴重影響用戶體驗,因此 JIT 沒有時間在運行時執行全部技術上可行的優化。相比之下,Babel 是在編譯時運行,沒有這麼嚴格的時間限制。藉助強大的做用域跟蹤和類型推斷功能及插件系統,開發者能夠構建轉換器來執行此類優化,好比上文提到的閉包消除能夠將閉包轉換成日常的函數。Babel 自己也內置了一些優化,好比經過utility.deadCodeElimination轉換器執行常量合併 / 常量傳播。在接下來的幾個月裏,咱們還有望看到以下插件:es6

  • 任意函數內聯:將函數內聯至調用點,實現性能最大化,避免多態和函數調用開銷;
  • 函數複製:在 JavaScript 中,多態是致使代碼執行慢的一個常見緣由。所以,在函數沒法內聯的地方,應該生成一個函數副本,確保函數保持單態;
  • 循環內不變代碼外提:將循環體內不變的代碼移至循環體外;
  • 循環展開:若是循環次數 N 固定,則移除循環,將循環體複製 N 份。

codemix 後續將發佈多個執行此類優化的插件,感興趣的讀者能夠聯繫他們或者關注其Twitter。關於 JavaScript 引擎能夠作哪些不一樣的優化,能夠查看這裏github

Babel 插件並侷限於性能提高,好比,還能夠作下面這些事情:typescript

  • i18n/ 翻譯轉換器:翻譯特定字符串並替換;
  • 自定義日誌系統:經過環境變量設置日誌級別,控制日誌粒度;
  • 面向可選模板系統(如 Mustache 或 Handlebars)的編譯時轉換器:將標籤模板字符串直接轉換成 JavaScript 代碼;
  • 文檔生成器:利用 Flow 類型註解和類型推斷生成文檔。

上述插件,有一部分已經實現npm

總之,Charles 認爲,Babel 是一款優秀的軟件,必將成爲每一個 Web 開發者工具箱的一部分,而做爲 ECMAScript 的試驗場,它在不遠的未來極可能會成爲推進 ES6 和 ESNext 應用和發展的主要動力。瀏覽器

 

轉自:https://www.infoq.cn/article/2015%2F05%2FES6-TypeScriptbabel

相關文章
相關標籤/搜索