热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Babel(1)认识Babel

阅读文档Babel中文网关于Babel你必须知道的如何写好.babelrc?Babel的presets和plugins配置解析不容错过的Babel7知识汇总一口(很长的)气了解ba

阅读文档


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

 

 

 



推荐阅读
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 求解连通树的最小长度及优化
    本文介绍了求解连通树的最小长度的方法,并通过四边形不等式进行了优化。具体方法为使用状态转移方程求解树的最小长度,并通过四边形不等式进行优化。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了一个程序,可以输出1000内能被3整除且个位数为6的所有整数。程序使用了循环和条件判断语句来筛选符合条件的整数,并将其输出。 ... [详细]
  • HashMap的扩容知识详解
    本文详细介绍了HashMap的扩容知识,包括扩容的概述、扩容条件以及1.7版本中的扩容方法。通过学习本文,读者可以全面了解HashMap的扩容机制,提升对HashMap的理解和应用能力。 ... [详细]
  • Flutter 布局(四) Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth详解
    本文主要介绍Flutter布局中的Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth四种控件,详细介绍了其布局 ... [详细]
author-avatar
贞娜gina88
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有