JavaScript編譯器Babel,在上一個版本Babel 6發布3年後,終於釋出了新的版本Babel 7。這次的更新除了加入了PeerDependency等新功能外,移除了年度套件集(Yearly Preset)以及階段套件集(Stage Preset),並且不再支援舊版本Node,以更新本身相依工具。

Babel是一個工具鏈,主要用於將ECMAScript 2015+程式碼轉成支援新舊瀏覽器的向後相容JavaScript。不像伺服器語言,由於瀏覽器版本太多種,客戶端通常沒有辦法保證使用者的JavaScript執行結果都是相同的,這樣的情況在舊版本的Internet Explorer特別嚴重。當開發者想要使用新語法像是class A {},則會在舊的瀏覽器上因為語法錯誤而獲得空白的畫面。

Babel則提供開發人員能夠使用新語法,但同時做到對舊瀏覽器向後相容的方法,就class A {}這個例子來說,Babel能夠將語法轉為var A = function A(){}。由於Babel能夠轉換JavaScript程式碼,又可以實現新功能,因此Babel也成為JavaScript制訂委員會TC39和社群,在語言以及功能發展上的溝通橋梁。

Babel在GitHub上,目前存在130萬個相依程式碼儲存庫,每月在npm有1,700萬次下載,主要框架React、Vue、Ember、Polymer,或是Wordpress等工具都看的到Babel身影,而Facebook、Netflix和Airbnb等企業也都有採用,許多JavaScript開發者可能都在不知情的狀況下使用Babel,Babel已經可以說是JavaScript開發的基礎。

而這次Babel 7更新部分非常多,不少還是變革性的改變,官方列出了主要6項重大更新。首先,由於這次Babel版本更新有大幅的變化,因此官方決定放棄支援較舊的Node版本,包括不再維護的Node.js 0.10、0.12、4與5,來對Babel本身程式碼庫進行改進,並且升級相依專案和工具,諸如ESLint、Yarn、Jest和Lerna等。

再來,透過切換使用範圍(Scoped)套件,將官方的移至@babel命名空間。而這能幫忙使用者區分官方的套件,因此過去babel-core用法,現在則使用@babel/core,babel-cli改成@babel/cli,而babel-preset-env也應改用@babel/preset-env。過去範圍套件並沒有被廣泛使用,許多開發者甚至不知道範圍套件的存在,而現在搜尋範圍套件的問題已經解決,下載計數器運作正常,只剩下部分第三方註冊管理服務不支援,官方認為,沒有理由等待這些服務。

第三項重大改變,Babel 7移除了並停止發布任何年度套件集,像是帶有年分的preset-es2015套件集,因為@babel/preset-env就能取代這些需求,其包含了所有年度增加的內容,以及針對特定瀏覽器集的支援能力。babel-preset-env是一個存在已久的預設值,但可以用來取代開發者需要的es2015、es2016、es2017或es20xx這類套件集。另外,第四、這版也拋棄了Stage套件集,像是@babel/preset-stage-0。

第五、重新命名部分的套件,現在任何TC39提議的插件都使用-proposal關鍵字而非-transform,因此過去@babel/plugin-transform-class-properties現在要改成@babel/plugin-proposal-class-properties。

最後一項重要更新,現在Babel 7對@babel/core中的所有插件、套件集和頂級套件,引入同儕相依功能PeerDependency。PeerDependency是程式碼預期使用的相依性,而非作為實作細節的相依專案。由於babel-loader原本就具有babel-core上的PeerDependency,所以這項改變只是將命名空間改為@babel/core,讓使用者不會在錯誤的Babel版本安裝這些套件。而對於那些已經在babel-core上存在PeerDependency,但還不想要有重大變更的工具,官方也已經發布了一個新版本的babel-core,來幫忙開發者過渡更新。

官方提到,Babel這次的更新都來自於社群的貢獻,即便Babel被廣泛的利用,卻沒有充足的資源好好發展,雖然大家使用開源資源似乎理所當然,但也應該考慮背後維護開源專案的人,沒有資源的開源專案不會健康,因此呼籲社群可以貢獻時間或是金錢,維持Babel發展。


Advertisement

更多 iThome相關內容