babe基础知识

141 阅读3分钟

Babel的介绍

Babel是一个javaScript编译器,主要用于将ECMAScript2015+语法编写的代码转换为向后兼容的Javascript的代码,以便能够运行在当前和旧版本的浏览器或其他环境中。 Babel的主要功能:

  • 语法转换
  • 通过polyfill的方法补充目标环境缺失的功能。(通过引入三方的polyfill模块,比如core-js)。
  • 源码转换

Babel还支持:

  • jsx语法转换
  • typescrip、flow语法转换
  • sourceMap
  • 自定义插件(通过自定义插件可以对源码进行修改)

babel本身不会进行类型检查,需要配合typescript、flow等工具一起使用,babel的用途是将ts、flow转换为js代码

一、babel的安装和使用

yarn add @babel/core @babel/cli @babel/preset-env

@babel/core:babel的核心模块,负责代码的转换和生成。 @babel/cli:babel的命令和工具 @babel/preset-env:babel的转换规则的预设。

根目录下新建babel.config.json配置文件

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "edge": "17",
          "firefox": "60",
          "chrome": "67",
          "safari": "11.1"
        },
        "useBuiltIns": "usage",
        "corejs": "3.6.5"
      }
    ]
  ]
}

执行下面的命令将src目录下的代码编译到lib目录:

./node_modules/.bin/babel src --out-dir lib

还可以直接在代码中引入babel提供的api进行代码的转换:

const babel = require('@babel/core');
let code = `const a = 1;`
const result = babel.transformSync(code,{});
console.log(result.code);

@babel/cli提供了命令行工具, 可以直接在命令行中使用。

// 编译src目录下的代码到lib目录
./node_modules/.bin/babel src --out-dir lib
./node_modules/.bin/babel src --out-dir  lib --watch // 监听src目录下的文件变化,自动编译

二、插件和预设

2.1插件

在babel中代码的转换是通过插件和预设来实现的。babel官方也提供了很多的插件,例如@babel/plugin-transform-arrow-functions用于将箭头函数转为普通函数。

yarn add @babel/plugin-transform-arrow-functions

./node_modules/.bin/babel src --out-dir lib --plugins=@babel/plugin-transform-arrow-functions

除此之外还可以自定义插件,使用自定义插件可以对源码进行修改。

// 一个插件就是一个函数
export default function({ types: t }) {
  return {
    visitor: {
      Identifier(path) {
        if (path.node.kind === "let") { //let转成var
          path.node.kind = "var";
        }
      },
    },
  };
}

2.2预设

预设就是一组插件的集合,制定了插件的转换规则。除此之外,还可以根据自己需要的插件组合成一个预设并将其分享出去。下面的@babel/preset-env是babel官方提供的预设。

./node_moduels/.bin.babel src --out-dir lib --presets=@babel/preset-env

三、babel的配置

babel有多种配置方式:

  • babel.config.*
  • .babelrc.*
  • .babelrc
  • package.json

最新版本中官方推荐使用babel.config.json作为配置文件

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

还有一种比较实用的配置方式是使用js作为配置文件,可以根据环境变量等去动态的加载不同的插件和预设。

// babel.confog.js
module.exports = function(options){
  let presets =  options.presets;
  let plugins = options.plugins;
  if(process.env.NODE_ENV === 'development'){
    presets.push('@babel/preset-env');
    plugins.push('@babel/plugin-transform-react-jsx');
  }
  return {presets, plugins};
}

在packgage.json中配置

{
  "name": "my-project",
  "version": "1.0.0",
  "babel":{
    "presets": [],
    "plugins":[]
  }
}

在命令行中配置

./node_modules/.bin/babel src --out-dir lib --config-file=babel.config.js

手动调用babel.transform()方法的时候进行配置

const babel = require('@babel/core');
let code = `const a = 1;`
babel.transform(code,{
  ast: false,
  map: false,
  inputSourceMap: false,
  presets: ['@babel/preset-env'],
  plugins: ['@babel/plugin-transform-arrow-functions']
});

这些配置可以同时存在,当它们同时出现的时候,babel会将重复的配置进行覆盖和合并,它们的优先级是: babel.config.json< .babelrc.json < cli中的配置