Babel(1)认识Babel
阅读文档
Babel中文网
如何写好.babelrc?Babel的presets和plugins配置解析
介绍
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('转化箭头函数');
};
可见,以上转换只转换了箭头函数,而const
和 let
却没有转化。
预设——preset
babel
将 ES6+
新语法向后兼容时,将新语法封装为多个插件转化,而不是唯一一个插件。这是你想要体验 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
插件只是转换了已存在的语法,对于新增的内置函数依然是无法转换的。
plugin
和 preset
关系
plugin
插件功能单一,只能完成特定语法转换;——特点是:颗粒度小,效率高,但是需要逐个引入(babel
的插件有20+)。
preset
将一系列的 plugin
功能集合在一起;——特点是:一次引入多个语法功能的插件,优化配置。
plugin
和 preset
的执行顺序
多个Plugin
和Preset
时执行顺序非常重要:
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
主要有两个缺点:
使用
@babel/polyfill
会导致打出来的包非常大,很多其实没有用到,对资源来说是一种浪费。@babel/polyfill
可能会污染全局变量,给很多类的原型链上都作了修改,这就有不可控的因素存在。
因为上面两个问题,在 Babel7
通过设置 "useBuiltIns":"usage"
这个参数值就可以实现按需加载。
@babel/plugin-transform-runtime
配合其他插件使用,避免编译后的代码中出现重复的帮助程序,有效减少包体积。
其他预设
@babel/preset-flow
@babel/preset-react
@babel/preset-typescript
Babel(1)认识Babel的更多相关文章
- Babel插件:@babel/plugin-transform-runtime
一 概述 每个Babel编译后的脚本文件,都以导入的方式使用Babel的帮助函数,而不是每个文件都复制一份帮助函数的代码. 1 优点 (1)提高代码重用性,缩小编译后的代码体积. (2)防止污染全局作 ...
- @babel/runtime 和 @babel/plugin-transform-runtime 两个的作用是什么
Babel 最基础的功能就是将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中. 最基础的依赖包也就是 ...
- 【Babel】293- 初学 Babel 工作原理
戳蓝字「前端技术优选」关注我们哦! 前言 babel Babel 对于前端开发者来说应该是很熟悉了,日常开发中基本上是离不开它的. 已经9102了,我们已经能够熟练地使用 es2015+ 的语法.但是 ...
- Sublime插件支持Sass编译和Babel解析ES6 & .sublime-build文件初探
用Sublime Text蛮久了,配置配来配去的,每次换电脑都得重头再配过,奈何人老了脑子不中用了,得好好整理一些,下次换电脑就有得参考了.. 同事说,他的WebStorm简直太方便,自身集成了很多方 ...
- Babel 学习
一,为了更明白地使用Babel, 先了解Babel 的发展过程. 现在Babel的版本是6, 相对于以前的版本, 它做了重大更新: 1, 模块化:所有的内部组件都变成了单独的包.打开Babel在Git ...
- 深入浅出ES6(九):学习Babel和Broccoli,马上就用ES6
作者 Jason Orendorff github主页 https://github.com/jorendorff 现在,我们将向你分步展示如何做到的这一切.上面提及的工具被称为转译器,你可以将它 ...
- babel安装
大家都知道目前ES6不是浏览器全部都是支持的,所以要通过转码器先进行转码然后再编译代码.小心在学习ES6之前先安装了babel转码器,虽然当时安装的时候困难重重,遗憾的是没有把解决方案总结一下,别人询 ...
- ES6学习(1)——如何通过babel将ES6转化成ES5
使用babel编译ES6 babel是一个工具,可以通过多个平台,让js文件从ES6转化成ES5,从而支持一些浏览器并未支持的语法. Insall babel $ sudo npm install b ...
- 深入浅出 ES6:ES6 与 Babel / Broccoli 的联用
深入浅出 ES6指的是添加在 ECMASript 标准第六版中的 JavaScript 编程语言的新特性,简称为 ES6. 虽然 ES6 刚刚到来,但是人们已经开始谈论 ES7 了,它未来的样子,以及 ...
- Babel 相关资料
Babel online editor Babel Plugin Handbook babeljs usage options
随机推荐
- UISearchBar设置背景色
1.关于UISearchBar的背景颜色,竟然要如下设置才正常: [documentSearchView setBackgroundImage:[UIImage new]]; documentSear ...
- 超级方便的linux命令手册
超级方便的linux命令手册 NO 分类 PS1 命令名 用法及参数 功能注解 对应章节 1 文件管理 # ls ls -a 列出当前目录下的所有文件,包括以.头的隐含文件 文件管理 # ls ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase简介
实验目的 了解hbase的概念 通过安装hbase了解hbase的原理 了解hbase与hadoop的关系 复习hadoop和zookeeper的运行 实验原理 hbase是bigtable的开源山寨 ...
- shell脚本中执行sql脚本并传递参数(mysql为例)
1.mysql脚本文件 t.sql insert into test.t values(@name,@age); exit 2.shell脚本文件 a.sh (为方便演示,与t.sql文件放在同一目 ...
- jqgrid 合并表头
参考:http://www.trirand.com/jqgridwiki/doku.php?id=wiki:groupingheadar jQuery("#表格id").jqGri ...
- VS2008 error PRJ0002 : 错误的结果 31 (从“C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\rc.exe”返回)。
解决方案,选择属性->配置属性->清单工具->输入和输出->嵌入清单,把是改成否
- 第1节 storm编程:9、storm与kafka的整合
详见代码. 下图,为设置kafka的首次消费策略,即首次消费的偏移量的示例:
- CSP-S 2019 复赛游记
自闭游记 >_< Day 0 随便敲了一些板子 当然打了摆. 奶人的话写满了俩黑板啊,没人奶我可海星. 晚上没怎么打摆,随便敲了几道板子,然后很早就回去睡了. Day 1 平静地出发了.. ...
- 077、Java数组之分步实现数组操作
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 标准查询运算符---LINQ
Where 根据给定的谓词对序列进行过滤 Select 指定要包含一个对象或对象的一部分 SelectMany 一种查询类型,返回集合的集合.该方法将这些结果合并为一个单独的集合 Take 接受一个输 ...