Babel介绍

什么是Babel?

Babel是一套主要用来将使用ECMAScript2015+语法编写的代码转换成纯ES5的Javascript代码的工具,以兼容任何老式浏览器与运行环境。

Babel可以做什么?

Babel可以用来编译ES6+的语法,它使所有ES6+规范新增的语法糖都可用,包括:类(class),箭头函数(arrow function),多行字符串等等。它的功能包括但不限于:

1.Javascript语法转换;

2.使用ployfill特性使你的浏览器兼容各类全局web api(例如:promise,async await);

3.源代码转换;

Babel代码转换流程

@babel/core作为Babel的核心包,主要负责代码的转换工作。其内部使用了@babel/parser,@babel/traverse,@babel/generator三个工具来负责代码的转译过程。

parser:内部依赖acorn和acorn-jsx,将js代码解析为抽象语法树;

traverse:修改parser解析后的抽象语法树;

generator:解析traverse编辑后的抽象语法树,生成对应的es5语法;

Babel的代码转换其实是一个线性的流程,依次经历解析,转换,生成三个阶段。

Plugins和Presets

Plugin是Babel提供的用来帮助代码转换的工具,它主要在抽象语法树的转换阶段发挥作用,也就是traverse阶段。如果我们不使用任何plugins,源代码经过babel编译后会原样输出(不会保留原有代码格式)。Plugin则会告知babel如何转换我们的代码。

Babel提供了很多的plugins用来转换代码,其细粒度精确到每一种ECMAScript2015+语法,例如@babel/plugin-transform-arrow-functions负责转换箭头函数,@babel/plugin-proposal-object-rest-spread用来转换对象扩展运算符。同时babel的plugin还做了对框架语法的兼容,比如对react的jsx的转换。我们可以根据项目需求自行选定不同的插件。

上面提到了babel的plugins,plugins虽然功能丰富,但是es5+新出的语法还是比较多的,如果一个一个安装的话未免太麻烦,幸好babel提供了另外一种工具——presets。

如果把一个plugin比作一种工具,则presets则是工具箱。Presets是一组plugins的集合,用来转换一类语法。在实际项目中最常用preset便是@babel/preset-env了,它非常聪明可以帮助我们转换所有最新的Ecmascirpt标准语法。因此再也不需要去根据项目中使用到的语法而一个一个的安装插件,非常方便并且可以减小打包体积。

Polyfill

笔者曾经在开发的时候遇到过一个问题,webpack和babel都已经配置好,并且项目也可以在chrome中正常运行,但是在ie浏览器中却一直报错。找了一圈后来发现是项目中使用promise和async await的问题。于是我回头看了项目内babel配置,该用的插件也都用了,那么问题到底出在哪里呢?后来回顾了一个babel文档,才发现promise和async并不属于ES规范语法,而是全局api。

Polyfill就是babel提供的可以帮助我们兼容这些内建api的工具。这意味着您可以使用新的内置函数(例如Promise或WeakMap),静态方法(例如Array.from或Object.assign),实例方法(例如Array.prototype.includes)和生成器函数(前提是您使用了regenerator插件)。 为了做到这一点,polyfill将诸如String之类的本地原型添加到了全局范围。

Babel常用配置

Babel的配置可以说是非常简单了。Babel官方提供了两种配置文件以供选择:

babel.config.js: 使用编程的方式来进行配置;

module.exports = function (api) {
  api.cache(true);

  const presets = [ ... ];
  const plugins = [ ... ];

  return {
    presets,
    plugins
  };

.babelrc:静态配置,仅适用于单个程序包;

{
  "presets": [...],
  "plugins": [...]
}

如果项目中使用了webpack,则需要在webpack配置文件内配置babel-loader以启用babel配置

//webpack.config.js
module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: ‘babel-loader‘,
      }
    ]
  },
//.babelrc
{
  "presets": [
    ["@babel/preset-env"],
    ["@babel/preset-react"]
  ]
}

或者

