携手创作,共同成长!这是我参与「掘金日新计划 · 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 | 将源码转换为AST | File节点 |
parseExpression | 将源码转换为AST | Expression节点 |
上面两个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]