Babel是一个工具链,主要用于旧浏览器或者缓解中将ECMAScript 2015+代码转换为向后兼容版本的JavaScript;
babel本身可以作为一个独立的工具(和postcss一样),不和webpack等构建工具配置来单独使用babel,需要安装如下库:@babel/core:babel的核心代码,必须安装;@babel/cli:可以让我们在命令行使用babel;yarn add @babel/cli @babel/corenpx babel src --out-dir distconst fn = () => { console.log(11111); }yarn add @babel/plugin-transform-arrow-functionsnpx babel index.js --out-file dist.js --plugins=@babel/plugin-transform-arrow-functionsnpx babel src --out-dir dist --plugins=@babel/plugin-transform-arrow-functionsyarn add @babel/plugin-transform-block-scopingnpx babel src --out-dir dist --plugins=@babel/plugin-transform-block-scoping,@babel/plugin-transform-arrow-functionsyarn add @babel/preset-env -Dnpx babel src --out-dir dist --presets=@babel/preset-env目录结构
index.js内容const fn = () => { console.log(11111); }
package.json
zanlan.config.js内容,有一下版本
只是处理箭头函数和const,则
如果想要更多,就使用预设
如果想把配置放入单独的文件内,则需要新建babel.config.js,内容为
对应的zanlan.config.js
postcss也用到过.browserslistrc,为了共用一套,都写在该文件下
.browserslistrc,这样postcss也是一直使用老的babel会使用

要了解Stage-X,我们需要先了解一下TC39的组织:
TC39 遵循的原则是:分阶段加入不同的语言特性,新流程涉及四个不同的 Stage
Stage 0:strawman(稻草人),任何尚未提交作为正式提案的讨论、想法变更或者补充都被认为是第 0 阶段的"稻草人";Stage 1:proposal(提议),提案已经被正式化,并期望解决此问题,还需要观察与其他提案的相互影响;Stage 2:draft(草稿),Stage 2 的提案应提供规范初稿、草稿。此时,语言的实现者开始观察 runtime 的具体实现是否合理;Stage 3:candidate(候补),Stage 3 提案是建议的候选提案。在这个高级阶段,规范的编辑人员和评审人员必须在最终规范上签字。Stage 3 的提案不会有太大的改变,在对外发布之前只是修正一些问题;Stage 4:finished(完成),进入 Stage 4 的提案将包含在 ECMAScript 的下一个修订版中;在babel7之前(比如babel6中),我们会经常看到这种设置方式:
它表达的含义是使用对应的 babel-preset-stage-x 预设;
但是从babel7开始,已经不建议使用了,建议使用preset-env来设置;


babel.config.json(或者.js,.cjs,.mjs)文件;.babelrc.json(或者.babelrc,.js,.cjs,.mjs)文件;.babelrc.json:早期使用较多的配置方式,但是对于配置Monorepos项目是比较麻烦的;babel.config.json(babel7):可以直接作用于Monorepos项目的子包,更加推荐;
babel7.4.0之前,可以使用 @babel/polyfill的包,但是该包现在已经不推荐使用了:
babel7.4.0之后,可以通过单独引入core-js和regenerator-runtime来完成polyfill的使用:yarn add core-js regenerator-runtime
在babel.config.js内配置
第一个值:false,打包后的文件不使用polyfill来进行适配;并且这个时候是不需要设置corejs属性的;第二个值:usage,会根据源代码中出现的语言特性,自动检测所需要的polyfill;这样可以确保最终包里的polyfill数量的最小化,打包的包相对会小一些;可以设置corejs属性来确定使用的corejs的版本;
第三个值:entry
在zanlan.config.js内使用使用babel-loader,需要禁止掉exclude:/node_modules/,否则会把node_module内用到的包,它已经有自己的polyfill了,就会有冲突
yarn add @babel/plugin-transform-runtimebabel.config.js:

yarn add @babel/runtime-corejs3yarn add @babel/plugin-syntax-jsxyarn add @babel/plugin-transform-react-jsxyarn add @babel/plugin-transform-react-display-nameyarn add @babel/preset-react
yarn add react react-dom



babel编译器原理:

babel的配置文件:

module.exports = {
presets: [
["@babel/preset-env", {
// false: 不用任何的polyfill相关的代码
// usage: 代码中需要哪些polyfill, 就引用相关的api
// entry: 手动在入口文件中导入 core-js/regenerator-runtime, 根据目标浏览器引入所有对应的polyfill
useBuiltIns: "entry",
corejs: 3
}],
["@babel/preset-react"]
],
// plugins: [
// ["@babel/plugin-transform-runtime", {
// corejs: 3
// }]
// ]
}
promise和generator,symbol转换不了,需要装polyfill