//webpack.config.js
module: {
  rules: [
    {
      test: /\.js$/,
      exclude: /node_modules/,
      use: {
        loader: ‘babel-loader‘,
        options: {
          presets: [‘@babel/preset-env‘, "@babel/preset-react"],
        }
      }
    }
  ]
},
(此种配置方式无需配置babel配置文件)

如果项目中需要用到polyfill,可以将其在项目入口文件顶部引入或者加入到webpack配置文件的入口配置:

//index.js
require(‘@babel/polyfill‘);
  or
import ‘@babel/poltfill‘;  
//webpack.config.js
entry: [‘@babel/polyfill‘, ‘./index.js‘],

注意在babel7.4.0之后的版本polyfill将会被弃用,建议您直接使用polyfill包含的core-js/stable和regenerator-runtime/runtime。

//index.js
import "core-js/stable";
import "regenerator-runtime/runtime";

如果您觉得直接引入core-js会增大打包体积,也可以使用按需引入的方式:

//index.js
import ‘core-js/features/promise‘;
import ‘core-js/features/array/from‘;

原文地址:https://www.cnblogs.com/wangshuai1993/p/11989205.html

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

Babel介绍的相关文章

webpack配合babel使用

一.babel介绍 ①Babel 是一个 JavaScript 编译器,可以把ES6的语法转为兼容浏览器的ES5语法 ②Babel中文官网:https://www.babeljs.cn/ ③Babel可以单独使用,但是一般都是和webpack结合一起使用 二.webpack里使用babel 1.babel-loader babel-core babel-preset-env (转换语法) ①安装依赖: // 已经在项目里安装了webpack的情况下 npm install --save-dev

JavaScript 学习笔记-- ES6学习(一)介绍以及Babel的使用

本文摘自阮一峰老师的<ECMAScript 6入门>,原文地址:http://es6.ruanyifeng.com/#docs/intro ECMAScript 6 是一个泛指,含义是5.1版本后的JavaScript的下一代标准,涵盖了ES2015, ES2016, ES2017等. Babel转码器是一个广泛使用的ES6转码器,可以将ES6转码为ES5. 配置文件:.babelrc 配置文件基本格式: // .babelrc{ "presets": [], "

[转]WebPack 常用功能介绍

概述 Webpack是一款用户打包前端模块的工具.主要是用来打包在浏览器端使用的javascript的.同时也能转换.捆绑.打包其他的静态资源,包括css.image.font file.template等.个人认为它的优点就是易用,而且常用功能基本都有,另外可以通过自己开发loader和plugin来满足自己的需求.这里就尽量详细的来介绍下一些基本功能的使用. 安装 npm install webpack 运行webpack webpack需要编写一个config文件,然后根据这个文件来执行需

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

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

KoaHub.js可借助 Babel 编译稳定运行在 Node.js 环境上

koahubjs KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Function, Class, Async & Await)等特性,借助 Babel 编译,可稳定运行在 Node.js 环境上. 介绍 KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Function, Class, Async &am

使用async/await——Nodejs+ExpressJs+Babel

在使用诸如restify/expressjs等Nodejs Web Framework时,我们最头疼的问题就是回调黑洞. 虽然后又Koa/Koa2号称"The Next Framework"使用co解决问题,但是核心this的设计和各种小流middleware对req/res的随意滥用,导致我对这个框架失去好感. Expressjs依然是我在使用Nodejs编写API和Web时的首选框架. 在使用Expressjs时,如果我们也想使用await/async这些在ES7 stage-3中

babel如此简单

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

[译]使用Babel和Broserify创建你的ES6项目

原文地址:Setting up an ES6 Project Using Babel and Browserify JavaScript的发展日新月异,ES6很快就要接管JS了.很多著名的框架像AngularJS 2.React Native已经开始支持ES6了.我们是时候准备拥抱变化了,所以我们应该开始在几乎所有的浏览器支持之前使用ES6码代码了. 本文将要介绍如何使用Babel和Browerify来创建项目并且编写能够运行在老版本浏览器上的现代代码.Babel将ES6代码编译为大多数浏览器(

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

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