VUE项目基于源码实现可视化编程技术的探索

背景

在面对大型且高度组件化的项目时,传统的开发模式——即边预览边手动修改代码,往往会因项目结构的复杂性而显得效率低下,尤其是对于新加入项目或对项目结构不够熟悉的开发者而言,从UI界面逆向定位到具体代码实现并作出修改的过程尤为耗时且挑战重重。为了解决这一问题,提升开发效率与团队协作的流畅度,我们构想了一种更为智能和直观的开发辅助方案,旨在通过UI直接映射到代码组件,并简化代码编辑过程,将源码AST与UI做绑定, 直接通过UI界面修改属性或内容,并自动同步到代码文件中,实现一种直观且高效的可视化编程体验,并通过这种方式来维护以及新建项目。

传统低代码方案带来的问题

在深入探讨基于源码的可视化编程技术方案之前,我们先来分析一下传统低代码方案所带来的问题吧。

传统低代码方案通过自定义的私有协议与可视化视图做绑定,将代码逻辑抽象成私有描述,使用 JSON 配置来生成页面,后续只能通过维护JSON schema来维护项目。

功能和组件通常有一定的限制,无法完全满足所有复杂的、高度定制化的开发需求。因为是私有协议,所以定位问题也会比较困难。

图片

公有协议

在摒弃私有协议,追求广泛兼容与协同工作的背景下,软件开发社区积极拥抱公有协议和标准。其中,抽象语法树(AST)作为解析JavaScript(及其他编程语言)代码并转化为结构化数据的核心技术,已成为一个公认的公有协议。AST还为开发者提供了一种统一、标准化的方式来理解和操作源代码。借助AST我们可以非常容易的对代码进行描述以及代码和协议之间的互转。

VUE AST Transform 

AST的生成通常涵盖代码的词法分析和语法分析阶段:

  • 词法分析:将源代码分解成一个个有意义的单元(tokens),如关键字、标识符、运算符等。

  • 语法分析:根据语言的语法规则,将tokens组织成AST。在这个过程中,会构建出表示源代码结构的树状结构,其中每个节点对应源代码中的一个构造。

如下所示:

图片

AST Transform通常包括以下几个步骤:

  • 解析(Parsing):将源代码转换为AST

  • 转换(Transformation):遍历AST并对其进行修改

  • 生成(Generation):将修改后的AST转换回源代码文本

关键词说明

  • VariableDeclaration 变量声明

  • Expression:表达式,MemberExpression、BinaryExpression、UnaryExpression、AssignmentExpression、CallExpression、BindExpression、NewExpression 等...

  • Statement:语句,由 Expression 组成

  • ...

可以通过访问https://astexplorer.net在线调试理解更多关键词类型。

解析

js可以通过babel进行ast的解析,那vue文件该怎么解析成ast呢,你首先想到的肯定是@vue/compiler-sfc这个包,我们来看一下效果。

图片

可以看到descriptor字段里分别用template,script/scriptSetup,styles来描述vue文件的三个代码区块,所以可以将descriptor看成是vue的ast,理论上来讲我们可以通过修改各个区块的ast节点,最后再通过将descriptor转回vue代码即可。很可惜的是官方设计@vue/compiler-sfc这个包主要是为了将vue代码编译为可以在浏览器运行的render function,并没有提供transform的能力,即使修改了ast,也无法将ast转成vue-sfc代码。

解决方案

为了实现对vue-sfc代码的AST修改并重新生成vue-sfc代码,我们可以采取一种分而治之的策略,针对代码中的不同区块(template, script/scriptSetup, styles)使用不同的工具或库进行处理。通过上述vue ast的数据结构可以看到每个区块都有content字段表示当前区块的源代码,那是不是可以把template和script交给各自的解析器呢?(style本文不做解析),script区块的代码我们可以直接交给生态比较成熟的babel来处理,那template呢,我们可以想一下template 默认的 lang 属性是什么?是不是html,那是不是只要找到对应的html解析器就可以了。

流程图

图片

template区块的处理

通过对比多个html解析器,最终选择了node-html-parser来对template区块的代码来做ast的解析和处理。

对比其他解析器,这个包对ast的处理实现了HTMLElement 接口,使用起来非常方便,就像处理dom节点一样简单。

注意:有一个坑,解析修饰符会有问题,仓库issu中有解决方法,需要自己改一下源码打补丁

图片

更多使用方法可参考WebAPI HTMLElement 接口,例如:

图片

关联组件

