耗时3年,JS编译器Babel 7发布,每月在npm有1700万次下载!
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有1700万次下载,主要框架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发展。