配置化脚手架cli工具开发实践

news2024/11/26 18:52:58

背景

我们服务于政务行业,正在打造一个集代码开发、数据集成、应用管理、一体化运维监控的应用支撑平台。

以此为导向,作为开发的第一步,代码工程创建应当为后续的集成、管理及监控等服务。所以区别于一般的cli工具,我们要做的工具还有以下特点:

1、支持在web页面进行脚手架参数配置,生成工程代码框架,以便将创建的工程与应用关联进行管控

2、除了cli工具常规的babel、less、sass之类基础功能,需要支持一些政务中的常用功能如监控、日志、水印等,还有前端微服务框架

3、部分模块支持二级配置,如微前端需配置主/子应用,水印需配置内容,监控需配置应用的标识等等

技术难点

我们常用的cli工具,如vue和react的cli工具,基本都是静态模版,即准备几套工程模版,如移动端一套,pc端一套,根据参数拉取对应的代码模版即可。

而以我们的功能模块数量和参数数量,显然无法采用这种方式,需根据配置实时生成工程代码。

以下是我们需要解决的问题:

1、如何将某个扩展模块特有代码文件或者代码片段注入工程,并在未选择该模块时避免这些代码污染工程

2、不同扩展模块修改同一个文件避免冲突、依赖相同npm模块时避免重复注入

3、最后呈现的代码需简洁优雅,为最佳实践,不能将对工程配置的判断语句带到生成的工程代码中

4、对接web页面配置并下载工程代码等

5、支持扩展模块的新增及优化,bug修复等,并支持在不升级cli情况下修复扩展模块的bug

6、cli及扩展模块物料的版本管理,如何支持各自修复bug同时又保证版本一致性

解决方案

针对问题1,我们将模版目录分解为公共资源目录、模块资源目录,其中模块目录下的资源文件仅在选择该模块后才整合到工程中。

针对问题2、3,我们引入ejs模版,对.ejs后缀的资源文件进行模版编译,这样可以通过模版的逻辑语法处理冲突,模版代码也会在编译后消失。且模版中能清晰看到各模块注入的语句,也能很好避免重复注入。

针对问题4,我们在模块中增加模块参数配置文件,并启动一个nodejs的wen服务,将配置返回到页面,且实现一个动态表单(这个后面有时间我单独推荐一下,基于tdesign-vue,代码不多,但非常方便),将配置与页面UI对接。web服务接收到页面配置后将调用工程创建模块创建代码工程并下载

针对问题5,我们将模版资源和cli分开,在不同仓库中维护,并将模版物料资源推送到COS,cli从COS拉取模版物料,且物料支持版本号

针对问题6,我们制定版本规范,物料git仓库分支对应物料版本,这样修复特定版本物料的bug不会影响其他不使用该版本物料的cli版本。

代码生成方案

目前我们的模版结构如下图:

template-source为公共代码,会全部生成到创建的工程中。modules下为扩展的可选模块,该模块被选择时会将其source目录下文件拷贝入工程,目录也是对应的。

最开始我们准备在代码中插入代码片段标识,然后让代码生成时将标识替换为对应代码,并将未配置的功能模块的标识删除。但我们很快就放弃了这一方案,因为这种标识太不直观,要看对应的代码是什么还得去对应模块去查定义,多人合作时你根本不清楚别人的代码与你的是否存在重复依赖,变量重名等问题,而且灵活性也不够,即使看出问题也很难处理。

放弃此方案后,我们选用ejs模版引擎进行代码注入。不管是公共代码还是模块特有代码,也不管是js、css、json、vue,需要时都可以添加.ejs后缀,让代码生成器对其做ejs模版编译,方案非常通用和简洁。

可以看出,该方案下各模块插入的代码一目了然,冲突很容易避免,并且模块下的子参数也能方便地进行判断和处理。

最后,我们实现了一个简单的插件方案,工程创建的开始、编译、结束都提供相应回调,通过插件可在这些周期中插入自己的逻辑,这可作为兜底,支持个别模块特定情况下移除多余目录之类的操作。

web页面对接方案

我们启动一个nodejs的web服务来对接web页面

web服务从资源管理模块获取扩展模块及模块子参数的信息,返回到页面,页面选择模块并配置好参数后,调用工程创建接口创建和下载工程代码。

在define.js中定义模块子参数

