阅读文档

Babel中文网

关于 Babel 你必须知道的

如何写好.babelrc?Babel的presets和plugins配置解析

不容错过的 Babel 7 知识汇总

一口(很长的)气了解 babel

core-js@3带来的惊喜

babel 7 的使用的个人理解

介绍

Babel is a JavaScript compiler.——顾名思义,Babel 就是将最新的 ES6+ 语法,向后兼容,编译转化为支持各个浏览器可以运行的 javascript 代码。

Babel 编译

babel编译经历三个阶段:解析(parse),转换(transform),生成(generate)。

注意:在升级 Babel 6.X 版本以后,所有的插件都是可插拔的(意味着transform 流程全部交给了插件去做。)。

这就意味着安装babel之后,是不能工作的,需要配置对应的 .babelrc 文件才能发挥完整的作用。

如果想要通过Babel完成你的代码转换,那么需要配置一些你需要的插件。

插件——plugin

plugin 就是将高级的语法转化为兼容多种浏览器的载体:

Babel 构建在插件之上,使用现有的或者自己编写的插件可以组成一个转换通道,Babel 的插件分为两种: 语法插件和转换插件。

语法插件

这些插件只允许 Babel 解析(parse) 特定类型的语法(不是转换)

转换插件

将不识别的新内置函数进行转换:转换插件会启用相应的语法插件(因此不需要同时指定这两种插件)。

将箭头函数转化为普通函数

.babelrc 设置:

{
"presets": ["@babel/plugin-transform-arrow-functions"]
}

转换 => 生成:

// 转换前
const name = 'houfee'
let hello = `hello ${name}` let func = () => {
console.log('转化箭头函数')
} // 转换后
const name = 'houfee';
let hello = `hello ${name}`; let func = function () {
console.log('转化箭头函数');
};

可见,以上转换只转换了箭头函数,而constlet 却没有转化。

预设——preset

babelES6+ 新语法向后兼容时,将新语法封装为多个插件转化,而不是唯一一个插件。这是你想要体验 ES6 所有的新特性(注意:语法转换只是将高版本的语法转换成低版本的,但是新的内置函数、实例方法无法转换。)时,那么你只需在.babelrc 设置:

{
"presets": ["@babel/preset-env"]
}

转换 => 生成:

// 转换前
const name = 'houfee' let hello = `hello ${name}` let func = () => {
console.log('转化箭头函数')
} class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
} let promise = new Promise((res, rej) => console.log(res, rej)) // 转换后
"use strict"; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var name = 'houfee';
var hello = "hello ".concat(name); var func = function func() {
console.log('转化箭头函数');
}; var Point = function Point(x, y) {
_classCallCheck(this, Point); this.x = x;
this.y = y;
}; var promise = new Promise(function (res, rej) {
return console.log(res, rej);
});

可见: @babel/preset-env 插件只是转换了已存在的语法,对于新增的内置函数依然是无法转换的。

pluginpreset 关系

plugin 插件功能单一,只能完成特定语法转换;——特点是:颗粒度小,效率高,但是需要逐个引入(babel的插件有20+)。

preset 将一系列的 plugin 功能集合在一起;——特点是:一次引入多个语法功能的插件,优化配置。

pluginpreset 的执行顺序

多个PluginPreset时执行顺序非常重要:

1,先执行完所有Plugin,再执行Preset

2,多个Plugin,按照声明次序顺序执行。

3,多个Preset,按照声明次序逆序执行。

Babel 相关模块简要说明

Babel 的模块那么多,那么要怎么学习呢?

目前 Babel 版本为 Babel 7.4.0,此图只是示意(网图~)。

核心库 @babel/core

babel 的核心 api 都在这个模块中。也就是这个模块会把我们写的 js 代码抽象成 AST (abstract syntax tree)树;然后再将 plugins 转译好的内容解析为 js 代码。

命令行工具 @babel/cli

babel 提供的命令行工具,主要是提供 babel 这个命令,适合安装在项目里。

@babel/node 提供了 babel-node 命令,但是 @babel/node 更适合全局安装,不适合安装在项目里。

npm install --save-dev @babel/core @babel/cli

@babel/preset-env

将新增的ES6语法转换为浏览器支持的语法,但是不会转换新增的内置函数。

@babel/polyfill

babel 对一些新的 API 是无法转换,比如 Generator、Set、Proxy、Promise 等全局对象,以及新增的一些方法:includes、Array.form 等。所以这个时候就需要一些工具来为浏览器做这个兼容。

官网的定义:babel-polyfill 是为了模拟一个完整的 ES6+ 环境,旨在用于应用程序而不是库/工具。

@babel/polyfill 主要有两个缺点:

  1. 使用 @babel/polyfill 会导致打出来的包非常大,很多其实没有用到,对资源来说是一种浪费。

  2. @babel/polyfill 可能会污染全局变量,给很多类的原型链上都作了修改,这就有不可控的因素存在。

因为上面两个问题,在 Babel7 通过设置 "useBuiltIns":"usage"这个参数值就可以实现按需加载。

@babel/plugin-transform-runtime

配合其他插件使用,避免编译后的代码中出现重复的帮助程序,有效减少包体积。

其他预设

@babel/preset-flow

@babel/preset-react

