babel是一个转译器,用于把同种语言的高版本规则翻译成低版本规则。
过程
babel的转译过程分为三个阶段:parsing、transforming、generating;
以ES6转ES5为例,具体过程:
- 编写ES6代码
- babylon进行解析
- 解析得到AST
- plugin用babel-traverse对AST树进行遍历转译
- 得到新的AST树
- 用babel-generator通过AST树生成ES5代码
需注意的一点就是,babel默认只是转译新标准引入的语法,比如ES6的箭头函数,不转换新的API,比如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局对象,以及一些定义在全局对象上的方法(比如Object.assign)都不会转码。
举例来说,ES6在Array对象上新增了Array.from方法。Babel就不会转码这个方法。如果想让这个方法运行,必须使用babel-polyfill,为当前环境提供一个垫片。
plugins
插件应用于babel的转译,尤其是第二个阶段transforming,如果这个阶段不使用任何插件,那么babel会原样输出代码。
注意: 转译 plugin 会自动继承/使用语法插件,因此如果已经使用了相应的转译 plugin ,则不需要指定语法 plugin 。
Presets
env 是官方组装的一些公用的插件
地址: https://www.babeljs.cn/docs/plugins/preset-env/
每年每个 preset 只编译当年批准的内容。 而 babel-preset-env 相当于 es2015 ,es2016 ,es2017 及最新版本。
polyfill
它会仿效一个完整的 ES2015+ 环境,前面说了babel只能满足新标准引入的语法,polyfill相当于是对新增API支持的扩增。
意味着你可以使用新的内置对象比如 Promise 或者 WeakMap, 静态方法比如 Array.from 或者 Object.assign, 实例方法比如 Array.prototype.includes 和生成器函数(提供给你使用 regenerator 插件)。polyfill 添加到了全局范围,就像原生类型比如 String 一样。
安装:
npm install --save babel-polyfill --save
需要在你的应用入口顶部通过 require 将 polyfill 引入进来
import "babel-polyfill"
最后在 webpack.config.js 中,将 babel-polyfill 加到你的 entry 数组中
module.exports = {
entry: ["babel-polyfill", "./app/js"]
};