对Babel的研究1

zhongweinan 2020-01-21

@babel/parser

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

  • 默认情况下启用了最新的ECMAScript版本(ES2017)。
  • 评论附件。
  • 支持JSX,Flow,Typescript。
  • 支持实验语言建议(至少在阶段0接受任何PR )。

学分

由于@RReverser@marijnh的出色工作,因此很大程度上基于acornacorn- jsx

API

babelParser.parse(code, [options])

babelParser.parseExpression(code, [options])

parse()将提供的内容解析code为整个ECMAScript程序,同时 parseExpression()尝试解析单个Expression并考虑性能。如有疑问,请使用.parse()

选件

  • allowImportExportEverywhere:默认情况下,importexport 声明只能出现在一个节目的顶尖水平。将此选项设置为true允许它们在允许语句的任何位置。

  • allowAwaitOutsideFunction:默认情况下,await仅允许在异步函数内部使用,或者在topLevelAwait启用插件后在模块的顶级范围内使用。将其设置为true在脚本的顶级范围内也接受它。

  • allowReturnOutsideFunction:默认情况下,顶层的return语句会引发错误。设置true为接受这样的代码。

  • allowSuperOutsideMethod:默认情况下,super不允许在类和对象方法之外使用。设置true为接受这样的代码。

  • allowUndeclaredExports:默认情况下,导出在当前模块作用域中未声明的标识符将引发错误。尽管ECMAScript模块规范要求此行为,但是Babel的解析器无法在以后可能会插入适当声明的插件管道中预期转换,因此有时设置此选项true以防止解析器过早地抱怨未声明的导出会很重要。稍后添加。

  • createParenthesizedExpressions:默认情况下,解析器extra.parenthesized在表达式节点上设置。当此选项设置为trueParenthesizedExpression都转而创建AST节点。

  • errorRecovery:默认情况下,Babel在发现一些无效代码时总是抛出错误。当此选项设置true为时,它将存储解析错误并尝试继续解析无效的输入文件。生成的AST将具有一个errors表示所有解析错误数组属性。请注意,即使启用此选项,@babel/parser也可能引发不可恢复的错误。

  • plugins:包含要启用的插件的数组。

  • sourceType的:指明模式的代码应解析可以是一个。"script""module""unambiguous"默认为"script""unambiguous"根据ES6 语句的存在使@ babel / parser尝试猜测带有ES6 文件将被考虑,否则为importexportimportexport"module""script"

  • sourceFilename:将输出的AST节点与其源文件名相关联。从多个输入文件的AST生成代码和源映射时很有用。

  • startLine:默认情况下,解析的第一行代码被视为第1行。您可以提供一个行号来替代。与其他源工具集成时很有用。

  • strictMode:默认情况下,仅当存在"use strict";指令或所解析的文件为ECMAScript模块时,ECMAScript代码才会被解析为严格 将此选项设置true为始终以严格模式解析文件。

  • rangeranges向每个节点添加一个属性:[node.start, node.end]

  • 令牌:将所有已解析的令牌添加到节点tokens上的属性中File

输出量

Babel解析器根据Babel AST格式生成AST 它基于ESTree规范,但存在以下差异:

现在有一个estree可以恢复这些偏差插件

AST for JSX代码基于Facebook JSX AST

森弗

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

例如:我们将问题修复到#107之类的早期错误-每个文件有多个默认导出。即使会导致构建失败,也可以将其视为错误修复。

require("@babel/parser").parse("code", { // parse in strict mode and allow module declarations sourceType: "module", plugins: [ // enable jsx and flow syntax "jsx", "flow" ] });

外挂程式

名称代码示例
estree回购不适用

语言扩展

名称代码示例
flow回购var a: string = "";
flowCommentsdocs/*:: type Foo = {...}; */
jsx回购<a attr="b">{s}</a>
typescript回购var a: string = "";
v8intrinsic%DebugPrint(foo);

ECMAScript 建议

名称代码示例
asyncGenerators提案async function*() {}, for await (let a of b) {}
bigInt提案100n
classProperties提案class A { b = 1; }
classPrivateProperties提案class A { #b = 1; }
classPrivateMethods提案class A { #c() {} }
decorators提案
decorators-legacy
@a class A {}
doExpressions提案var a = do { if (true) { ‘hi‘; } };
dynamicImport提案import(‘./guy‘).then(a)
exportDefaultFrom提案export v from "mod"
exportNamespaceFrom提案export * as ns from "mod"
functionBind提案a::b, ::console.log
functionSentfunction.sent
importMeta提案import.meta.url
logicalAssignment提案a &&= b
nullishCoalescingOperator提案a ?? b
numericSeparator提案1_000_000
objectRestSpread提案var a = { b, ...c };
optionalCatchBinding提案try {throw 0;} catch{do();}
optionalChaining提案a?.b
partialApplication提案f(?, a)
pipelineOperator提案a |> b
throwExpressions提案() => throw new Error("")
topLevelAwait提案await promise 在模块中

相关推荐