babel介绍
babel总共分为3个阶段: 解析、转换和生成
babel自身不具备任何转换性能, 如果没有plugin,那么通过babel的代码和输出的是雷同的。
babel插件分为两种
- 语法插件:在解析的过程中,能使babel可能解析更多的语法
- 转译插件: 在转换的过程中将代码输入。比方将箭头函数转译成失常的函数
其中preset就是babel罕用的转译插件
preset介绍
preset是一套标准, 外面蕴含了几十个转译插件。这是一组插件的汇合
preset能够分为上面几种:
- 按官网内容: env, react, flow, minify
- stage-x:stage-0 至 stage-3代表了es规范反对的不同阶段。0阶段是最高级的阶段,能够了解为仅仅才开始探讨规范, 换句话说就是根本没有什么浏览器反对es新规范。3示意成熟阶段,意味着支流浏览器的新版本都反对大部分新规范,根底的es新规范个性不须要降级编译为es5,浏览器即可原生反对。
stage-3包含以下插件:
- transform-async-to-generator 反对async/await
- transform-exponentiation-operator 反对幂运算符语法糖
stage-2包含stage-3的所有插件,额定还包含以下插件:
- syntax-trailing-function-commas 反对尾逗号函数,额...很鸡肋
- transform-object-reset-spread 反对对象的解构赋值
stage-1包含stage2所有插件,额定还包含以下插件:
- transform-class-constructor-call 反对class的构造函数
- transform-class-properties 反对class的static属性
- transform-decorators 反对es7的装璜者模式即@符号引入的办法 (还在探讨中的个性?)
- transform-export-extensions 反对export办法
stage-0包含stage1所有插件,额定还包含以下插件:
- transform-do-expressions 反对在jsx中书写if/else
- transform-function-bind 反对::操作符来切换上下文,相似于es5的bind
babel-preset-env
历史版本babel-preset-latest(已被弃用)
最后,为了让开发者可能尽早用上新的JS个性,babel团队开发了babel-preset-latest。这个preset比拟非凡,它是多个preset的汇合(es2015+),并且随着ECMA标准的更新更减少它的内容。
- 特点:蕴含了所有年度预设(babel-preset-es2015、babel-preset-es2016、babel-preset-es2017),无需用户独自指定某个预设。
- 毛病:局部转码多余,如果应用默认设置,babel会将所有ES6与ES6+的新个性转成简单的es5的代码。然而大部分当初浏览器曾经反对ES6的局部个性。
因为上述问题的存在,babel官网推出了babel-preset-env插件。它能够依据开发者的配置,按需加载插件。配置项大抵包含:
- 须要反对的平台:比方node、浏览器等。
- 须要反对的平台的版本:比方反对node@6.1等。
默认配置的状况下,它跟babel-preset-latest是等同的,会加载从es2015开始的所有preset。
//默认设置{ "presets": ["env"]}
入门实例
首先,装置依赖:
npm install babel-cli --save-devnpm install babel-preset-env --save-dev
创立一个index.js文件:
let foo = () => 'foo';
配置文件 .babelrc 如下,以后为默认配置。
{ "presets": [ "env" ]}
对index.js文件执行babel转化命令:
// 形式一:.\node_modules\.bin\babel index.js// 形式二(npm5.2反对):npx babel index.js
转换后果如下:
'use strict';var foo = function foo() { return 'foo';};
针对node版本的配置
babel-preset-env 提供了更精细化的配置,以晋升编译速度,同时缩小代码冗余。
比方咱们index.js的代码如下:
// index.jsasync function foo () {}
采纳 babel-preset-env,默认配置下,编译后的代码如下:
"use strict";var foo = function () { var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: case "end": return _context.stop(); } } }, _callee, this); })); return function foo() { return _ref.apply(this, arguments); };}();function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
后果很长,无需关怀。如果咱们的代码是在node@8.9.3版本上运行,那下面的这些兼容代码就是冗余的,因为node@8.9.3曾经反对了async/await。
批改下 .babelrc,加上配置参数"target",它示意咱们须要反对哪些平台+哪些版本。这里申明咱们要反对的是node版本为8.9.3。
{ "presets": [ ["env", { "targets": { "node": "8.9.3" } }] ]}
再次进行转码,后果如下:
"use strict";async function foo() {}
针对浏览器版本的配置
babel-preset-env 同样提供了对浏览器版本的配置能力。
比方,咱们须要反对 IE8+、chrome62+,那么能够这样配置:
{ "presets": [ ["env", { "targets": { "browsers": [ "ie >= 8", "chrome >= 62" ] } }] ]}
看下后面申明的范畴涵盖了哪些浏览器:
npx browserslist "ie >= 8, chrome >= 62"chrome 81chrome 80chrome 79chrome 78chrome 77chrome 76chrome 75chrome 74chrome 73chrome 72chrome 71chrome 70chrome 69chrome 68chrome 67chrome 66chrome 65chrome 64chrome 63chrome 62ie 11ie 10ie 9ie 8
当然下面的配置规定不是凭空想象,其它的具体配置规定可参考《 browserslist 库》
stage-x(试验阶段presets)
默认不会蕴含stage-x插件,须要手动配置反对
"presets": [ // 带了配置项,本人变成数组 [ // 第一个元素仍然是名字 "env", // 第二个元素是对象,列出配置项 { "modules": false // 将ES6模块语法转换为另一种模块类型,"amd" | "umd" | "systemjs" | "commonjs" | false } ], // 不带配置项,间接列出名字 "stage-2"]
依据需要装置不同版本的stage:
# ES7不同阶段语法提案的转码规定(共有4个阶段),选装一个$ npm install --save-dev babel-preset-stage-0$ npm install --save-dev babel-preset-stage-1$ npm install --save-dev babel-preset-stage-2$ npm install --save-dev babel-preset-stage-3
参考地址
- babel-preset-env
- babel-preset-env使用指南
- browserslist 库
- 如何辨别Babel中的stage-0,stage-1,stage-2以及stage-3(一)