什么是babel

babel是一款基于node开发的工具,其功能是对es6的新语法和新特性进行转码。

#babel7的改进

babel7把各个功能进行了拆分到了不同的包中,所以我们需要对各个包的功能了解,比较常用的有以下

  1. @babel/cli : 提供了命令 babel
  2. @babel/core : 核心包
  3. @babel/preset-env : 核心的es6语法转换
  4. @babel/polyfill : 垫片 arr.reduce()
  5. @babel/runtime
  6. @babel/plugin-transform-runtime
  7. @babel/plugin-transform-xxx
 

#@babel/cli

@babel/cli是babel提供的内建的命令行工具,主要是提供babel这个命令来对js文件进行编译,这里要注意它与另一个命令行工具@babel/node的区别,首先要知道他们二者都是命令行工具,但是官方文档明确对他们定义了他们各自的使用范围:

@babel/cli 是一个适合安装在本地项目里,而不是全局安装

使用@babel/cli编译

  1. npx babel test.js
 

@babel/node 跟node cli类似,不适用在产品中,意味着适合全局安装

使用@babel/node编译

  1. babel-node test.js
 

#@babel/core

这个包是babel功能实现的核心,也就是说核心的方法都放在了这个包里边了。现在你试着用上述的转码方法转换的时候,你会发现报这样的错误:

提示找不到该@babel/core这个包

这个时候我们需要安装该包,命令如下:

  1. npm install @bable/core -D
 

现在,尝试转码!

  1. // index.es6.js
  2. const user = 23;
  3. let [length] = [];
  4. const add = (a, b) => a + b;
 

执行转码命令

  1. babel index.es6.js index.es5.js
 

发现转码后的index.es5.js文件内容如下:

  1. // index.es5.js
  2. const user = 23;
  3. let [length] = [];
  4. const add = (a, b) => a + b;
 

现在执行转码是没报错了,但是貌似没有任何变化呀!

#plugins

什么原因呢?

前边提过,babel7的时候把各个功能都拆分到不同的包里边去了,比如说需要把箭头函数转换成普通函数,就需要有对应的包去实现这个功能。这个包就是 @babel/plugin-transform-arrow-functions

类似于这样的包,在babel里被叫做plugins

我们再试一次

  1. 安装@babel/plugin-transform-arrow-functions
  1. npm install -D @babel/plugin-transform-arrow-functions
 
  1. 执行转码命令
  1. babel index.es6.js index.es5.js --plugins @babel/plugin-transform-arrow-functions
 

此时,我们去查看index.es5.js

内容如下:

  1. // index.es5.js
  2. const user = 23;
  3. let [length] = [];
  4. const add = function (a, b) {
  5. return a + b;
  6. };
 

我们发现箭头函数转换成功了,但是const,let之类的还是没成功,那么针对它们转码的包是@babel/plugin-transform-block-scoping请自行添加尝试。如果想要知道所有的插件请点击下边的链接

点击查看插件列表

如果插件很多的话,直接在命令行中输入很麻烦,那么babel给我们提供了两种方式来配置插件

  1. 在项目根目录创建.babelrc文件,内容如下:
  1. {
  2. "plugins": [
  3. "@babel/plugin-transform-arrow-functions",
  4. "@babel/plugin-transform-block-scoping"
  5. ]
  6. }
 
  1. 在项目根目录创建babel.config.js,内容如下:
  1. let plugins = [
  2. "@babel/plugin-transform-arrow-functions",
  3. "@babel/plugin-transform-block-scoping"
  4. ]
  5. module.exports = {plugins}
 

这两种配置方法都可以让我们的命令行不用写这么多内容

#presets : 预设

在理解了plugins之后,接下来要说一说presets,现在我们在使用plugins已经很方便了,但是每次配置的时候,都要写一堆的插件还要下载依然是很麻烦的,这个时候presets的作用就出来了,presets说好听点叫预设,说直白点叫插件包,它能够帮我们提前把一些要用到的插件归类好。

