工作原理

没有猴子补丁,没有运行时代理:只是恰到好处的时机,加上 Reflect 元数据。

整体流程

DocfyModule.forRoot()NestFactory.create() 阶段同步运行,早于 SwaggerModule.createDocument() 的调用。它用 require() 加载每一个 companion docs 文件,这会执行 docs(),并把 Reflect 元数据直接写到控制器的方法上,效果和 TypeScript 装饰器语法在类定义时做的事完全一样。

等到 SwaggerModule.createDocument() 开始扫描元数据时,一切都已经就位。没有猴子补丁,没有运行时代理。

时机

关键的时机点

onModuleInit 等生命周期钩子,触发时机都晚于 main.ts 中已经调用过的 SwaggerModule.createDocument()。任何基于 onModuleInit 的方案都会得到一份空的 Swagger 文档。这就是为什么 nestjs-docfy 避开了这条路,改用 forRoot() 内部一次同步的 require(),它运行在 NestFactory.create() 期间,早于任何生命周期钩子或 SwaggerModule 调用。

CLI:静态分析

generate CLI 使用 ts-morph 做静态分析:它读取 TypeScript AST,不执行任何项目代码。所有用户提供的路径和 glob 模式在使用前都会先校验和清洗。