babel介绍

babel总共分为3个阶段: 解析、转换和生成

babel本身不具有任何转换功能, 如果没有plugin,那么经过babel的代码和输入的是相同的。

babel插件分为两种

  • 语法插件:在解析的过程中,能使babel能够解析更多的语法
  • 转译插件: 在转换的过程中将代码输出。比如将箭头函数转译成正常的函数

其中preset就是babel常用的转译插件

preset介绍

preset是一套规范, 里面包含了几十个转译插件。这是一组插件的集合

preset可以分为下面几种:

  • 1.按官方内容: env, react, flow, minify;
  • 2.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-dev
npm 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.js
async 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 81
chrome 80
chrome 79
chrome 78
chrome 77
chrome 76
chrome 75
chrome 74
chrome 73
chrome 72
chrome 71
chrome 70
chrome 69
chrome 68
chrome 67
chrome 66
chrome 65
chrome 64
chrome 63
chrome 62
ie 11
ie 10
ie 9
ie 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与stage-x的使用指南的更多相关文章

  1. Error: Couldn't find preset "env" relative to directory "/Users/user/ethereumjs-vm"

    运行npm run build时遇见这个问题,解决办法是安装: npm install --save-dev babel-preset-env 就解决了

  2. vue客户端渲染首屏优化之道

    提取第三方库,缓存,减少打包体积 1. dll动态链接库, 使用DllPlugin DllReferencePlugin,将第三方库提取出来另外打包出来,然后动态引入html.可以提高打包速度和缓存第 ...

  3. babel-preset-env: a preset that configures Babel for you

    转载 babel-preset-env is a new preset that lets you specify an environment and automatically enables t ...

  4. WebStorm ES6 语法支持设置&babel使用及自动编译

    一.语法支持设置 Preferences > Languages & Frameworks > JavaScript 二.Babel安装 1.全局安装 npm install -g ...

  5. babel基本用法

    babel-cli babel-cli是本地使用编译js文件 1.安装: cnpm i babel-cli babel-preset-env -D 2.配置packjson: "script ...

  6. 《前端之路》之 Babel 下一代 JavaScript 语法编译器

    写本章的内容的出发点主要是 为了对于之前关于 JS 版本的一个总结,在之前的开发中,我们始终对于 ECMAScript 的版本的更新不够重视,以至于在后面的 开发过程中,我们始终会被各种新奇的语法打断 ...

  7. webpack中babel配置 --- runtime-transform和babel-pollfill

    webpack - babel配置 babel是一个javascript编译器,是前端开发中的一个利器.它突破了浏览器实现es标准的限制,使我们在开发中可以使用最新的javascript语法. 通过构 ...

  8. babel那些事儿

    从前,一提到新东西,我的反应就是兼容性好不好,如果不能满足产品经理的需求,就还是用保守的方式实现吧.毕竟前端开发是一件很灵活的事,怎么写都行,至于为何会用某种方法,一定是综合考虑兼容性,性能,用户体验 ...

  9. Babel总结

    什么是babel? babel是一个JavaScript编译器. Babel是一个工具链,主要用于将ECMAScript 2015+代码转换为向后兼容的旧浏览器或环境中JavaScript版本. 注解 ...

  10. 前端自动化之babel本地化安装

    npm添加package.json cd到项目根目录直接调用npm init 会创建package.json文件 本地安装bebel(并非全局安装,这种情况下cmd命令中babel命令不识别): 步骤 ...

随机推荐

  1. P2935

    [USACO09JAN]Best Spot S 题目 约翰拥有P(1<=P<=500)个牧场.贝茜特别喜欢其中的F个.所有的牧场 由C(1 < C<=8000)条双向路连接,第 ...

  2. 转载 | win11右键菜单改为win10的bat命令(以及恢复方法bat)

    原文来自这里:https://blog.51cto.com/knifeedge/5340751 版权归:IT利刃出鞘 本质上就是写入注册表. 一.右键菜单改回Win10(展开) 1. 新建文件:win ...

  3. Loggie Geek Camp 火热启动,社区大神带你玩开源

    由开源构建的协作模式,正成为描绘数字蓝图.创造美好未来的主航道,中国工商银行.阿里云等组织已经在网易数帆"架构开发.内核开源"理念中与后者达成合作,来自华为.阿里云.中国移动.eB ...

  4. tp 模型hasOne、hasMany、belongsTo详解

    首先,这3个的大致中文意思:hasOne:有一个,加上主谓语应该是 ,A 有一个 BhasMany:有很多,A 有很多 BbelongsTo:属于, A 属于 B这里我们准备3张表来理解他们的关系:u ...

  5. openStack核心组件的工作流程

    目录 openStack核心组件的工作流程 1. Keystone 1.1 User 1.2 Credentials 1.3 Authentication 1.4 Token 1.5 Project ...

  6. [oeasy]python0031_挂起进程_恢复进程_进程切换

    ​ 查看进程 回忆上次内容 上次修改了 $PATH 路径 把当前用户shiyanlou的宿主文件夹 ~ 添加到 $PATH 中 这样 sleep.py 就可以被找到 于是就可以被执行了 还可以把配置 ...

  7. 使用nvm管理node

    安装包在阿里云盘 安装时,记录安装位置 安装后,在安装目录的setting添加镜像地址 node_mirror:npm.taobao.org/mirrors/node/ npm_mirror:npm. ...

  8. Jmeter参数化5-JSON提取器

    后置处理器[JSON提取器] ,一般放于请求接口下面,用于获取接口返回数据里面的json参数值 1.以下json为例,接口返回的json结果有多组数据.我们要取出purOrderNo值 2.在jmet ...

  9. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-62 - 判断元素是否可操作

    1.简介 有些页面元素的生命周期如同流星一闪,昙花一现.我们也不知道这个元素在没在页面中出现过,为了捕获这一美好瞬间,让其成为永恒.我们就来判断元素是否显示出现过. 在操作元素之前,可以先判断元素的状 ...

  10. 【Linux】真机安装CentOS8

    先制作启动U盘 https://www.cnblogs.com/mindzone/p/12961506.html 插入电脑,开机[这里我是把电脑硬盘格式化了,不会在电脑磁盘上找到任何系统,直接跳到启动 ...