也就是说presets中包含了我们所需要的常用插件,如果你想要自定义一些插件,你可以presetsplugins配合在一起使用

常用的presets列表如下

  • @babel/preset-env : es6语法
  • @babel/preset-flow : flowjs
  • @babel/preset-react : react
  • @babel/preset-typescript : ts

配置的时候,是跟plugins配置在一起的,如下

实时监听

  1. npx babel ./babel -odist.js -w //./babel ---> dist.js -w:实时监听
1
  1. 使用.babelrc
  1. {
  2. "presets": [
  3. "@babel/preset-env",'@babel/preset-react'
  4. ],
  5. "plugins": [
  6. ]
  7. }
 
  1. 使用babel.config.js
  1. const plugins = [];
  2. const presets = [];
  3. module.exports = {plugins,presets}
 

#@babel/polyfill

polyfill我们又称垫片,见名知意,所谓垫片也就是垫平不同浏览器或者不同环境下的差异

因为有的环境支持这个函数,有的环境不支持这种函数,解决的是有与没有的问题,这个是靠单纯的@babel/preset-env不能解决的。

@babel/preset-env解决的是将高版本写法转化成低版本写法的问题,因为不同环境下低版本的写法有可能不同而已。

在这个包中给我们提供了浏览器一些高级特性的方法实现,比如findIndex这个方法在低版本语言中是不存在的,那么我们需要手动实现这个方法,那么这个方法的实现已经把放进了@babel/polyfill这个包中。

所以,我们只要在项目引入这个包即可

  1. index.es6.js
  2. require('@babel/polyfill')//arr.reduce
  3. // ....
 

#@babel/runtime

因为babel在转码的时候可能会生成一堆的helper(辅助函数),这些helpler被全部放在了@babel/runtime这个包里边。如果没有安装@babel/runtime在转码的时候,这些helper会直接生成在代码中。如果同样的特性都进行转码的话,会造成代码冗余。这也正是@babel/runtime存在的原因。

#@babel/plugin-transform-runtime

用了@babel/runtime只能保证提供了helper,但是还需要我们引入到我们的项目中。而@babel/plugin-transform-runtime就是来干这个事情的。

配置如下:

  1. {
  2. "plugins": [
  3. "@babel/plugin-transform-runtime"
  4. ]
  5. }
 

#后续内容敬请期待....

什么是babel的更多相关文章

  1. babel presets stage-x

    在一些新框架的代码中,常基于es6/7标准来书写代码.鉴于这些标准被没有被浏览器广泛支持,我们一般使用babel来将使用e6/7标准书写的代码降级编译(或者说转译)为浏览器可解析的es4/5代码. 以 ...

  2. ES6转换器之Babel

    ES6部分功能没有支持,所以想学习ES6,得先有个转换器,就是将ES6的代码转换为ES5. 我这里用的是Gulp + Bable的形式来将ES6转换为ES5的. 前提: (1).Gulp和Bable都 ...

  3. Babel:JavaScript编译器

    一.介绍: Babel是一个Javascript编译器,可以将ES6语法转换成ES5. 这意味着,你可以现在就用ES6编写程序,而不用担心现有环境是否支持.下面是一个例子: //转码前: input. ...

  4. 学习 React(jsx语法) + es2015 + babel + webpack

    视频学习地址: http://www.jtthink.com/course/play/575 官方地址 https://facebook.github.io/react/ 神坑: 1.每次this.s ...

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

    用Sublime Text蛮久了,配置配来配去的,每次换电脑都得重头再配过,奈何人老了脑子不中用了,得好好整理一些,下次换电脑就有得参考了.. 同事说,他的WebStorm简直太方便,自身集成了很多方 ...

  6. Babel下的ES6兼容性与规范

    前端开发 Babel下的ES6兼容性与规范   ES6标准发布后,前端人员也开发渐渐了解到了es6,但是由于兼容性的问题,仍然没有得到广泛的推广,不过业界也用了一些折中性的方案来解决兼容性和开发体系问 ...

  7. 【前端】在Gulp中使用Babel

    Install $ npm install --save-dev gulp-babel babel-preset-es2015 用法1: const gulp = require('gulp'); c ...

  8. 使用 Babel + React + Webpack 搭建 Web 应用

    话不说直接上正题. 环境搭建 Babel--目前浏览器对于ES6的语法解析支持度还不高,所以要通过转码在编译,所以在使用ES6之前要安装Babel,之前安装的时候遇到了一些问题但是没有全部记录下来,现 ...

  9. Babel 学习

    一,为了更明白地使用Babel, 先了解Babel 的发展过程. 现在Babel的版本是6, 相对于以前的版本, 它做了重大更新: 1, 模块化:所有的内部组件都变成了单独的包.打开Babel在Git ...

  10. 利用Babel来转化你的ES2015脚本初步

    我们在前面已经安装和学习过babel 安装babel-cli 这是babel解释器的客户端主程序 npm install -g babel-cli 安装”编译”插件(babel的JSX语法转换器) n ...