页面上通过动态表单组件渲染参数配置,如下:

工程在线预览方案

不同于静态的代码框架,我们代码是根据配置实时生成的,所以无法预先启动一个预览工程。要实现在线预览,只能在根据配置创建完工程后启动一个新的服务用于预览。由于部署后启动的预览服务端口没有暴露,所以需要一个预览接口通过代理预览服务。

这块资源代理,启动的webpack的publickPath需要对应部署后的网关路径,不然js等资源无法被代理。不过这些只是繁琐,真正的卡点在性能。已采取多种优化措施,比如依赖预先安装、vue和tdesign替换为cdn,受限于开发环境服务器性能,部署后预览通常要30秒以上,已准备暂时屏蔽该功能。

版本管理方案

为灵活维护,我们将cli和模版放到不同的代码仓库中。开发时,物料作为子仓库引入,cli直接从本地代码获得模版代码;然后物料按版本推送到COS对象存储,cli部署后就从COS中下载对应版本的模版物料。

优化方向

在线预览是下阶段优化的重点,我们有几个方案:

1、预先启动一个包含全量扩展模块的服务,然后该服务需实现根据配置动态屏蔽部分模块功能。这种方案不需要实时启动预览服务,但无法根本上保证启动的预览与选取的配置一致,可能存在差异。

2、使用vite替代webpack启动服务。vite不需要预编译代码,启动非常快。该方案已初步调研,验证启动速度必定让人满意,但仍然有其他不足,一是虽然启动时不编译,但首次加载页面仍然有实时编译,会导致预览页面加载较慢;二是vite替换webpack有兼容问题,也同样无法保证表现上完全一致。如果该方案能成功,后面我单独写一个webpack到vite的切换方案。

最后,感谢一起设计、开发和完善该工具的同事 colinczhu、damonxshi。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1492919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

x6.js 流程图绘制笔记,常用函数

官方参考网站如下:https://antv-x6.gitee.io/zh/docs/tutorial/about 安装x6 输入以下命令 npm install antv/x6 --save 引用插件代码如下: import { Graph } from antv/x6; 创建绘制区域 this.guiX6 new Graph({container: document.querySelect…

相机恢复,这几个方法很重要!

“我的相机用了才不到一年,现在不知道是什么原因,有一些拍摄的图片找不到了,有什么方法可以恢复丢失的照片吗?” 对于热爱记录生活的用户来说,相机出现问题或相机数据丢失,都是一件很让人难过的事情。 在使…

文件上传{session文件包含以及条件竞争、图片文件渲染绕过(gif、png、jpg)}

session文件包含以及条件竞争 条件: 知道session文件存储在哪里 一般的默认位置: /var/lib/php/sess_PHPSESSID /var/lib/php/sessions/sess_PHPSESSID /tmp/sess_PHPSESSID /tmp/sessions/sess_PHPSESSID ####在没做过设置的情况下一般都是存储在/var…

基于Harris角点的室内三维全景图拼接算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1Harris角点检测原理 4.2 Harris响应函数 4.3 角点检测与筛选 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 dirs datasheet/;% 定义…

(十三)上市企业实施IPD成功案例分享之——杜邦

在化工行业,说起杜邦公司,可谓是“顶流”企业。作为一家有着200多年历史,历经了三个世纪的化工巨头,杜邦企业的发展史,就是化学工业,乃至整个科技水平的进步史。从1802年杜邦创立时主营的火药,到…

Redis 缓存机制如何提高应用程序的性能?

在数字时代,一拍脑门儿我们就能感觉到信息的海量和处理速度的迫切。不管是刷个微博、下个单,还是玩个游戏,我们都希望能快上加快,一点不拖泥带水。这时候,缓存技术就扮演了个大英雄的角色,它能让数据存取的…

Windows安装Go语言及VScode配置

最近搞自己的网站时突然想起来很多上学时的事,那会美国总统还是奥巴马,网页课教的是DreamWeaver跟Photoshop,其他语言像PHP、Java8、Python都有学一点,讲究一个所见即所得。虽然是信管专业那时和斌桑班长对新语言很感兴趣&#xf…

LC打怪录 希尔排序Shell sort 912.排序数组

Theory 希尔排序本质上是对插入排序的一种优化,它利用了插入排序的简单,又克服了插入排序每次只交换相邻两个元素的缺点。它的基本思想是: 将待排序数组按照一定的间隔分为多个子数组,每组分别进行插入排序。这里按照间隔分组指…

