本文档涵盖了 Bun 的 JavaScript 和 TypeScript 转译和打包系统,该系统会将源代码转换为不同的运行时环境。该系统负责解析、AST 操作、模块解析、打包和代码生成。
有关运行时模块加载和导入/导出系统的更多信息,请参阅模块系统和加载。有关打包工具 CLI 界面的详细信息,请参阅CLI 架构。
Bun 的转译器和打包器系统主要用 Zig 实现,并提供了全面的 JavaScript/TypeScript 处理能力。该系统可以有几种模式运行:
核心处理流程从源文本到词法分析、解析、AST 转换,最后到代码生成。
来源:src/js_lexer.zig src/js_parser.zig src/js_ast.zig src/bundler/bundle_v2.zig src/js_printer.zig src/options.zig
词法分析器(js_lexer.zig)将源代码分解为一系列 token,而解析器(js_parser.zig)则构建抽象语法树(AST)。解析器支持 JavaScript 和 TypeScript 语法,并具有可配置的选项。
词法分析器使用可配置的方法 NewLexer(),该方法接受 JSONOptions 以实现专门的解析模式。解析器创建三种主要的 AST 节点类型:Expr(表达式)、Stmt(语句)和Binding(解构模式)。
来源:src/js_lexer.zig76-89 src/js_parser.zig167-179 src/js_ast.zig193-230
js_ast.zig 中的 AST 系统使用一种称为 NewStore 的专用分配策略,为 JavaScript 代码提供内存高效的表示。这种类似区域的分配器将 AST 节点分组到大块中,以实现快速分配和批量去分配。
每个 AST 节点包含一个 data 字段,该字段是特定表达式/语句类型的联合,前面带有 E.、S. 或 B.,分别代表表达式、语句和绑定。
来源:src/js_ast.zig41-191 src/js_ast.zig475-544
Transpiler 结构协调单个文件转换,处理模块解析、宏展开和 AST-to-AST 转换。它维护解析器状态和转换选项。
来源:src/bun.js/api/JSTranspiler.zig28-66 src/transpiler.zig1-50
BundleV2 是主要的打包协调器,负责管理整个打包过程,包括依赖解析、代码拆分和输出生成。
打包器采用多线程架构,其中 ParseTask 实例会在工作线程之间调度,每个线程都有自己的内存分配器以避免争用。
来源:src/bundler/bundle_v2.zig451-486 src/bundler/bundle_v2.zig123-394
解析阶段将源代码转换为 AST 表示。每个文件都经过词法分析、语法解析和初始 AST 构建。
解析器使用工厂方法,如 p.newExpr()、p.newStmt() 和 p.newBinding() 来创建不同的 AST 节点,这些节点通过专用存储进行内存分配。
来源:src/js_parser.zig170-179 src/js_lexer.zig111-264
转换阶段应用各种 AST-to-AST 转换,包括 JSX 转换、TypeScript 剥离和宏展开。
来源:src/js_parser.zig528-587 src/runtime.zig1-50
打包阶段负责解析依赖、执行 tree shaking,并创建优化的输出块。
来源:src/bundler/bundle_v2.zig657-728 src/options.zig76-171
打包器可以通过 options.zig 系统接受广泛的配置,支持不同的目标、输出格式和优化级别。
不同的目标会改变模块的解析方式、可用的 API 以及最终输出的格式。
来源:src/options.zig377-561 src/options.zig563-642
加载器系统决定如何处理不同的文件类型
来源:src/options.zig643-899 test/bundler/expectBundled.ts188-190
最后阶段使用js_printer.zig从转换后的AST生成优化的JavaScript代码。
打印机支持各种输出优化,包括标识符最小化、空格移除和死代码消除注解。
来源:src/js_printer.zig427-497 src/js_printer.zig531-586
BundleV2 使用工作池架构进行文件并行处理
每个工作进程都有自己的ThreadlocalArena分配器,以避免内存争用,并且所有内存都会在打包作业完成后释放。
来源:src/bundler/bundle_v2.zig274-394 src/bundler/bundle_v2.zig216-248