随机推荐

  1. Go语言实现excel导入无限级菜单结构

    目录 需求 实现 测试 简单例子 复杂例子 需求 最近有一个需求,要实现一个无限级结构的树型菜单,差不多长下面这个样子 我们知道无限级实现思路都是用一个parent_id将各种层级串联起来,顶级的pa ...

  2. 看看吧!月薪20K以上的程序员才能全部掌握RabbitMq知识,你掌握了多少

    一.RabbitMq基础知识 0.概述 消息队列的作用就是接收消息生产者的消息,然后将消息发送到消费者 1.信道channel 我的理解是生产者/消费者和rabbitmq交互的一个通道,负责交换机.队 ...

  3. springboot项目启动报错Communications link failure

    环境情况,MySQL版本如下: 报错情况如下(看上去是和数据库有关): com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communi ...

  4. Kafka入门之producer

    一些重要的参数: 1.acks指定了在给producer发送响应前,leader broker必须要确保已成功写入该消息的副本数.当前acks有3个取值,0,1,和all 2.buffer.memor ...

  5. 使用Verilog搭建一个单周期CPU

    使用Verilog搭建一个单周期CPU 搭建篇 总体结构 其实跟使用logisim搭建CPU基本一致,甚至更简单,因为完全可以照着logisim的电路图来写,各个模块和模块间的连接在logisim中非 ...

  6. 基于vue(element ui) + ssm + shiro 的权限框架

    zhcc 基于vue(element ui) + ssm + shiro 的权限框架 引言 心声 现在的Java世界,各种资源很丰富,不得不说,从分布式,服务化,orm,再到前端控制,权限等等玲琅满目 ...

  7. 第7.15节 Python中classmethod定义的类方法详解

    第7.15节  Python中classmethod定义的类方法详解 类中的方法,除了实例方法外,还有两种方法,分别是类方法和静态方法.本节介绍类方法的定义和使用. 一.    类方法的定义 在类中定 ...

  8. 第15.44节、PyQt输入部件:QAbstractSlider派生类QScrollBar滚动条、QSlider滑动条、QDial刻度盘功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 Designer中的输入部件Horizo ...

  9. PyQt(Python+Qt)学习随笔:QDockWidget停靠部件的dockWidgetArea和docked属性

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 dockWidgetArea和docked属性这两个属性在Design ...

  10. 【JAVA并发第一篇】Java的进程与线程

    1.进程与线程 1.1.进程 进程可以看作是程序的执行过程.一个程序的运行需要CPU时间.内存空间.文件以及I/O等资源.操作系统就是以进程为单位来分配这些资源的,所以说进程是分配资源的基本单位. ( ...