添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

@babel/parser

Babel 解析器(以前称为 Babylon)是 Babel 中使用的 JavaScript 解析器。

  • 默认启用最新的 ECMAScript 版本 (ES2020)。
  • Comment attachment.
  • 支持 JSX、Flow、Typescript。
  • 支持实验性语言提案(接受至少 stage-0 的任何内容的 PR)。
  • Credits ​

    很大程度上基于 acorn acorn-jsx ,感谢 @RReverser @marijnh 的出色工作。

    API ​ babelParser.parse(code, [options]) ​ babelParser.parseExpression(code, [options]) ​

    parse() 将提供的 code 解析为整个 ECMAScript 程序,而 parseExpression() 尝试在考虑性能的情况下解析单个表达式。如有疑问,请使用 .parse()

    Options ​
    History
    estree ( repo )

    Language extensions ​
    History

    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 属性

  • Output ​

    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

    Semver ​

    在大多数情况下, Babel 解析器遵循 semver。唯一需要注意的是,一些符合规范的错误修复可能会在补丁版本中发布。

    例如:我们修复了 #107 等早期错误 - 每个文件有多个默认导出。这将被视为错误修复,即使它会导致构建失败。

    Example ​
    require("@babel/parser").parse("code", {
      // 以严格模式解析并允许模块声明
      sourceType: "module",
      plugins: [
        // 启用 jsx 和 flow 语法
        "jsx",
        "flow",
    

    Plugins​

    Miscellaneous​

    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

    最新 ECMAScript 功能 ​

    以下功能已在最新版本的 @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 关键字之前或之后。设置此选项后,装饰器将仅允许出现在指定位置。

    // 装饰器BeforeExport:  true
    export class C {}
    // 装饰器BeforeExport:  false
    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 &ZeroWidthSpace;
    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); // BABEL_PARSER_SYNTAX_ERROR
    console.log(ast.errors[0].reasonCode); // MissingSemicolon

    FAQ &ZeroWidthSpace;

    Babel 解析器支持插件系统吗? &ZeroWidthSpace;

    上一期: #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/