Babel 是 JavaScript 编译器,更确切地说是源码到源码的编译器,一般也叫作“转换编译器(transpiler)”。node
若是你须要以编程的方式来使用 Babel,可使用 babel-core 这个包react
npm install babel-core var babel = require("babel-core");
字符串形式的 JavaScript 代码能够直接使用 babel.transform 来编译webpack
babel.transform("code();....", options); // => { code, map, ast }
若是是文件的话,可使用异步 apiios
babel.transformFile("./myCode.js", options, function(err, result) { result; // => { code, map, ast } });
对于上述全部方法,options 指的都是http://babeljs.io/docs/usage/...web
在options中能够设置presets和plugins,或者建立.babelrc文件,options默认开启读取babelrc文件的功能。如下是开启自定义预设和插件的例子:chrome
const {transform,generate}=require('babel-core'); const myPlugin=require('./myPlugin'); const mypreset=require('./mypreset'); const code = `d = a + b + c`; var es5Code = transform(code, { plugins: [myPlugin], presets: [mypreset] }) console.log(es5Code.code);
在咱们告诉 Babel 该作什么以前,咱们须要建立一个配置文件。你须要作的就是在项目的根路径下建立 .babelrc 文件。而后输入如下内容做为开始:npm
{ "presets": [], "plugins": [] }
因为babelrc的功能默认被开启,可在options中设置{babelrc:false}来显式关闭。编程
预设,包含一系列插件的集合。目前经常使用的presets包括es201x,stage-x,env,latest,react,flow。目前罗列的只是babel6的状况。segmentfault
1. es2015api
check-es2015-constants
transform-es2015-arrow-functions
transform-es2015-block-scoped-functions
transform-es2015-block-scoping
transform-es2015-classes
transform-es2015-computed-properties
transform-es2015-destructuring
transform-es2015-duplicate-keys
transform-es2015-for-of
transform-es2015-function-name
transform-es2015-literals
transform-es2015-modules-commonjs
transform-es2015-object-super
transform-es2015-parameters
transform-es2015-shorthand-properties
transform-es2015-spread
transform-es2015-sticky-regex
transform-es2015-template-literals
transform-es2015-typeof-symbol
transform-es2015-unicode-regex
transform-regenerator
2. es2016
transform-exponentiation-operator
3. es2017
syntax-trailing-function-commas
transform-async-to-generator
es201x系列中,只罗列了当年ECMAScript公布的新特性中的语法部分,至于新特性中的API则所有在polyfill中。
JavaScript 还有一些提案,正在积极经过 TC39(ECMAScript 标准背后的技术委员会)的流程成为标准的一部分。
这个流程分为 5(0-4)个阶段。 随着提案获得越多的关注就越有可能被标准采纳,因而他们就继续经过各个阶段,最终在阶段 4 被标准正式采纳。
如下是5 个不一样阶段的(打包的)预设:
以上每种预设都依赖于紧随的后期阶段预设。例如,babel-preset-stage-0 包含了 babel-preset-stage-1 babel-preset-stage-2 babel-preset-stage-3。
stage预设是一个一直变化的插件集合,根据当年发布的标准内容,动态改变stage的插件内容,stage3中的候选插件极可能被完成,那就会在babel新release的版本中去除,而stage2中的草案就会进入到stage3中的候选名单中,像是一个传接棒的过程,固然草案或者候选的名单随时可能会被取消。
其中stage-0的do语法糖能够很好的用在jsx中,咱们在开发recat的jsx条件判断代码时,能够有如下几种方式:
1.第一种三元表达式
{condition1?condition2?result1:result2:result3}
2.第二种自执行函数
{(()=>{ if(a){ return ...; }else{ return ...; } })()}
3.第三种do
{
do{ if(a){ 'result1' }else{ 'result2' } }
}
{ "presets": [ ["env", { "targets": { "browsers": ["last 2 versions", "safari >= 7"] } }] ] }
当env的配置只简单配置为{presets:['env']}时,与babel-preset-latest(官方已不推荐使用)等价,至关于同时集合了三个babel-preset-es201x预设。
env的执行过程是,首先读取browsers配置中的条件,根据这些条件从browserslist模块可得出该条件下的全部浏览器最低版本号列表,而env又为babel的转译插件提供了浏览器的最低版本号列表,两个浏览器版本号列表的查询可得出一个babel转译插件的集合。
browserslist根据条件查出的浏览器及版本号:
1%, Last 2 versions => {ie:10,chrome:56...}
env提供的转译插件对应浏览器版本号列表:
{ "check-es2015-constants": { "chrome": "49", "edge": "14", "firefox": "51", "safari": "10", "node": "6", "ios": "10", "opera": "36", "electron": "1" }, "transform-es2015-arrow-functions": { "chrome": "47", "edge": "13", "firefox": "45", "safari": "10", "node": "6", "ios": "10", "opera": "34", "electron": "0.36" }....
最后得出结果
{ plugins:[babel插件1,babel插件2...] }
Babel 几乎能够编译全部时新的 JavaScript 语法,但对于 APIs 来讲却并不是如此。
比方说,下列含有箭头函数的须要编译的代码:
function addAll() { return Array.from(arguments).reduce((a, b) => a + b); }
最终会变成这样:
function addAll() { return Array.from(arguments).reduce(function(a, b) { return a + b; }); }
然而,它依然没法随处可用由于不是全部的 JavaScript 环境都支持 Array.from。
babel垫片有三种:
babel-runtime和 babel-plugin-transform-runtime的区别是,至关一前者是手动挡然后者是自动挡,每当要转译一个api时都要手动加上require('babel-runtime'),而babel-plugin-transform-runtime会由工具自动添加,主要的功能是为api提供沙箱的垫片方案,不会污染全局的api,所以适合用在第三方的开发产品中。
babel-polyfill则是经过改写全局prototype的方式实现,比较适合单独运行的项目。开启babel-polyfill的方式,能够直接在代码中require,或者在webpack的entry中添加,也能够在babel的env中设置useBuildins为true来开启。