组件在渲染的时候会被编译成template中的内容,那如果我需要在点击某一个组件的时候获取到该组件的props该怎么做呢?

可以使用node-html-parser给每个标签节点新增一个唯一标识,比如在每个标签的class中新增一个有固定前缀的随机唯一id,点击的时候通过获取该id,

然后通过node-html-parser提供的querySelector(".${id}")获取。

script区块的处理

下文使用到的babel工具库:

  • @babel/parser(对源代码进行AST解析)

  • @babel-traverse (遍历ast修改对应节点)

  • @babel/generator(ast转成源代码)

  • @babel/types(用于处理ast 节点的 lodash 式工具库)

  • @babel/template(通过字符串模板来创建ast)

一些简单的案例

获取ref

图片

获取computed

computed的获取和ref其实大同小异

比如我们新增这样一段代码

图片

图片

获取生命周期

图片

修改ref的值

图片

修改onMounted回调里的执行语句

@babel/traverse提供了replaceWith,replaceWithSourceString等replace方法来修改AST

方式1:

可以直接把表达式字符串传递给replaceWithSourceString来对AST进行修改

图片

方式2(推荐):

replaceWithSourceString传递声明表达式语句会报错,推荐使用@babel/template创建ast,减少容错,然后传递给replaceWith

图片

改成

图片

style区块的处理

那么同理style区块的代码也可以使用对应的解析器来处理,可以参考一些比较成熟的loader,如css-loader,postcss-loader等

生成vue-sfc代码

实现思路

1.将通过node-html-parser修改过的templateAST重新生成template代码,使用prettier格式化

2.将通过babel修改的scriptAST重新生成代码,使用prettier格式化,

3.最后将格式化后的template代码,js代码和没处理过的style区块的代码进行重组来达到生成vue-sfc代码的目的。

代码实现

图片

效果展示

图片

按住⌥option可进行编辑模式,hover选中组件,点击可以对组件进行可视化修改

图片

修改 → 同步源码

图片

重新渲染视图

图片

 流程图

图片

未来展望 

目前还在探索阶段,一些功能还处于开发阶段,未来将支持组件的拖拽,样式修改,全局状态,接口的管理,打通AI,git仓库,CICD,内部物料库组件等等

-End-

作者丨Gengar

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务端技术架构演进之路

服务端技术架构演进之路 目录 服务端技术架构演进之路 0.架构中常见概念及理解 1.单机架构 2.应用数据分离架构 3.应用服务器集群架构 4.读写分离/主从分离架构 5.冷热分离架构 6.垂直分库架构 7.微服务架构 8.容器编排架构 本文以一个 " 电子商务 " 应…

Linux_进程控制

一&#xff1a;进程创建 fork()函数创建新进程 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1 进程调用fork&#xff0c;当控制转移到内核中的fork代码后&#xff0c;内核做&#xff1a;…

Qt - 地图相关 —— 1、加载百度在线地图(附源码)

效果图 开始加载地图 1、百度地图开发者网站中注册,获取密钥 2、进入开发文档中 将下图内容保存到本地文件中,文件名为"index.html"文件即可。接着将内容中的“您的密钥”改为刚刚创建应用出来的AK密钥即可。 然后双击打开若在浏览器中正常看到下图右侧地图则说明没…

解压包软件下载:选择合适的解压软件

在日常办公和生活中&#xff0c;解压包软件扮演着至关重要的角色。首先&#xff0c;它极大地便利了文件管理。 随着数字化时代的发展&#xff0c;我们每天都会接触到大量的文件&#xff0c;包括文档、图片、音频、视频等。 这些文件如果不进行有效的管理&#xff0c;很容易变…

element plus的el-select分页

摘要&#xff1a; el-select的数据比较多的时候&#xff0c;必须要分页&#xff0c;处理方案有全部数据回来&#xff0c;或者添加搜索功能&#xff0c;但是就有个问题就是编辑的时候回显问题&#xff0c;必须要保证select的数据有对应的id与name匹配回显&#xff01; <el-fo…

如何在 WinCC Runtime Professional 中自动调整画面分辨率适应窗口的大小?

通过在组态中修改窗口和运行设置&#xff0c;可以使在窗口中显示画面的尺寸自动适应新窗口的尺寸。 问题描述 设备硬件改变&#xff0c;例如更换显示器&#xff0c;会引起 WinCC Runtime Professional 分辨率变化。在WinCC Runtime Professional中分辨率的变化会导致画面显示尺…

安装R和RStudio:开始你的数据分析之旅

