事实上,在开发中我们很少直接去接触babel,但是babel对于前端开发来说,目前是不可缺少的一部分:开发中,我们想要使用ES6+的语法,想要使用TypeScript,开发React项目,它们都是离不开Babel的;
Babel是一个工具链,主要用于旧浏览器或者缓解中将ECMAScript 2015+代码转换为向后兼容版本的JavaScript;
包括:语法转换、源代码转换、Polyfill实现目标缓解缺少的功能等;
babel本身可以作为一个独立的工具(和postcss一样),不和webpack等构建工具配置来单独使用。
如果我们希望在命令行尝试使用babel,需要安装如下库:
使用babel来处理我们的源代码:
比如我们需要转换箭头函数,那么我们就可以使用箭头函数转换相关的插件:
npm install @babel/plugin-transform-arrow-functions -D
npx babel src --out-dir dist --plugins=@babel/plugin-transform-arrow-functions
查看转换后的结果:我们会发现 const 并没有转成 var
npm install @babel/plugin-transform-block-scoping -D
npx babel src --out-dir dist --plugins=@babel/plugin-transform-block-scoping,@babel/plugin-transform-arrow-functions
Babel的预设preset
但是如果要转换的内容过多,一个个设置是比较麻烦的,我们可以使用预设(preset):
npm install @babel/preset-env -D
执行如下命令:
babel是如何做到将我们的一段代码(ES6、TypeScript、React)转成另外一段代码(ES5)的呢?
从一种源代码(原生语言)转换成另一种源代码(目标语言),这是什么的工作呢?就是编译器,事实上我们可以将babel看成就是一个编译器。Babel编译器的作用就是将我们的源代码,转换成浏览器可以直接识别的另外一段源代码;
Babel也拥有编译器的工作流程:
当然,这只是一个简化版的编译器工具流程,在每个阶段又会有自己具体的工作:
在实际开发中,我们通常会在构建工具中通过配置babel来对其进行使用的,比如在webpack中。
npm install babel-loader @babel/core
我们可以设置一个规则,在加载js文件时,使用我们的babel
我们必须指定使用的插件才会生效
如果我们一个个去安装使用插件,那么需要手动来管理大量的babel插件,我们可以直接给webpack提供一个preset,webpack会根据我们的预设来加载对应的插件列表,并且将其传递给babel
比如常见的预设有三个:
安装preset-env:npm install @babel/preset-env
我们最终打包的JavaScript代码,是需要跑在目标浏览器上的,那么如何告知babel我们的目标浏览器呢?
之前我们项目中已经使用了browserslist工具,我们可以对比一下不同的配置,打包的区别:
我们也可以通过targets来进行配置
那么,如果两个同时配置了,哪一个会生效呢?
配置的targets属性会覆盖browserslist;但是在开发中,更推荐通过browserslist来配置,因为类似于postcss工具,也会使用browserslist,进行统一浏览器的适配;
要了解Stage-X,我们需要先了解一下TC39的组织:
TC39 遵循的原则是:分阶段加入不同的语言特性,新流程涉及四个不同的 Stage
在babel7之前(比如babel6中),我们会经常看到这种设置方式:
它表达的含义是使用对应的 babel-preset-stage-x 预设;但是从babel7开始,已经不建议使用了,建议使用preset-env来设置;
像之前一样,我们可以将babel的配置信息放到一个独立的文件中,babel给我们提供了两种配置文件的编写:
为什么时候会用到polyfill呢?
babel7.4.0之前,可以使用 @babel/polyfill的包,但是该包现在已经不推荐使用了:
babel7.4.0之后,可以通过单独引入core-js和regenerator-runtime来完成polyfill的使用:npm install core-js regenerator-runtime --save