第二证券|中证1000认沽期权是什么?怎么买?

中证1000指数期权是以中证1000指数为标的资产的衍生品,其间中证1000认沽期权是指期权买方有权在约好的时刻以约好的价格将必定数量的标的资产卖给期权卖方的中证1000指数期权合约。 个人投资者想要生意认沽期权,需求去证券公司开通期权账户,…

阿里云2核4G服务器支持多少人同时在线?

2核4G服务器支持多少人在线?阿里云服务器网账号下的2核4G服务器支持20人同时在线访问,然而应用不同、类型不同、程序效率不同实际并发数也不同,2核4G服务器的在线访问人数取决于多个变量因素: 2核4G:2核CPU和4G内存对…

1.2_1 分层结构、协议、接口和服务

1.2_1 分层结构、协议、接口和服务 (一)为什么要分层? 主机A如果想要向主机B发送文件,则一定要经过中间的一些介质、链路。 发送文件前要完成的工作: 1.发起通信的计算机必须将数据通信的通路进行激活。 所谓的激活&a…

【码银送书第十三期】《ChatGPT原理与架构》

OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景,在多项专业和学术基准测试中表现出的智力水平,不仅接近甚至有时超越了人类的平均水平。这使得 ChatGPT 在推出之初就受到广大用户的欢迎,被科技界誉为人工智能…

gofly接口入参验证使用介绍

接口传入的参数做相关性质验证是开发中较为常用,gofly框架内置校验工具,提供开发效率,开发接口简单调用即可实现验证,下面介绍gofly框架数据验证设计思路及使用方法。 gofly框架提供了功能强大、使用便捷、灵活易扩展的数据/表单…

【unity】shader优化总结-转载

分为三个部分:Unity官方文档,GDC,个人经验。 Unity Manual 1.计算量优化。着色器进行的计算和处理越多,对性能的影响越大。针对不影响最终效果但依然进行计算的无效代码,进行移除操作。计算的频率也会影响游戏的性能…

增肌_锻炼

目录 练第一步 有氧运动关节活动度 第二步 脊柱侧弯吃 练 https://www.bilibili.com/video/BV14v4y1G7A3 第一步 有氧运动 有氧运动锻炼心肺 最大心率保持在50% - 60% 关节活动度 髋关节活动 亚足背屈   绕肩,肩环绕肩   第二步 高频的中等强度&#xf…

【QT】菜单栏/工具栏/状态栏的应用

QMainWindow 菜单栏(menuBar)—只有一个 打开对话框 connect(ui->actionOpen,&QAction::triggered,this,[](){ //打开文件通常有一个返回值 //过滤条件,对打开的文件进行过滤QString…

【三维重建】相移法+格雷码

本篇文章介绍一种稠密点云的获取方式——条纹结构光三维重建算法。 在学习此算法前,我们需要对基于视觉的三维重建算法有一定了解。 需要了解什么是相机模型、相机标定以及三角化的相关知识。 【三维重建】摄像机几何-CSDN博客 【三维重建】摄像机标定&#xff…

AlibabaCloud微服务:Linux 部署 Sentinel 流量控制

目录 一、实验 1.环境 2.Linux 部署 Sentinel 3. 微服务接入Sentinel配置 二、 问题 1.Linux本地启动Sentinel控制台 2.JDBC连接失败 一、实验 1.环境 (1)主机 表1 主机 系统软件版本IP备注Linuxopenjdk 1.8.0192.168.204.200 maven3.5.0nac…

【QT】QDialog/ QMessageBox/提示对话框/颜色(文字)------对话框

QDialog—对话框 什么是对话框,如下样式 非模态对话框,即打开以后,我还可以对其他框进行操作。 模态对话框,打开以后,其他框都不能再操作了 模态对话框是阻塞对话框 QDialog dig(this);//显示模态对话框dig.exec();…

数据库-Mysql-读写分离(Atalas,Mysql-Router,Mysql-Proxy)

Atalas 这个是很老的了,了解即可。 wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm rpm -ivh Atlas-2.2.1.el6.x86_64.rpm #安装后的目录 cd /usr/local/mysql-proxy配置 /usr/local/mysql-proxy/bin/encrypt roo…