数据分析是当今世界中一个非常热门的领域&#xff0c;而R语言是进行数据分析的强大工具之一。R是一种编程语言和软件环境&#xff0c;用于统计计算和图形表示。RStudio是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;它为R语言提供了一个更加友好和高效的工作环境。…

架构设计笔记-19-大数据架构设计理论与实践

知识要点 案例分析 1.Lambda架构优缺点 2.web架构设计 3.web系统架构设计相关技术 论文

基于RPA+AI的网页自动填写机器人 | OPENAIGC开发者大赛高校组优秀作品

在第二届拯救者杯OPENAIGC开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给…

【项目案例】-音乐播放器-Android前端实现-Java后端实现

精品专题&#xff1a; 01.C语言从不挂科到高绩点 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. SpringBoot详细教程 https://blog.csdn.ne…

【中文版】深度学习 deep learning 花书 pdf下载 2017.09.04

中文版pdf&#xff1a;https://pan.baidu.com/s/1s93yluQGSly5uBDAIVAlNg?pwdx6xy github&#xff1a;https://github.com/exacity/deeplearningbook-chinese 目录 第一章 前言第二章 线性代数第三章 概率与信息论第四章 数值计算第五章 机器学习基础第六章 深度前馈网络第七…

2014年国赛高教杯数学建模A题嫦娥三号软着陆轨道设计与控制策略解题全过程文档及程序

2014年国赛高教杯数学建模 A题 嫦娥三号软着陆轨道设计与控制策略 嫦娥三号于2013年12月2日1时30分成功发射&#xff0c;12月6日抵达月球轨道。嫦娥三号在着陆准备轨道上的运行质量为2.4t&#xff0c;其安装在下部的主减速发动机能够产生1500N到7500N的可调节推力&#xff0c;…

【人工智能AIGC术语100条】Shelly聊AI-重磅发布!

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 01 人工智能&AIGC术语100条全网发布 在…

Android ImageView scaleType使用

目录 一、src设置图片资源 二、scaleType设置图片缩放类型 三、scaleType具体表现 matrix&#xff1a; fitXY: fitStart&#xff1a; fitCenter&#xff1a; fitEnd: Center&#xff1a; centerCrop: centerInside&#xff1a; 控制ImageView和图片的大小保持一致…

【日记】可以不用考了,感觉铁过不了(413 字)

正文 可能是上午睡了一整个上午&#xff0c;中午直接睡不着了。不知道为什么&#xff0c;上午特别困&#xff0c;给主管说了一声&#xff0c;去隔壁休息室里开躺。有业务时又出来&#xff0c;脑袋晕晕的。办完又回去睡觉了。 中午玩了会儿&#xff0c;打过了劫波&#xff0c;开…

Qt消息对话框

问题对话框 对应API [static] QMessageBox::StandardButton QMessageBox::question( QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons StandardButtons(Yes | No), QMessageBox::StandardButton defaultButt…

外包干了5天,技术明显退步

我是一名本科生&#xff0c;自2019年起&#xff0c;我便在南京某软件公司担任功能测试的工作。这份工作虽然稳定&#xff0c;但日复一日的重复性工作让我逐渐陷入了舒适区&#xff0c;失去了前进的动力。两年的时光匆匆流逝&#xff0c;我却在原地踏步&#xff0c;技术没有丝毫…

vscode gitlens收费破解

首先打开vscode 插件栏 搜索GitLens 找到对应插件 这里我已经安装完成&#xff0c;如果未安装的点击install 并且下载指定版本V15.1.0 不然后续操作 不生效 找到对应面板 点击查看GitLens 安装完成后&#xff0c;并不能立即使用 显示一下内容&#xff0c;需要付费 这里很关键&…

Mysql 5.7 安装与卸载(非常详细)

一、环境介绍 操作系统&#xff1a;CentOS 7 MySQL&#xff1a;5.7 二、MySQL卸载 # 查看软件 rpm -qa|grep mysql # 卸载MySQL yum remove -y mysql mysql-libs mysql-common rm -rf /var/lib/mysql rm /etc/my.cnf 继续查看是否还有 MySQL 软件&#xff0c;有的话继续删…

uniapp——h5的控制台调试、h5调试

介绍 小程序在调试的时候可以打开调试模式&#xff0c;可以看到console.log的打印情况。 但是H5运行到手机上没有默认的调试的模式&#xff0c;但是可以人为手动加一个。 如何实现 1、main.js文件 import Vconsole from ‘vconsole’ /** 关闭正式环境打印日志&#xff…