Babel(1)认识Babel

阅读文档

Babel中文网

关于 Babel 你必须知道的

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

不容错过的 Babel 7 知识汇总

一口(很长的)气了解 babel

[email protected]带来的惊喜

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

原文地址:https://www.cnblogs.com/houfee/p/12002933.html

时间: 2024-08-30 06:11:55

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

@babel/preset-env 与@babel/plugin-transform-runtime 使用及场景区别

之前在用babel 的时候有个地方一直挺晕的,`@babel/preset-env` 和 `@babel/plugin-transform-runtime`都具有转换语法的能力, 并且都能实现按需 `polyfill` ,但是网上又找不到比较明确的答案, 趁这次尝试 roullp 的时候试了试. 如果我们什么都不做, 没有为babel 编写参数及配置, 那babel 并没有那么大的威力, 它什么都不会做, 正是因为各个预设插件的灵活组合.赋能, 让 babel 充满魅力, 创造奇迹 首先是 @b

搭建Babel运行环境,块级作用域,let和const命令

搭建Babel运行环境 Babel(http://babeljs.io/)可用于将使用ES6语法的脚本转化为ES5语法的脚本,基本功能的安装步骤如下: 1.安装node解释器和npm包管理工具 2.安装babel解释器  npm install -g babel (建议这个过程完成以后重启一下电脑,以免无法识别babel指令) 3.使用babel实现脚本转换,命令行进入js文件所在目录后   babel es6.js 示例:新建一个demo01.js,代码如下: //定义一个常量PI const

Sublime插件支持Sass编译和Babel解析ES6 & .sublime-build文件初探(转载自imwtr)

原文请看:http://www.cnblogs.com/imwtr/p/6010550.html 用Sublime Text蛮久了,配置配来配去的,每次换电脑都得重头再配过,奈何人老了脑子不中用了,得好好整理一些,下次换电脑就有得参考了.. 同事说,他的WebStorm简直太方便,自身集成了很多方便的工具,不用配置太多 哈哈哈哈但我还是更喜欢用ST 如果要将Sass编译成css文件,安装相应的编译工具就行,然后在命令行直接sass a.scss:b.css 编译就行了 要将ES6解析成ES5的语

es6 babel编译

本文主要参照阮一峰的es6入门,为提高自己写了一份随笔. 原文地址请戳这里  ECMAScript 6 入门 ECMAScript 6是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 但是目前浏览器对es6不完全兼容,需要借住babel编译. Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有环境执行. node 安装babel : $ npm install --save-dev babe

babel

npm install – g babel babel – help 在项目里安装npm install babel-core -- save-dev babel xx.js babel xx.js -- out-file xxx.js babel xx.js -- out-file xxx.js --source-maps babel --watch  xx.js -- out-file xxx.js --source-maps babel src -- out-dir lib babel s

babel如此简单

凡是看到这个标题点进来的同学,相信对babel都有了一定的了解.babel使用起来很简单,简单到都没有必要写一篇文章去介绍,直接看看官方文档就可以.所以我也在怀疑到底该不该写这篇文章.想来想去还是决定动手写写,原因是很简单,自己在刚开始接触babel也出现过懵逼的状态,所以希望这篇文档能给其他人以帮助. 1.babel是什么? babel官网正中间一行黄色大字写着"babel is a javascript compiler",翻译一下就是babel是一个javascript转译器.为

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

用Sublime Text蛮久了,配置配来配去的,每次换电脑都得重头再配过,奈何人老了脑子不中用了,得好好整理一些,下次换电脑就有得参考了.. 同事说,他的WebStorm简直太方便,自身集成了很多方便的工具,不用配置太多 哈哈哈哈但我还是更喜欢用ST 如果要将Sass编译成css文件,安装相应的编译工具就行,然后在命令行直接sass a.scss:b.css 编译就行了 要将ES6解析成ES5的语法形式,同样的安装好babel工具,命令行执行 babel a.js -o b.js 即可 但始终

babel无法编译?

ECMAScript 6(ES6)的发展或者说普及之快可以说是难以想象的,对很多人来说ECMAScript 5(ES5)都还普及呢.现代浏览器对ES6新特新或多或少的有些支持,但支持度不高,所以要想在浏览器中直接使用ES6的新特性,还得等上一段时间. 对ES6的普及起到至关重要的就不得不说babel了.babel可以将ES6代码完美地转换为ES5代码,所以我们不用等到浏览器的支持就可以在项目中使用ES6的特性. 对于刚开始使用babel的人,可能会碰到一些问题,因为网上对于babel的使用教程基

最详细的jsx和babel的区别

React的核心机制之一就是可以在内存中创建虚拟的DOM元素.React利用虚拟DOM来减少对实际DOM的操作从而提升性能. JSX是什么 JSX就是Javascript和XML结合的一种格式.React发明了JSX,利用HTML语法来创建虚拟DOM.当遇到<,JSX就当HTML解析,遇到{就当JavaScript解析. 如下: var child1 = React.createElement('li', null, 'First Text Content'); var child2 = Rea

babel的.babelrc解析

.babel是对于babel的全局配置,可以通过两种方式来设置 .babelrc  在根目录中创建一个文件名为 .babelrc的文件,然后在其内部添加配置即可(需要使用json格式) { "presets": ["es2015","stage-2"] } 在项目的package.json文件中指定配置: { "name": "my-package", "version": "