单片机学习小组
登录
直播中
1653339509.516700
11年用户
479经验值
私信
关注
怎样去写一个碎片化元编程的web小工具呢
开启该帖子的消息推送
编程
JSON
什么是元编程呢?
怎样去写一个碎片化元编程的web小工具呢?
回帖
(1)
符敛招
2022-2-22 15:06:37
元编程
编程本来是一种致力于减少重复的工作,但不幸的是,我们却越来越听到「每天上班就是重复的 CURD」的这种抱怨。仔细想想过去一周你写过的代码,里边有多少是重复的呢?
当然,好的程序员总是有办法完成 DRY(Don't Repeat Yourself)的,「元编程」就是其中一种。
定义上,「元编程」是指通过代码来生成代码,从而减少重复的编码工作。具体而言,编译器、代码生成器都属于这个范畴。
其核心理念是,程序员的核心任务是描述「核心数据」和「核心逻辑」,剩下的事情,应该由工具链和机器来完成。在这种理念基础上,我们发展出了很多不错的框架。在其框架能管理的范围内,我们实现了大规模的代码重用。
以 API 为例,我们已经构建起来了以 OpenAPI 规范为中心的工具链。一旦你设计好 API,就可以自动化的生成服务部分的 Server 脚手架、以及调用部分的 SDK 。数十种语言,瞬间生成,用起来很感人。
MetaPage
MetaPage 不打算做那么大规模的事情,它着眼于日常的小代码甚至文字片段。一般我们遇到一个小时以上的重复劳动时,会想着做个工具把它自动化了。但如果我们遇到十多分钟的重复劳动,往往就忍了。因为搞这个工具本身可能就要花上十多二十分钟。
那么能不能提供一个通用的小工具来处理这些小需求呢?这就是 MetaPage 所做的尝试。它提供一个网页,这个网页分成三栏,分别是「元数据」、「模板」和「最终输出」。
「元数据」用 JSON 描述,模板用 ejs 引擎,点「生成」按钮生成「最终输出」。这里的输出甚至不一定是代码,文章也可以。
我们来看下界面,没有数据的时候,它会默认显示一个例子。
元数据是一个 JSON。
{
"author":"Easy",
"contacts":
[
{"HP":"https://ftqq.com"},
{"weibo":"https://weibo.com"},
{"twitter":"https://twitter.com/easychen"}
]
}
这个 JSON 中的数据,在模板中可以直接使用:
// MetaPage 由 开发,方糖气球?出品。
这时候,我们点击「生成」按钮,或者 cmd + s 就可以得到最终输出。
// MetaPage 由 Easy 开发,方糖气球?出品。
非常简单的模板替换逻辑。这里我们采用了 ejs 语法。这是一个简单但强大的引擎。
首先它用 和 %> 来嵌入语法块,不会产生输出。在其中,可以直接使用 js 来做条件和循环。
会直接输出变量内容。
会去掉标签之前的全部空白格,可以用来做代码的格式控制。
输出未转义的内容。
ejs 可以用 js 的原生语法来赋值、条件判断和循环,非常方便。
users.forEach(function(user){ %>
更多的内容可以参考ejs的文档,这里就不展开了。
逻辑重用
对于简单需求,上边的逻辑基本就够了。不过有时候,我们希望引入一些公用的逻辑,比如获取数组第一个元素的某个属性。
我们当然可以直接写成
contacts[0].nickname
但如果这个值在模板中被反复的使用,就又会造成大量的重复。于是我们引入了一个公用对象 —— this。
在这个区域我们可以给这个对象添加各种方法,而在模板中,就可以通过 this.method 来调用。
这样我们就可以实现部分逻辑的重用。
存储及其他
在 MetaPage 编写的代码会实时保存,但这些内容只保存在你浏览器的本地存储中,不会传到服务器上去。当你换台电脑,这些数据就消失了。所以我们提供到导出和导入功能。
对于相对复杂的使用场景,你可能同时需要多个 MetaPage 。你可以通过构造 URL 来区分不同的项目用的 MetaPage。比如:
meta.ftqq.com/php
meta.ftqq.com/project1
还记得大明湖畔的 MetaToy 吗?
记性好的同学可能还得我之前发布过一个叫做的 MetaToy 的工具,也是用来解决元编程的问题的。
MetaToy 把 MySQL 元信息获取和代码生成两个过程给绑定了,更为强大,想要一步到位。但在实际使用中却发现,这样反而导致一些来源不是 MySQL 的元数据进入不了这个体系。
所以这次我做了更轻量级的 MetaPage。
它不关心元数据来源,只处理生成过程。
它只是一个网页,不用安装。
数据完全存放在客户端,没有泄密风险。
编辑器是 VSCode 背后的 Monaco,支持 cmd+d 多选、鼠标中键列选择和选中内容同步编辑。
符合我对一个小工具的各种喜好,因为本来就是做给我自己用的。有类似需求的同学可以用用,觉得好用的话,可以推荐给其他人。
元编程
编程本来是一种致力于减少重复的工作,但不幸的是,我们却越来越听到「每天上班就是重复的 CURD」的这种抱怨。仔细想想过去一周你写过的代码,里边有多少是重复的呢?
当然,好的程序员总是有办法完成 DRY(Don't Repeat Yourself)的,「元编程」就是其中一种。
定义上,「元编程」是指通过代码来生成代码,从而减少重复的编码工作。具体而言,编译器、代码生成器都属于这个范畴。
其核心理念是,程序员的核心任务是描述「核心数据」和「核心逻辑」,剩下的事情,应该由工具链和机器来完成。在这种理念基础上,我们发展出了很多不错的框架。在其框架能管理的范围内,我们实现了大规模的代码重用。
以 API 为例,我们已经构建起来了以 OpenAPI 规范为中心的工具链。一旦你设计好 API,就可以自动化的生成服务部分的 Server 脚手架、以及调用部分的 SDK 。数十种语言,瞬间生成,用起来很感人。
MetaPage
MetaPage 不打算做那么大规模的事情,它着眼于日常的小代码甚至文字片段。一般我们遇到一个小时以上的重复劳动时,会想着做个工具把它自动化了。但如果我们遇到十多分钟的重复劳动,往往就忍了。因为搞这个工具本身可能就要花上十多二十分钟。
那么能不能提供一个通用的小工具来处理这些小需求呢?这就是 MetaPage 所做的尝试。它提供一个网页,这个网页分成三栏,分别是「元数据」、「模板」和「最终输出」。
「元数据」用 JSON 描述,模板用 ejs 引擎,点「生成」按钮生成「最终输出」。这里的输出甚至不一定是代码,文章也可以。
我们来看下界面,没有数据的时候,它会默认显示一个例子。
元数据是一个 JSON。
{
"author":"Easy",
"contacts":
[
{"HP":"https://ftqq.com"},
{"weibo":"https://weibo.com"},
{"twitter":"https://twitter.com/easychen"}
]
}
这个 JSON 中的数据,在模板中可以直接使用:
// MetaPage 由 开发,方糖气球?出品。
这时候,我们点击「生成」按钮,或者 cmd + s 就可以得到最终输出。
// MetaPage 由 Easy 开发,方糖气球?出品。
非常简单的模板替换逻辑。这里我们采用了 ejs 语法。这是一个简单但强大的引擎。
首先它用 和 %> 来嵌入语法块,不会产生输出。在其中,可以直接使用 js 来做条件和循环。
会直接输出变量内容。
会去掉标签之前的全部空白格,可以用来做代码的格式控制。
输出未转义的内容。
ejs 可以用 js 的原生语法来赋值、条件判断和循环,非常方便。
users.forEach(function(user){ %>
更多的内容可以参考ejs的文档,这里就不展开了。
逻辑重用
对于简单需求,上边的逻辑基本就够了。不过有时候,我们希望引入一些公用的逻辑,比如获取数组第一个元素的某个属性。
我们当然可以直接写成
contacts[0].nickname
但如果这个值在模板中被反复的使用,就又会造成大量的重复。于是我们引入了一个公用对象 —— this。
在这个区域我们可以给这个对象添加各种方法,而在模板中,就可以通过 this.method 来调用。
这样我们就可以实现部分逻辑的重用。
存储及其他
在 MetaPage 编写的代码会实时保存,但这些内容只保存在你浏览器的本地存储中,不会传到服务器上去。当你换台电脑,这些数据就消失了。所以我们提供到导出和导入功能。
对于相对复杂的使用场景,你可能同时需要多个 MetaPage 。你可以通过构造 URL 来区分不同的项目用的 MetaPage。比如:
meta.ftqq.com/php
meta.ftqq.com/project1
还记得大明湖畔的 MetaToy 吗?
记性好的同学可能还得我之前发布过一个叫做的 MetaToy 的工具,也是用来解决元编程的问题的。
MetaToy 把 MySQL 元信息获取和代码生成两个过程给绑定了,更为强大,想要一步到位。但在实际使用中却发现,这样反而导致一些来源不是 MySQL 的元数据进入不了这个体系。
所以这次我做了更轻量级的 MetaPage。
它不关心元数据来源,只处理生成过程。
它只是一个网页,不用安装。
数据完全存放在客户端,没有泄密风险。
编辑器是 VSCode 背后的 Monaco,支持 cmd+d 多选、鼠标中键列选择和选中内容同步编辑。
符合我对一个小工具的各种喜好,因为本来就是做给我自己用的。有类似需求的同学可以用用,觉得好用的话,可以推荐给其他人。
举报
更多回帖
rotate(-90deg);
回复
相关问答
编程
JSON
自己做的protel99
元
器件查看
小工具
2013-06-15
3206
C语言注释删除
小工具
的使用教程
2021-10-18
1549
如何在窗口中调用其它窗口
小工具
的句柄ID?
2019-11-11
1163
DropDown
小工具
不知道当前选择的是哪
一
项
2020-03-09
1468
用UcguiBuilder4制作的CHECKBOX
小工具
例程分享!
2019-07-29
996
方便的
小工具
和电阻分压计算器
2018-09-21
4101
在emwin界面函数中的edit
小工具
读取数值反应很慢是为什么?
2020-08-28
1992
请问MESSAGEBOX消息框
小工具
怎么调边框大小?
2019-10-17
2171
用实体按键控制界面,
怎样
使界面知道
小工具
被单机?
2020-05-19
1155
请问射频计算的
小工具
都包括哪些?
2021-06-25
1134
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分