import * as esbuild from "esbuild"; /** * BuildCompiler — 生产编译器(Phase 2A) * * 将用户项目 src/ 下的 TypeScript/JavaScript 源码通过 esbuild 全量编译为 * CJS JavaScript,输出到 dist/ 目录。编译完成后,`vext start` 检测到 dist/ * 存在时直接用 `node` 运行,不再依赖 tsx 运行时。 * * 与 DevCompiler 的关系: * * ``` * DevCompiler(vext dev) BuildCompiler(vext build) * ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ * 输入: src/ 输入: src/ * 输出: .vext/dev/ (临时,gitignore) 输出: dist/ (持久,可部署) * 格式: CJS(方便 cache 清除) 格式: CJS(Node.js 稳定运行) * 增量: ctx.rebuild() + 单文件编译 增量: 无(每次全量编译) * 目标: 快速迭代(~23ms 热替换) 目标: 生产部署(一次性编译) * map: inline source map map: 外部 .js.map 文件 * ``` * * 两者共享 `createBaseEsbuildConfig()` 的基础配置(platform / target / format / * bundle / treeShaking / keepNames / charset / loader),在此基础上叠加各自选项。 * * 编译产物结构(保持目录映射): * src/routes/user.ts → dist/routes/user.js + dist/routes/user.js.map * src/services/auth.ts → dist/services/auth.js + dist/services/auth.js.map * src/config/default.ts → dist/config/default.js + dist/config/default.js.map * * 排除规则(在 SOURCE_IGNORE 基础上追加生产特有的排除): * - config/development.{ts,js} — 开发配置,生产无意义 * - config/local.{ts,js} — 本地覆盖,永远不部署 * - config/test.{ts,js} — 测试配置,生产不需要 * * @module lib/build/build-compiler * @see 09a-build.md §2(编译策略) * @see 11a-dev-compiler.md §3(DevCompiler — 对比参照) * @see IMPLEMENTATION-PLAN.md 任务 2.5 */ /** * BuildCompiler 构造选项 */ export interface BuildCompilerOptions { /** 项目根目录(绝对路径) */ rootDir: string; /** 源码目录(绝对路径),通常是 `/src` */ srcDir: string; /** 输出目录(绝对路径),默认 `/dist` */ outDir: string; /** * 是否生成外部 source map(默认 true) * * 生成 `.js.map` 文件,用于: * - 错误堆栈映射回原始 TypeScript 行号 * - APM/Sentry 等工具源码定位 * - 调试(`node --enable-source-maps`) */ sourcemap?: boolean; /** * 是否压缩代码(默认 false) * * 生产可选开启,减小产物体积。 * 注意:keepNames 始终为 true(保留函数名可读性)。 */ minify?: boolean; } /** * BuildCompiler 编译结果 * * 包含编译统计信息,用于 CLI 输出编译报告。 */ export interface BuildResult { /** 编译是否成功(无错误) */ success: boolean; /** 输出的 JS 文件数量 */ fileCount: number; /** 输入的源文件总数 */ totalFiles: number; /** 编译耗时(毫秒) */ elapsed: number; /** 输出目录 */ outDir: string; /** esbuild 警告信息 */ warnings: esbuild.Message[]; /** esbuild 错误信息 */ errors: esbuild.Message[]; /** esbuild 编译元信息(文件大小等),仅编译成功时有值 */ metafile?: esbuild.Metafile; } export declare class BuildCompiler { private readonly options; constructor(options: BuildCompilerOptions); /** * build — 执行全量编译 * * 流程: * 1. 扫描 src/ 下所有源文件(排除 .d.ts / 测试 / 开发配置) * 2. 构建 esbuild 配置(基础配置 + 生产特有选项) * 3. 调用 esbuild.build() 执行一次性全量编译 * 4. 统计编译结果(文件数、耗时、警告、错误) * * 与 DevCompiler.start() 的区别: * - 不创建 esbuild.context(无增量编译需求) * - sourcemap 使用 'external'(生成 .js.map 文件) * - 追加 define: { 'process.env.NODE_ENV': '"production"' } * - 追加生产排除规则(config/development / local / test) * - 启用 metafile(输出编译元信息) * * @returns 编译结果统计 * @throws 当 src/ 目录为空(无源文件)时抛出错误 */ build(): Promise; private buildProjectPreloads; /** * scanEntryPoints — 扫描 src/ 下所有可编译源文件 * * 使用 fast-glob 扫描,返回相对于 srcDir 的路径列表。 * * 排除规则(两层): * 1. SOURCE_IGNORE — 共享排除(.d.ts / 测试文件 / __tests__/) * 2. BUILD_EXTRA_IGNORE — 生产特有排除(config/development / local / test) * * @returns 相对于 srcDir 的源文件路径列表 */ scanEntryPoints(): Promise; /** 获取源码目录 */ getSrcDir(): string; /** 获取输出目录 */ getOutDir(): string; /** 获取项目根目录 */ getRootDir(): string; }