@babel/preset-typescript

Babel(1)认识Babel的更多相关文章

  1. Babel插件:@babel/plugin-transform-runtime

    一 概述 每个Babel编译后的脚本文件,都以导入的方式使用Babel的帮助函数,而不是每个文件都复制一份帮助函数的代码. 1 优点 (1)提高代码重用性,缩小编译后的代码体积. (2)防止污染全局作 ...

  2. @babel/runtime 和 @babel/plugin-transform-runtime 两个的作用是什么

    Babel 最基础的功能就是将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中. 最基础的依赖包也就是 ...

  3. 【Babel】293- 初学 Babel 工作原理

    戳蓝字「前端技术优选」关注我们哦! 前言 babel Babel 对于前端开发者来说应该是很熟悉了,日常开发中基本上是离不开它的. 已经9102了,我们已经能够熟练地使用 es2015+ 的语法.但是 ...

  4. Sublime插件支持Sass编译和Babel解析ES6 & .sublime-build文件初探

    用Sublime Text蛮久了,配置配来配去的,每次换电脑都得重头再配过,奈何人老了脑子不中用了,得好好整理一些,下次换电脑就有得参考了.. 同事说,他的WebStorm简直太方便,自身集成了很多方 ...

  5. Babel 学习

    一,为了更明白地使用Babel, 先了解Babel 的发展过程. 现在Babel的版本是6, 相对于以前的版本, 它做了重大更新: 1, 模块化:所有的内部组件都变成了单独的包.打开Babel在Git ...

  6. 深入浅出ES6(九):学习Babel和Broccoli,马上就用ES6

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 现在,我们将向你分步展示如何做到的这一切.上面提及的工具被称为转译器,你可以将它 ...

  7. babel安装

    大家都知道目前ES6不是浏览器全部都是支持的,所以要通过转码器先进行转码然后再编译代码.小心在学习ES6之前先安装了babel转码器,虽然当时安装的时候困难重重,遗憾的是没有把解决方案总结一下,别人询 ...

  8. ES6学习(1)——如何通过babel将ES6转化成ES5

    使用babel编译ES6 babel是一个工具,可以通过多个平台,让js文件从ES6转化成ES5,从而支持一些浏览器并未支持的语法. Insall babel $ sudo npm install b ...

  9. 深入浅出 ES6:ES6 与 Babel / Broccoli 的联用

    深入浅出 ES6指的是添加在 ECMASript 标准第六版中的 JavaScript 编程语言的新特性,简称为 ES6. 虽然 ES6 刚刚到来,但是人们已经开始谈论 ES7 了,它未来的样子,以及 ...

  10. Babel 相关资料

    Babel online editor Babel Plugin Handbook babeljs usage options

随机推荐

  1. 寒假所做事情日志-Office重新激活

    日期:2020.01.18 博客期:127 星期六 好吧,今天出了一趟远门,将近傍晚才回来.任务目标其实相当于什么也没做,但回来发现Office居然过期了,老师给的那些文件居然无法修改了,于是乎剩下的 ...

  2. python 网络爬虫(一)

    一.识别网站所用技术 构建网站所使用的技术类型也会对我们如何爬取产生影响.有一个十分有用的工具可以检查网站构建的技术类型---builtwith模块.该模块的安装如下 pip install buil ...

  3. redis(笔记)

    ./redis-cli -a root 带密码链接 root 为我的密码del key 删除key keys * 查询 所有keyexist key key是否存在 成功返回1 失败Wie0 set ...

  4. mysql 通过localhost可以连接IP连接不上

    因为MySQL默认没开 所以需要手动设置 开MySQL启远程连接的功能,在MySQL服务器控制台上执行以下命令: 设置权限: grant all privileges on *.* to 用户名@&q ...

  5. Linux系统使用ss命令查看端口状态

    Linux系统使用ss命令查看端口状态 目录 1.可用工具 2.ss帮助 2.1 选项分类说明 2.2 过滤选项family 2.3 过滤选项state 2.4 状态之间的关系 3.ss的使用 3.1 ...

  6. Keepalived——HA

    一.HA集群中的相关术语 1.节点(node) 运行HA进程的一个独立主机,称为节点,节点是HA的核心组成部分,每个节点上运行着操作系统和高可用软件服务,在高可用集群中,节点有主次之分,分别称之为主节 ...

  7. 微信web版接口api(转)

    安卓微信的api,个人微信开发API协议,微信 ipad sdk,微信ipad协议,微信web版接口api,微信网页版接口,微信电脑版sdk,微信开发sdk,微信开发API,微信协议,微信接口文档sd ...

  8. boost::thread demo

    #include <iostream> #include <boost/date_time/gregorian/gregorian.hpp> #include <boos ...

  9. 统计学习方法——KD树最近邻搜索

    李航老师书上的的算法说明没怎么看懂,看了网上的博客,悟出一套循环(建立好KD树以后的最近邻搜索),我想应该是这样的(例子是李航<统计学习算法>第三章56页:例3.3): 步骤 结点查询标记 ...

  10. git log format

    默认git log 出来的格式并不是特别直观,很多时候想要更简便的输出更多或者更少的信息,这里列出几个git log的format. 可以根据自己的需要定制. git log命令可一接受一个--pre ...