耗时近2年,JavaScript编译器Babel 7登场

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发展。