你真的会babel吗?

258 阅读2分钟

babel是什么

我们通常使用babel来将高版本的javascript代码(ES6+)转换成ES5的代码,因为有的浏览器不支持ES6+一些新的语法和API

安装

在你的工程文件下执行

npm install --save-dev @babel/core @babel/cli @babel/preset-env

或者

yarn add  @babel/core @babel/cli @babel/preset-env -D
  • @babel/cli是Babel命令行转码工具,如果我们使用命令行进行Babel转码就需要安装它。
  • @babel/cli依赖@babel/core,因此也需要安装@babel/core这个Babel核心npm包。
  • @babel/preset-env 这个预设主要用来转译esnext到目标环境支持的js,所以这个预设基本都要安装

怎么配置

前提

💡 1. presets 预设数组,pulgins 插件数组,
  • 每个插件或预设都是一个npm包
  • 预设是一组Babel插件的集合,预设也可以是插件和其它预设的集合
  1. 很多配置文件以rc结尾,rc是运行控制文件  run control的意思
  2. babel一般配置的时候默认可以使用短名称,但是还是推荐使用全称

插件@babel/plugin-xxx,短名称可以写成@babel/xxx,甚至可以缩写到xxx

预设@babel/preset-env的短名称就是@babel/env,甚至可以缩写到env

  1. 要使用对应的预设或者插件的话要执行npm install 插件/预设或者yarn add 插件/预设进行安装

执行顺序

  • 插件预设先执行
  • 插件执行顺序是插件数组从前向后
  • 预设是从后向前

配置文件

Babel执行时会默认在当前目录寻找的Babel配置文件(以下配置方法选择其一就好)

例子中的es2015是babel7前的用法,

  • babel.config.js
module.exports = {
    "presets": ["es2015", "react"],
    "plugins": ["transform-decorators-legacy", "transform-class-properties"]
  }
  • .babelrc
{
    "presets": ["es2015", "react"],
    "plugins": ["transform-decorators-legacy", "transform-class-properties"]
  }
  • .babelrc.js
module.exports = {
    "presets": ["es2015", "react"],
    "plugins": ["transform-decorators-legacy", "transform-class-properties"]
  }
  • 还可以直接将配置参数写在package.json
{
    "name": "demo",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1"
    },
    "author": "",
    "babel": {
      "presets": ["es2015", "react"],
      "plugins": ["transform-decorators-legacy", "transform-class-properties"]
    }
  }
  • 写在构建工具的配置里(eg:webpack)
rules: [
  {
    test: /\.js$/,
    use: {
      loader: 'babel-loader'
    },
  }
]

主要作用

语法转换

通过配置预设/插件来进行esnext的语法转换,常用的插件像@babel/preset-env

补齐API

💡 Babel默认只转换新的JavaScript语法(syntax),而不转换新的 API。

新的API分为两类,

  • 一是Promise、Map、Symbol、Proxy、Iterator等全局对象及其对象自身的方法
  • 二是新的实例方法,例如数组实例方法[1, 4, -5, 10].find((item) => item < 0)

如果想让ES6新的API在低版本浏览器正常运行,我们就需要做polyfill,来补齐不同浏览器之间的差异

有以下几种方法:

  1. 直接在html文件引入Babel官方的polyfill.js脚本文件;
  2. 在前端工程的入口文件里引入polyfill.js;
  3. 在前端工程的入口文件里引入@babel/polyfill;
  4. 在前端工程的入口文件里引入core-js/stable与regenerator-runtime/runtime;( @babel/polyfill本质是由两个npm包core-js与regenerator-runtime组合而成的
  5. 在前端工程构建工具的配置文件入口项引入polyfill.js;
  6. 在前端工程构建工具的配置文件入口项引入@babel/polyfill;
  7. 在前端工程构建工具的配置文件入口项引入core-js/stable与regenerator-runtime/runtime;

相关包,常用插件和预设

重要的包

  • @babel/cli是Babel命令行转码工具,如果我们使用命令行进行Babel转码就需要安装它。
  • @babel/cli依赖@babel/core,因此也需要安装@babel/core这个Babel核心npm包。

预设

  1. @babel/preset-env这个npm包提供了ES6转换ES5的语法转换规则,我们在Babel配置文件里指定使用它。如果不使用的话,也可以完成转码,但转码后的代码仍然是ES6的,相当于没有转码。
  • @babel/preset-flow
  • @babel/preset-react
  • @babel/preset-typescript

插件

  • @babel/plugin-transform-runtime

    • 自动移除语法转换后内联的辅助函数,使用@babel/runtime/helpers里的辅助函数来替代
    • (像ES6类转换后会生成很多辅助函数,如果很多处都用到了类,引用这个插件可以使得转换后要用到辅助函数的地方,直接使用@babel/runtime/helpers里的辅助函数,而不用重新定义)
    • 同时需要安装@babel/runtime包提供辅助函数模块

实践

一个完整的Babel转码工程通常包括如下:

  • Babel配置文件
  • Babel相关的npm包
  • 需要转码的JS文件

参考

本文大多数都是参考这个babel教程,写得很详细,建议有空的同学可以看一下

www.jiangruitao.com/babel/