Babel 解析器(以前称为 Babylon)是
Babel
中使用的 JavaScript 解析器。
默认启用最新的 ECMAScript 版本 (ES2020)。
Comment attachment.
支持 JSX、Flow、Typescript。
支持实验性语言提案(接受至少
stage-0
的任何内容的 PR)。
很大程度上基于
acorn
和
acorn-jsx
,感谢
@RReverser
和
@marijnh
的出色工作。
parse()
将提供的
code
解析为整个 ECMAScript 程序,而
parseExpression()
尝试在考虑性能的情况下解析单个表达式。如有疑问,请使用
.parse()
。
Options
​
History
estree
(
repo
)
Version
|
Changes
|
v7.21.0
|
新增
allowNewTargetOutsideFunction
和
annexb
|
v7.16.0
|
Added
startColumn
|
v7.15.0
|
Added
attachComment
|
v7.7.0
|
Added
errorRecovery
|
v7.5.0
|
Added
allowUndeclaredExports
|
v7.2.0
|
Added
createParenthesizedExpressions
allowedImportExportEverywhere:默认情况下,
import
和
export
声明只能出现在程序的顶层。将此选项设置为
true
允许它们在允许语句的任何地方。
allowAwaitOutsideFunction:默认情况下,仅允许在异步函数内部使用
await
,或者当启用
topLevelAwait
插件时,在模块的顶级范围内使用
await
。将其设置为
true
也可以在脚本的顶级范围中接受它。不建议使用此选项,而建议使用
topLevelAwait
插件。
allowedNewTargetOutsideFunction:默认情况下,不允许在函数或类之外使用
new.target
。将其设置为
true
以接受此类代码。
allowedReturnOutsideFunction:默认情况下,顶层的 return 语句会引发错误。将其设置为
true
以接受此类代码。
allowedSuperOutsideMethod:默认情况下,不允许在类和对象方法之外使用
super
。将其设置为
true
以接受此类代码。
allowedUndeclaredExports:默认情况下,导出未在当前模块范围中声明的标识符将引发错误。虽然 ECMAScript 模块规范要求这种行为,但 Babel 的解析器无法预测插件管道中稍后可能插入适当声明的转换,因此有时将此选项设置为
true
很重要,以防止解析器过早地抱怨未声明的导出:稍后会添加。
AttachComment:默认情况下, Babel 将注释附加到相邻的 AST 节点。当此选项设置为
false
时,不附加注释。当输入代码有很多注释时,它可以提供高达 30% 的性能提升。
@babel/eslint-parser
将为您设置。不建议将
attachComment: false
与 Babel 转换一起使用,因为这样做会删除输出代码中的所有注释,并使
/* istanbul ignore next */
等注释不起作用。
annexb:默认情况下, Babel 根据
ECMAScript's Annex B "Additional ECMAScript Features for Web Browsers"
语法解析 JavaScript 。当此选项设置为
false
时, Babel 将解析不带特定于附件 B 的扩展的语法。
createParenthesizedExpressions:默认情况下,解析器在表达式节点上设置
extra.parenthesized
。当此选项设置为
true
时,将创建
ParenthesizedExpression
AST 节点。
errorRecovery:默认情况下, Babel 在发现某些无效代码时总是抛出错误。当此选项设置为
true
时,它将存储解析错误并尝试继续解析无效的输入文件。生成的 AST 将具有一个
errors
属性,表示所有解析错误的数组。请注意,即使启用此选项,
@babel/parser
也可能引发不可恢复的错误。
plugins:包含您要启用的插件的数组。
sourceType:指示解析代码的模式。可以是
"script"
、
"module"
或
"unambiguous"
之一。默认为
"script"
。
"unambiguous"
将使 @babel/parser 尝试根据 ES6
import
或
export
语句的存在进行猜测。具有 ES6
import
和
export
的文件被视为
"module"
,否则被视为
"script"
。
sourceFilename:将输出 AST 节点与其源文件名相关联。从多个输入文件的 AST 生成代码和源映射时非常有用。
startColumn:默认情况下,解析的代码被视为从第 1 行第 0 列开始。您可以提供一个列号作为开始。对于与其他源工具集成很有用。
startLine:默认情况下,解析的代码被视为从第 1 行第 0 列开始。您可以提供行号作为开始。对于与其他源工具集成很有用。
strictMode:默认情况下,仅当存在
"use strict";
指令或解析的文件是 ECMAScript 模块时,ECMAScript 代码才会被解析为严格。将此选项设置为
true
以始终以严格模式解析文件。
Ranges:向每个节点添加
range
属性:
[node.start, node.end]
tokens:将所有已解析的令牌添加到
File
节点上的
tokens
属性
Babel 解析器根据
Babel AST format
生成 AST。它基于
ESTree spec
,但有以下偏差:
Literal
令牌替换为
StringLiteral
、
NumericLiteral
、
BigIntLiteral
、
BooleanLiteral
、
NullLiteral
、
RegExpLiteral
Property
令牌替换为
ObjectProperty
和
ObjectMethod
MethodDefinition
替换为
ClassMethod
和
ClassPrivateMethod
PropertyDefinition
替换为
ClassProperty
和
ClassPrivateProperty
PrivateIdentifier
替换为
PrivateName
Program
和
BlockStatement
包含附加
directives
字段以及
Directive
和
DirectiveLiteral
FunctionExpression
中的
ClassMethod
、
ClassPrivateMethod
、
ObjectProperty
和
ObjectMethod
value 属性的属性被强制/带入主方法节点。
ChainExpression
替换为
OptionalMemberExpression
和
OptionalCallExpression
ImportExpression
替换为
CallExpression
,
callee
是
Import
节点。
现在有一个
estree
插件可以恢复这些偏差
JSX 代码的 AST 基于
Facebook JSX AST
。
在大多数情况下, Babel 解析器遵循 semver。唯一需要注意的是,一些符合规范的错误修复可能会在补丁版本中发布。
例如:我们修复了
#107
等早期错误 - 每个文件有多个默认导出。这将被视为错误修复,即使它会导致构建失败。
Example
​
require("@babel/parser").parse("code", {
sourceType: "module",
plugins: [
"jsx",
"flow",
|
Code Example
|
Version
|
Changes
|
v7.6.0
|
Added
v8intrinsic
|
v7.15.0
|
在
pipelineOperator
的
proposal
选项中添加了
hack
。将
topLevelAwait
、
privateIn
移至最新的 ECMAScript 功能
|
v7.14.0
|
添加了
asyncDoExpressions
。将
classProperties
、
classPrivateProperties
、
classPrivateMethods
、
moduleStringNames
移至最新的 ECMAScript 功能
|
v7.13.0
|
Added
moduleBlocks
|
v7.12.0
|
新增
classStaticBlock
、
moduleStringNames
|
v7.11.0
|
Added
decimal
|
v7.10.0
|
Added
privateIn
|
v7.9.0
|
Added
recordAndTuple
|
v7.7.0
|
Added
topLevelAwait
|
v7.4.0
|
Added
partialApplication
|
v7.2.0
|
Added
classPrivateMethods
以下功能已在最新版本的
@babel/parser
上启用,并且无法禁用,因为它们是该语言的一部分。仅当您使用旧版本时才应启用这些功能。
|
Code Example
|
7.19.0
|
recordAndTuple
插件的
syntaxType
选项默认为
hash
;为
decorators
插件添加了
allowCallParenthesized
选项。
|
7.17.0
|
将
@@
和
^^
添加到
hack
管道运算符的
topicToken
选项
|
7.16.0
|
为
typescript
插件添加了
disallowAmbiguousJSXLike
。将
^
添加到
hack
管道运算符的
topicToken
选项
|
7.14.0
|
为
typescript
插件添加了
dts
|
注意:当多次指定插件时,仅考虑第一个选项。
decorators
:
allowCallParenthesized
(
boolean
,默认为
true
)
当
false
时,不允许
@(...)()
形式的装饰器,而支持
@(...())
。第 3 阶段装饰器提案使用
allowCallParenthesized: false
。
decoratorsBeforeExport
(
boolean
)
默认情况下,导出类上的装饰器可以放置在
export
关键字之前或之后。设置此选项后,装饰器将仅允许出现在指定位置。
export class C {}
export @dec class C {}
⚠️ 此选项已弃用,并将在未来版本中删除。当此选项显式设置为
true
或
false
时有效的代码在未设置此选项时也有效。
pipelineOperator
:
proposal
(必需,可接受的值:
minimal
、
fsharp
、
hack
、
smart
(已弃用)) 对于管道运算符有几种不同的建议。此选项选择要使用的建议。请参阅
plugin-proposal-pipeline-operator
了解更多信息,包括比较其行为的表格。
topicToken
(当
proposal
为
hack
时需要,可接受的值:
%
、
#
、
^
、
@@
、
^^
)
hack
提案在其管道中使用“主题”占位符。该主题占位符有两种不同的选择。此选项选择使用什么标记来引用该主题。
topicToken: "#"
与
recordAndTuple
和
syntaxType: "hash"
不兼容。请参阅
plugin-proposal-pipeline-operator
了解更多信息。
recordAndtuple
:
syntaxType
(
hash
或
bar
,默认为
hash
)
recordAndTuple
有两种语法变体。它们共享完全相同的运行时语义。| 语法类型 | 记录示例| 元组示例 | | ---| ---| ---| |
"hash"
|
"hash"
|
#{ a: 1 }
|
#[1, 2]
| |
"bar"
|
{| a: 1 |}
|
[|1, 2|]
| 请参阅
Ergonomics of
#{}
/
#[]
了解更多信息。
flow
:
all
(
boolean
,默认值:
false
)某些代码在 Flow 和普通 JavaScript 中具有不同的含义。例如,
foo<T>(x)
在 Flow 中被解析为带有类型参数的调用表达式,但根据 ECMAScript 规范被解析为比较 (
foo < T > x
)。默认情况下,仅当文件以
// @flow
编译指示开头时,
babel-parser
才会将这些不明确的构造解析为 Flow 类型。将此选项设置为
true
以始终解析文件,就像指定了
// @flow
一样。
typescript
dts
(
boolean
,默认
false
)此选项将在 TypeScript 环境上下文中启用解析,其中某些语法具有不同的规则(例如
.d.ts
文件和
declare module
块内部)。有关环境上下文的更多信息,请参阅
https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html
和
https://basarat.gitbook.io/typescript/type-system/intro
。
disallowAmbiguousJSXLike
(
boolean
,默认
false
)即使未启用
jsx
插件,此选项也不允许使用与 JSX 不明确的语法(
<X> y
类型断言和
<X>() => {}
类型参数)。它与解析
.mts
和
.mjs
文件时的
tsc
行为相匹配。
Error codes
​
History
Version
|
Changes
|
v7.14.0
|
添加了错误代码
|
错误代码对于处理
@babel/parser
引发的错误很有用。
有两个错误代码:
code
和
reasonCode
。
code
-
错误的粗略分类(例如
BABEL_PARSER_SYNTAX_ERROR
、
BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED
)。
reasonCode
-
错误的详细分类(例如
MissingSemicolon
、
VarRedeclaration
)。
使用
errorRecovery
错误代码的示例:
const { parse } = require("@babel/parser");
const ast = parse(`a b`, { errorRecovery: true });
console.log(ast.errors[0].code);
console.log(ast.errors[0].reasonCode);
上一期:
#1351
、
#6694
。
我们目前不愿意承诺支持插件 API 或由此产生的生态系统(已经有足够的工作来维护 Babel 自己的插件系统)。目前尚不清楚如何使该 API 有效,并且它将限制我们重构和优化代码库的能力。
对于那些想要创建自己的自定义语法的用户,我们当前的建议是分叉解析器。
要使用自定义解析器,您可以向
options
添加一个插件,以通过其 npm 包名称调用解析器,或者如果使用 JavaScript,则需要它,
const parse = require("custom-fork-of-babel-parser-on-npm-here");
module.exports = {
plugins: [
parserOverride(code, opts) {
return parse(code, opts);
© 2014-present Sebastian McKenzie
Licensed under the MIT License.
https://babeljs.io/docs/babel-parser/