Appearance
代码生成机制
本文档引用的文件
目录
简介
本项目是一个基于 TypeScript 的代码生成系统,旨在通过数据库表结构定义(Schema)自动生成全栈代码。系统支持 Deno、PC(前端)和 Uni(跨平台应用)等多种平台的代码生成,涵盖 GraphQL API、Vue 组件、路由配置、类型定义等。其核心逻辑位于 codegen.ts
文件中,利用模板引擎和 AST 分析技术,将数据库表结构映射为前后端代码。
项目结构
项目根目录包含 codegen
、deno
、pc
和 uni
四个主要模块。codegen
模块是代码生成器的核心,包含模板文件、配置和生成逻辑。deno
模块是后端服务,pc
模块是基于 Vue 的前端应用,uni
模块是跨平台移动应用。代码生成器读取 tables
目录下的表定义,结合模板文件,生成代码到 __out__
目录,最终通过 Git 差异合并到目标项目中。
Section sources
核心组件
核心组件包括 codegen
函数、genRouter
函数和模板引擎。codegen
函数负责解析表结构并生成具体文件,genRouter
函数负责生成路由和全局配置文件。模板引擎使用自定义的 includeFtl
函数处理模板中的占位符,如 [[mod]]
和 [[table]]
,并执行内嵌的 JavaScript 代码来动态生成内容。
Section sources
架构概览
系统采用模板驱动的代码生成架构。首先,initContext
初始化数据库连接上下文。然后,getSchema
从数据库读取表结构信息。接着,codegen
函数遍历模板目录,对每个模板文件进行处理。模板文件中的占位符被替换为实际的表名、字段名等信息,并执行内嵌脚本生成最终代码。最后,gitDiffOut
将生成的代码合并到目标项目中。
Diagram sources
详细组件分析
codegen 函数分析
codegen
函数是代码生成的核心。它接收 Context
和 schema
作为参数,遍历模板目录,对每个文件进行处理。函数使用 treeDir
递归遍历目录,对文件进行占位符替换和脚本执行。
流程图
Diagram sources
模板引擎分析
模板引擎使用 includeFtl
函数解析模板。模板中使用 [[expression]]
语法进行变量插值,使用 <# script #>
语法嵌入 JavaScript 代码。例如,[[table]]
会被替换为实际的表名,<# for (let col of columns) { #>
会执行循环生成代码。
示例
typescript
// 模板片段
const tableUp = table.substring(0, 1).toUpperCase() + table.substring(1);
const Table_Up_IN = tableUp.split("_").map(function(item) {
return item.substring(0, 1).toUpperCase() + item.substring(1);
}).join("");
此代码将表名转换为首字母大写的驼峰命名,用于生成类名。
Section sources
依赖分析
系统依赖 fs-extra
、commander
、chalk
等 npm 包。fs-extra
用于文件操作,commander
用于解析命令行参数,chalk
用于彩色日志输出。代码生成器与 deno
、pc
、uni
项目通过文件系统进行集成,生成的代码通过 Git 命令合并。
Diagram sources
性能考量
代码生成器在处理大型项目时可能会有性能瓶颈。建议在生成前清理 __out__
目录,并确保 Git 状态干净。系统通过比较文件大小和 MD5 值来避免不必要的文件写入,提高了生成效率。
故障排除指南
- Git 有未暂存的文件:运行
git add -A
将所有更改加入暂存区。 - 模板解析错误:检查
error.js
文件,查看生成的脚本内容。 - 代码合并失败:使用
code --diff
命令手动解决冲突。 - 缺少依赖:确保安装了 Git 和 Node.js,并安装所有 npm 依赖。
Section sources
结论
该代码生成机制通过模板和脚本的结合,实现了从数据库表结构到全栈代码的自动化生成。它提高了开发效率,减少了手动编码的错误。通过深入理解其核心逻辑和模板语法,开发者可以轻松扩展和定制生成器,以满足特定项目的需求。