第一次接触代码生成器用的是动软代码生成器、数据库设计好之后,一键生成后端凝乳代码。之后也用过CodeSmith, T4。目前市面上也有很多优秀的代码生成器,而且大部分都提供可视化界面操作。
自己写一个的原因是因为要集成到自己写的一个小工具中,而且使用节点。js这种动态脚本语言进行编写更加灵活。
代码生成器的原理就是:数据+模板=比;文件。
数据一般为数据库的表字段结构。
模板的语法与使用的模板引擎有关。
使用模板引擎将数据和模板进行编译,编译后的内容输出到文件中就得到了一份代码文件。
因为这个代码生成器是要集成到一个小工具lazy-mock内,这个工具的主要功能是启动一个模拟服务器服务,包含豆腐功能,并且支持数据的持久化,文件变化的时候自动重启服务以最新的代码提供api模拟服务。
代码生成器的功能就是根据配置的数据和模板,编译后将内容输出到指定的目录文件中。因为添加了新的文件,模拟服务器服务会自动重启。
还要支持模板的定制与开发,以及使用CLI安装模板。
可以开发前端项目的模板,直接将编译后的内容输出到前端项目的相关目录下,webpack的热更新功能也会起作用。
模板引擎使用的是nunjucks。
lazy-mock使用的构建工具是杯,使用gulp-nodemon实现mock服务器服务的自动重启。所以这里使用gulp-nunjucks-render配合大口的构建流程。
编写一个大口的任务:
常量命名=要求(“gulp-rename”) const nunjucksRender=要求(“gulp-nunjucks-render”) const codeGenerate=要求(/模板/生成。) const ServerFullPath=需要.ServerFullPath (’。/package.json ');//模拟- server项目的绝对路径 const FrontendFullPath=需要.FrontendFullPath (’。/package.json ');//前端项目的绝对路径 const nunjucksRenderConfig={ 路径:“模板/服务器”, envOptions: { 标签:{ blockStart: & lt; %, blockEnd: %祝辞, variableStart: & lt; $, variableEnd:“在美元”, commentStart: & lt; #, commentEnd:“#祝辞;” }, }, ext js的,//以上是nunjucks的配置 ServerFullPath, FrontendFullPath } 饮而尽。任务(“代码”,函数(){ 要求(“事件”).EventEmitter.defaultMaxListeners=0 返回codeGenerate(杯、nunjucksRender、重命名、nunjucksRenderConfig) }); >之前代码具体结构细节可以打开lazy-mock进行参照
为了支持模板的开发,以及更灵活的配置,我将代码生成的逻辑全都放在模板目录中。
模板是存放模板以及数据配置的目录。结构如下:
只生成lazy-mock代码的模板中:
生成。js的内容如下:
const path=要求(“路径”) const CodeGenerateConfig=需要.default(’。/配置); const模型=CodeGenerateConfig.model; 模块。出口=函数生成(杯、nunjucksRender、重命名、nunjucksRenderConfig) { nunjucksRenderConfig。data=https://www.yisu.com/zixun/{ 模型:CodeGenerateConfig.model, 配置:CodeGenerateConfig.config } const ServerProjectRootPath=nunjucksRenderConfig.ServerFullPath;//服务器 const serverTemplatePath='模板/服务器/' gulp.src (“$ {serverTemplatePath} controller.njk”) .pipe (nunjucksRender (nunjucksRenderConfig)) .pipe(重命名(Model.name + . js)) .pipe (gulp.dest (ServerProjectRootPath + CodeGenerateConfig.config.ControllerRelativePath)); gulp.src (“$ {serverTemplatePath} service.njk”) .pipe (nunjucksRender (nunjucksRenderConfig)) .pipe(重命名(Model.name + Service.js)) .pipe (gulp.dest (ServerProjectRootPath + CodeGenerateConfig.config.ServiceRelativePath)); gulp.src (“$ {serverTemplatePath} model.njk”) .pipe (nunjucksRender (nunjucksRenderConfig)) .pipe(重命名(Model.name + Model.js)) .pipe (gulp.dest (ServerProjectRootPath + CodeGenerateConfig.config.ModelRelativePath)); gulp.src (“$ {serverTemplatePath} db.njk”) .pipe (nunjucksRender (nunjucksRenderConfig)) .pipe(重命名(Model.name + _db.json)) .pipe (gulp.dest (ServerProjectRootPath + CodeGenerateConfig.config.DBRelativePath)); 返回gulp.src (“$ {serverTemplatePath} route.njk”) .pipe (nunjucksRender (nunjucksRenderConfig)) .pipe(重命名(Model.name + Route.js)) .pipe (gulp.dest (ServerProjectRootPath + CodeGenerateConfig.config.RouteRelativePath)); }使用node . js写一个代码生成器的方法步骤