Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有环境执行。
ECMAScript 6是JavaScript语言的下一代标准。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。但是目前浏览器对es6不完全兼容,需要借住babel编译。
目录
配置文件
预设
- 官方预设
插件
- 模块支持
- 实验性插件
- 优化编译
- React
- 其它
ES2015
常用ES6语法与转码对比
- 函数
- 类
- let & const
- 解构赋值
- 模板字符串
- 模块导入导出
- 属性与方法简写
Babel-polyfill
Stage说明
配置文件
通过 .babelrc
来配置Babel 转码规则,放在项目根目录下 /.babelrc
{ |
上面配置了 Babel 转码规则为,将ES6的语法转为ES2015的转码,支持React的JSX语法转码,使用 stage-2
模式转码(相关模式下面会详细介绍)
Babel 通过三个步骤 语法解析-转码-生成文件来编译Javascript。
Babel 是通过一系列插件来完成对JS的编译。
stage-x 是对非标准或未定案的标准的API的转码实现
Presets
presets
是Babel内置的一些预设,是一系列插件的组合。
官方预设 Official Presets
- env 根据配置的环境自动加载相关的插件
- es2015 将ES6的语法转码为ES5的语法
- es2016 幂运算语法糖插件
2**3
=>2*2*2
- es2017 Async / Await / Generator
- react 支持React编译
- flow 支持静态类型检测编译
插件
支持的模块加载Modules
- es2015-modules-amd 浏览器端的AMD模块加载管理
- es2015-modules-commonjs 服务端的同步模块加载管理
- es2015-modules-systemjs ES6的模块管理方式
- es2015-modules-umd 兼容AMD CMD的模块管理方式
实验性插件Experimental
- async-generator-functions 支持将ES7的 async await 函数转换为ES6的 generator 函数
- async-to-module-method 支持将ES7的 async await 函数转换为 bluebird 语法以兼容低版本[需要配置]
- class-properties 类的静态属性与方法
- decorators 类的装饰器 @connect
- do-expressions 支持模板中使用 if/else
- export-extensions 模块导出的扩展
- function-bind 支持通过 :: 来绑定上下文
- object-rest-spread 支持使用 … 将对象展开
优化编译插件 Minification
- inline-environment-variables 简化环境变量
- inline-consecutive-adds 简化对象与数据定义
- merge-sibling-variables 将多次变量申明,合并为一次
- minify-booleans 将true 和 false 转换为 !0 和 !1
- minify-constant-folding 优化数字与字符串的计算: a = 2 * 4 => a = 8;
- minify-dead-code-elimination 简化代码,去掉冗余的代码片段
- minify-flip-comparisons 优化 Gzip 的压缩算法
- minify-guarded-expressions 优化 && 表达式
- minify-infinity Infinity => 1/0
- minify-mangle-names 简化局部变量的名称
- minify-numeric-literals 将大数字转成科学计算法表示 1000 => 1e3
- minify-replace 自定义在编译过程需要缩短变量的变量
- minify-simplify 优化if else 语句、undefined => void 0, Number(foo)=> +foo, foo[‘bar’]=>foo.bar
- minify-type-constructors 简化使用基本类型构造的变量
- node-env-inline node中将环境变量转换成行内变量
- property-literals 对象字符属性转成唯一属性,关键字除外
- regexp-constructors 如果Regext()参数是字符串,则转成字面量
- remove-console 去掉console语句
- remove-debugger 去掉 debugger 语句
- simplify-comparison-operators 如果两边的类型一致,则将 === 转换为 ==
- undefined-to-void undefined => void 0
React
- react-constant-elements 静态模板转常量
- react-display-name 为组件添加 displayName 属性
- react-inline-elements 使用性能更好的 babelHelpers.jsx() 替换 React.createElement() 转换模板
- react-jsx JSX模板转为JS语句
- react-jsx-compat JSX模板转成 0.12之前语法
- react-jsx-self 添加__self属性标识本身信息
- react-jsx-source 添加源码信息到JSX模板
Other
- eval 转码eval()中的ES6语法
- flow-comments 转码后添加类型检查注释
- flow-strip-types 类型检测转成ES5语法
- jscript 函数表达式转换为申明式函数
- object-assign 转码 Object.assign 为ES5的 _extends()语法
- object-set-prototype-of-to-assign 转码 setPrototypeOf 为 _defautls() 方法
- proto-to-assign 使用_defaults() 替换
__proto__
为对象扩展属性 - regenerator 转码generator语法
- runtime 提供一些工具方法如_extends 来帮助转码
- strict-mode 添加 ‘use strict’;
语法解析插件Syntax
语法解析插件,只提供编译过程中的语法解析,并不转码,转码需要想关的转码插件支持,在使用相关转码插件时,会自动安装使用相关语法解析插件,不需要手动安装配置。
- async-functions
- async-generators
- class-constructor-call
- class-properties
- decorators
- do-expressions
- exponentiation-operator
- export-extensions
- flow
- function-bind
- jsx
- object-rest-spread
- trailing-function-commas
ES2015
默认情况下,Babel 自带了一组 ES2015 语法转化器。这些转化器能让你现在就使用最新的 JavaScript 语法,而不用等待浏览器提供支持。(每个一支持的特性都有独立的插件可以使用)
check-es2015-constants 检查const的使用规则 |
Strick regex 是否可以从指定的 lastIndex 开始搜索
function foo(one: any, two: number, three?): string {} |
常用ES6语法与转码对比
Arrow Function、Class、Funciton bind、Let、Const、Template、Modules、Destructuring、Spreade
函数
//in |
类
class SkinnedMesh extends THREE.Mesh { |
类的编译结果%20%7B%0A%20%20%20%20super(geometry%2C%20materials)%3B%0A%0A%20%20%20%20this.idMatrix%20%3D%20SkinnedMesh.defaultMatrix()%3B%0A%20%20%20%20this.bones%20%3D%20%5B%5D%3B%0A%20%20%20%20this.boneMatrices%20%3D%20%5B%5D%3B%0A%20%20%20%20%2F%2F…%0A%20%20%7D%0A%20%20update(camera)%20%7B%0A%20%20%20%20%2F%2F…%0A%20%20%20%20super.update()%3B%0A%20%20%7D%0A%20%20static%20defaultMatrix()%20%7B%0A%20%20%20%20return%20new%20THREE.Matrix4()%3B%0A%20%20%7D%0A%7D%0A)
//in |
Let + Const
//in |
属性与方法的语法糖转换
var o = { a, b, c }; // var o = { a: a, b: b, c: c }; |
模板字符串
//in |
更多解析参考%3B%0A)
解构赋值
// 从数组中解构 |
模块内容导出与导入
//in |
Babel-polyfill
针对默认不转换的API,需要另外添加一个Polyfill,或针对某个API添加插件。
Babel 默认只转换新的JavaScript句法(syntax),而不转换新的API,比如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局对象,以及一些定义在全局对象上的方法(比如Object.assign
)都不会转码。
举例来说,ES6在 Array
对象上新增了 Array.from
方法。Babel就不会转码这个方法。如果想让这个方法运行,必须使用 babel-polyfill
,为当前环境提供一个垫片。
npm install --save-dev babel-polyfill |
babel-polyfill
提提供了对新的标准API的支持,兼容老的版本。
下列特性需要使用 babel-polyfill
才能转码,或者单独引用相关插件
// 数组操作 |
使用
import 'babel-polyfill'; |
Stage说明
Babel的转换级别依据 ES7不同阶段的语法提案设置了4个阶段:stage-0
、stage-1
、stage-2
、stage-3
,使用时选装一个。(0的级别最高,包含的转码插件最多,往后越来越少)
stage-0
提供ES7的支持
包含 stage-1
、stage-2
、stage-3
的内容
特有的插件
transform-do-expressions 支持 模板中使用if else
<div className="parents"> |
transform-function-bind 绑定上下文
// 语法 |
stage-1
包含 stage-2 、stage-3
提供对 类的静态、实例属性和方法的支持 以及 对模块导入方式的扩展
特有插件
transform-class-properties 支持
class Bork { |
transform-export-extensions 扩展export导出方式
export * as ns from 'mod'; |
stage-2
包含 stage-3
提供尾逗号函数功能 及 支持 Object 使用延展符展开
特有插件
syntax-trailing-function-commas 添加行尾逗号,减少文件的改动
function clownPuppiesEverywhere( |
transform-object-reset-spread 支持使用展开符展开对象
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 }; |
stage-3
提供对ES7的async
和await
的支持 及提供幂操作的语法糖
特有插件
transform-async-to-generator 转码ES7的 async与await
//in |
transform-exponentiation-operator 支持幂运算语法糖 **
// x ** y |
为了防止某些实验中的标准在未来不能定案,一般使用 stage-1 或 stage-2 来进行转码。