阅读文档

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. linux的切换目录操作

    cd 是 change directory 用法 cd [目录名] 几个特殊目录: ”.“或者”./“当前目录        ”..“或者"../"上级目录        “../ ...

  2. SpringCloud实战——(2)通过Feign调用其他模块

    大型项目下往往有很多模块,ZCGL项目结构如下: 需要引用的其他模块已经发布成服务并在Eureka Server注册中心注册,如下: 写程序时引用了其他模块,并且其他模块在项目中,但是IDEA任然无法 ...

  3. ROS学习笔记5-理解节点(Node)

    本文内容来源于:http://wiki.ros.org/ROS/Tutorials/UnderstandingNodes 图(Graph)概念概览 节点(Nodes):一个节点是ROS下面一个可执行程 ...

  4. 【STM32H7教程】第53章 STM32H7的LTDC应用之汉字小字库和全字库制作

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第53章       STM32H7的LTDC应用之汉字小字库 ...

  5. java web开发_购物车功能实现

    java web开发_购物车功能实现 之前没有接触过购物车的东东,也不知道购物车应该怎么做,所以在查询了很多资料,总结一下购物车的功能实现. 查询的资料,找到三种方法: 1.用cookie实现购物车: ...

  6. nodejs(12)Express 中间件middleware

    中间件 客户端的请求到达服务器时,他的生命周期是:request -- 服务器端处理 -- 响应 在服务器端处理过程中,业务逻辑复杂时,为了便于开发维护,需要把处理的事情分成几步,这里每一步就是一个中 ...

  7. asp.net获取时间日期插入数据库

    //获取日期+时间 DateTime.Now.ToString(); // 2008-9-4 20:02:10 DateTime.Now.ToLocalTime().ToString(); // 20 ...

  8. LeetCode347:返回频率前K高的元素,基于优先队列实现

    package com.lt.datastructure.MaxHeap; import java.util.LinkedList; import java.util.List; import jav ...

  9. BUU easyre

    拖入ida中shift+F12查找字符串就可以看到flag

  10. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'解决

    用XAMPP装装好mysql之后,mysql -uroot 连不上,报这个错误:   ERROR 2002 (HY000): Can't connect to local MySQL server t ...