From:Taro 多端开发实现原理与项目实战

Babel 模块

Babel 是一个通用的多功能的 JavaScript 编译器,更确切地说是源码到源码的编译器,通常也叫做转换编译器(transpiler)。 意思是说你为 Babel 提供一些 JavaScript 代码,Babel 更改这些代码,然后返回给你新生成的代码。
此外它还拥有众多模块可用于不同形式的静态分析。

静态分析是在不需要执行代码的前提下对代码进行分析的处理过程(执行代码的同时进行代码分析即是动态分析)。 静态分析的目的是多种多样的, 它可用于语法检查、编译、代码高亮、代码转换、优化和压缩等等场景。

Babel 实际上是一组模块的集合,拥有庞大的生态。

Taro 项目的代码编译部分就是基于 Babel 的以下模块实现的:

  • Babylon - Babel 的解析器。最初是从 Acorn 项目 fork 出来的。Acorn 非常快,易于使用,并且针对非标准特性(以及那些未来的标准特性) 设计了一个基于插件的架构。
  • Babel-traverse - 负责维护整棵树的状态,并且负责替换、移除和添加节点。
  • Babel-types - 一个用于 AST 节点的 Lodash 式工具库, 它包含了构造、验证以及变换 AST 节点的方法。 该工具库包含考虑周到的工具方法,对编写处理 AST 逻辑非常有用。
  • Babel-generator - Babel 的代码生成器,它读取 AST 并将其转换为代码和源码映射(sourcemaps)。
  • Babel-template - 另一个虽然很小但却非常有用的模块。 它能让你编写字符串形式且带有占位符的代码来代替手动编码, 尤其是生成大规模 AST 的时候。 在计算机科学中,这种能力被称为准引用(quasiquotes)。

    Taro编译原理工作流与抽象语法树(AST)

    image.png

    AST

    抽象语法树(AST)或者语法树(syntax tree),是源代码的抽象语法结构和树状表现形式,这里特指编程语言的源代码。

    Parse Tree

    具体语法树,通常称作分析树。一般的,在源代码的翻译和编译过程中,语法分析器创建出分析树。一旦AST被创建出来,在后续的处理过程中,比如语义分析阶段,会添加一些信息。

    编译

    无论是h5、小程序、还是RN,都有一个共同的部分:都可以将源代码作为纯文本解析为抽象语法树(AST)的数据结构。
    当源代码解析成AST后,根据不同的平台的语法树规则,产生对应平台的语法树,然后产生代码。
    这样就可以做到一套代码,不同平台执行。