使用node . js写一个代码生成器的方法步骤

  

  

第一次接触代码生成器用的是动软代码生成器、数据库设计好之后,一键生成后端凝乳代码。之后也用过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进行参照

  

为了支持模板的开发,以及更灵活的配置,我将代码生成的逻辑全都放在模板目录中。

  

模板是存放模板以及数据配置的目录。结构如下:

  

使用node . js写一个代码生成器的方法步骤

  

只生成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写一个代码生成器的方法步骤