【Babel】Babel的API-@babel/parser

324 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

Babel的API

以babel 7.x的API为例

Babel的编译流程分为:parse、transform、generate三步,每一步都会暴露一些API出来以完成特定的功能。

Babel 的整体功能通过 @babel/core 提供,基于下面脑图上的包完成 babel 整体的编译流程,并应用 plugin 和 preset(预设)。

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

@babel/parser

@babel/parser 以前叫做 babylon默认只能解析js代码,通过指定语法插件可以解析jsx、flow、ts等非标准语法代码。

这个包提供了两个API:

  • babelParser.parse(code, [options])
  • babelParser.parseExpression(code, [options])

两者的作用都是将源码转化为AST,不过parse返回的是AST的根节点File(整个AST),而parseExpression返回的是AST根节点Expression。**

API作用返回值
parse将源码转换为ASTFile节点
parseExpression将源码转换为ASTExpression节点

上面两个API的第一个参数是要进行parse的代码字符串,第二个参数则是parse配置项,这个parse配置项可以按照作用分为两种,一种是用来配置我们要parse什么内容的,另一种则是配置我们是如何去parse的。

parse什么内容

plugins

值是一个数组,指定jsx、ts、flow等插件以解析对应的语法。

const parser = require('@babel/parser');
const ast = parser.parse("被parse的代码", {
    plugins: ['jsx'] // 解析jsx
});

allowXXX

指定一些语法是否允许,比如函数外的await【allowAwaitOutsideFunction】、未声明的export【allowUndeclaredExports

sourceType

指定是否支持解析模块语法,有3个可选值:"script", "module", "unambiguous",默认值是"script"

  • script:不解析es module语法;
  • module:解析es module语法;
  • unambiguous:根据内容是否有import和export来自动设置module还是script;

一般sourceType属性都会设置为unambiguous。

const parser = require('@babel/parser');
const ast = parser.parse("被parse的代码", {
    sourceType: 'unambiguous'
});

以什么方式进行parse

strictMode

布尔值,表示是否严格模式;

startLine

从源码哪一行开始 parse,源码默认是从第1行第0列开始解析;

startColumn

从源码哪一列开始 parse,源码默认是从第1行第0列开始解析;

errorRecovery

出错时是否记录错误并继续往下 parse;

tokens

parse 的时候是否保留 token 信息;

ranges

是否给每一个AST节点添加ranges属性:[node.start, node.end]