D2: 基于go实现的一个DSL 绘图工具 高手效率神器

news2024/11/17 2:36:49

在b站看视频的时候, gin框架作作者appleboy 一直在推荐一个绘图工具
大佬认证 肯定有其过人之处
我去各网站收集(chao)了一些关于D2的东西
在这里插入图片描述

D2 是一种声明式流程图的领域特定语言 (DSL),声明式只需要描述你想要的流程图即可,它就会自动生成对应的图像。

例如,在左侧提供如下所示的输入,然后在右侧我们就可以得到对应的输出流程图。

在这里插入图片描述

流程图开发工具

D2 的设计目标只有一个:把流程图变成工程师的愉快体验,很多工具对简单的图表可以做到这一点,但是当你接触到稍微复杂的流程图的时候就非常困难了。

这是因为今天的大多数流程图工具都是设计工具,而不是开发工具,他们给你一个空白的画布和一个可以拖放的工具栏,类似于 Figma 或者 Photoshop 那样,并且把他们的预期工作流程视为设计过程,但是工程师并不是视觉设计师,缺乏对系统进行空间架构的能力不应该阻碍有价值文档的创建,每一次拖放都不应该需要计划,声明式的流程图就可以消除这种困难点。

设计决策

以下是指导 D2 开发的设计决策,我们尽力避免过去的错误,并从成功的现代编程和配置语言中获取灵感。

设计决策本质上意味着权衡,你可能不同意其中的一些决定。但是,如果你是一名程序员,那么 D2 就是为你打造的,而且我们相信你会发现这些决定是一种让你感到自在的语言。

可读性 > 原型速度

可读性和原型制作速度都很重要,D2 通常更倾向于可读性。D2 的语法很轻巧,希望你能按顺序在易用性、原型制作速度和可读性之间找到良好的平衡。D2 特别避免的是简洁、紧凑的语法,它会抑制所有这三者。

例如,这里有两种定义圆柱体的方法。

D2

A: Christmas {shape: cylinder}

Mermaid

A[(Christmas)]

D2 不那么紧凑,但更具可读性。

警告 > 错误

D2 将尽可能地进行编译,例如,假设你应用了一个不存在的类,或者添加了一个对特定形状没有影响的样式。如果用户错误是 D2 可以忽略的错误,它会编译成功,最多就是发出警告。没有什么比在调试时注释掉一些代码,然后收到一个停止的错误消息更烦人的了。

安装

推荐的安装方式是运行我们的安装脚本,它会根据您的机器找出最佳的安装方式,比如如果 D2 可使用包管理器,那么它将使用该包管理器进行安装。1个

curl -fsSL https://d2lang.com/install.sh | sh -s -- --dry-run
curl -fsSL https://d2lang.com/install.sh | sh -s --

按照提示进行操作,通过运行 d2 version 来测试你的安装是否成功。

haoxuanli@HaoxuandeMacBook-Pro-2 ~ % d2 version
0.6.0

卸载

curl -fsSL https://d2lang.com/install.sh | sh -s -- --uninstall

基本使用

安装完成后我们可以用下面的命令先简单测试下 d2 的使用:

$ echo 'x -> y' > input.d2
$ d2 -w input.d2 out.svg

上面的命令会在本地浏览器中打开生成的流程图,当更改 input.d2 内容时该浏览器会自动刷新。

类似这样在这里插入图片描述

比如我们将 input.d2 内容更改为下面的内容:

x -> y: hello world

这声明了两个形状 x 和 y 之间的连接,标签为 hello world。
在这里插入图片描述
形状
我们可以像下面的方式来声明一个形状:

imAShape
im_a_shape
im a shape
i'm a shape
# 注意,一个连字符不是连接
# 而 `a--shape` 将是一个连接
a-shape

在这里插入图片描述

还可以使用分号在同一行上定义多个形状:

SQLite; Cassandra

默认情况下,一个形状的标签与形状的键相同。但是,如果你希望它有所不同,可以像这样分配一个新标签:

pg: PostgreSQL

默认情况下,形状的类型是矩形,要以其他方式指定,请提供 shape 字段:

Cloud: my cloud
Cloud.shape: cloud

比如下面的代码:

pg: PostgreSQL
Cloud: my cloud
Cloud.shape: cloud
SQLite; Cassandra

在这里插入图片描述

键不区分大小写,因此 postgresql 和 postgreSQL 将引用相同的形状。

会被渲染成如下所示的图形:

Write Replica Canada <-> Write Replica Australia
Read Replica <- Master
Write Replica -> Master
 
Read Replica 1 -- Read Replica 2

如果你在一个连接中引用一个未声明的形状,它就会自动创建它,比如上面 hello world 所示示例。

定义连接有 4 种方法:

--

->

<-

<->

连接标签

Read Replica 1 – Read Replica 2: Kept in sync
连接必须引用形状的键,而不是其标签

be: Backend
fe: Frontend
 
# 这会创建新的形状
Backend -> Frontend
 
# 这将定义现有标签上的连接
be -> fe

比如我们声明如下所示的代码:

Write Replica Canada <-> Write Replica Australia
 
Read Replica <- Master
 
x -- y
 
super long shape id here --\
  -> super long shape id even longer here

渲染后的流程图如下所示:

在这里插入图片描述

重复连接

重复连接不会覆盖现有连接。他们会声明一个新的。

Write Replica Canada <-> Write Replica Australia
Read Replica <- Master
Write Replica -> Master
Write Replica -> Master
Write Replica -> Master
Read Replica 1 -- Read Replica 2

在这里插入图片描述

连接链

为了可读性,在一行中定义多个连接可能看起来更自然。

# 标签应用于链中的每个连接
Write Replica Canada <-> Write Replica Australia
Read aaa -> Replica <- Master : eat
Write Replica -> Master
Write Replica -> Master
Write Replica -> Master
Read Replica 1 -- Read Replica 2

图片越来越逗了
在这里插入图片描述
循环

Stage One -> Stage Two -> Stage Three -> Stage Four
Stage Four -> Stage One: repeat

在这里插入图片描述
容器

server
# Declares a shape inside of another shape
server.process
 
# Can declare the container and child in same line
 parent. child
 
# Since connections can also declare keys, this works too
apartment.Bedroom.Bathroom -> office.Spare Room.Bathroom: Portal

在这里插入图片描述
原文指向里面看着一般
比如可以这样调整

server
# Declares a shape inside of another shape
server.process

# Can declare the container and child in same line
 parent. child

# Since connections can also declare keys, this works too
apartment.Bedroom.Bathroom
office.Spare Room.Bathroom
apartment->office : Portal

在这里插入图片描述

嵌套语法

我们还可以通过创建嵌套 map 来避免重复容器。



clouds: {
  aws: {
    load_balancer -> api
    api -> db
  }
  gcloud: {
    auth -> db
  }
 
  gcloud -> aws
}

在这里插入图片描述

容器标签

有两种方法可以定义容器标签。

gcloud: Google Cloud {
  ...
}

或者使用一个 label 标签指定。

gcloud: {
  label: Google Cloud
  ...
}

比如我们声明如下所示的流程图代码:

clouds: {
  aws: AWS {
    load_balancer -> api
    api -> db
  }
  gcloud: Google Cloud {
    auth -> db
  }
 
  gcloud -> aws
}
 
users -> clouds.aws.load_balancer
users -> clouds.gcloud.auth
 
ci.deploys -> clouds

在这里插入图片描述

此外我们还可以使用文本或者代码对象、图标或者图片、SQL 表等等。比如下面的代码我们使用了图标对象:

server: {
  shape: image
  icon: https://icons.terrastruct.com/tech/022-server.svg
}
 
github: {
  shape: image
  icon: https://icons.terrastruct.com/dev/github.svg
}
 

server -> github
可以渲染成如下所示的流程图:
在这里插入图片描述
除此之外还可以自行定制布局、主题、样式等等, 可能比较复杂, 注意边际效应, 效率为王

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

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

相关文章

Mac OS下应用Python+Selenium实现web自动化测试

在Mac环境下应用PythonSelenium实现web自动化测试 在这个过程中要注意两点&#xff1a; 1.在终端联网执行命令“sudo pip install –U selenium”如果失败了的话&#xff0c;可以尝试用命令“sudo easy_install selenium”来安装selenium; 2.安装好PyCharm后新建project&…

初体验深信服的云桌面

昨天上午深信服的工程师到这边来安装服务器&#xff0c;本想看一下具体的安装&#xff0c;但是上午有其他事情&#xff0c;没有看成&#xff0c;下午他给我讲了一下具体的使用&#xff0c;我体验了一下深信服的云桌面。 总体感觉管理员的维护和客户的使用都比较方便。 但是可能…

听GPT 讲Prometheus源代码--util

Prometheus的util目录包含了一些通用的工具模块,主要包含以下文件: buckets.go 这个文件定义了一些常用的指标采样值范围(Quantile buckets),如:0.001,0.01,0.05,0.5,0.9,0.95,0.99,0.999等。这些buckets常用于计算指标的分位数线。 regex.go 这个文件定义了一些正则表达式匹配…

Vue 2 访问元素和组件

通过Vue 2 组件基础一文的学习&#xff0c;我们知道组件之间可以通过传递props或事件来进行通信。 但在一些情况下&#xff0c;我们使用下面的方法将更有用。 1.访问根实例 根实例可通过this.$root获取。 我们在所有子组件中都可以像上面那样访问根实例&#xff0c;它就像一…

利用Jackson封装常用的JsonUtil工具类

在实际开发中&#xff0c;我们对于 JSON 数据的处理&#xff0c;通常有这么几个第三方工具包可以使用&#xff1a; gson&#xff1a;谷歌的fastjson&#xff1a;阿里巴巴的jackson&#xff1a;美国FasterXML公司的&#xff0c;Spring框架默认用的 由于以前一直用习惯了阿里的…

OpenLayers实战,OpenLayers判断点位是否与多边形有交集,判断车辆是否在电子围栏内

专栏目录: OpenLayers实战进阶专栏目录 前言 OpenLayers实战,OpenLayers判断点位是否与多边形有交集,可以用于判断车辆是否在电子围栏内,船舶是否在锚泊位中等常用案例。 在实际GIS地图业务开发中,一般是不会在前端实现是否在电子围栏这种计算的。 如果有人让你在前端实…

为什么TCP连接使用使用三次握手规则而不是两次?

TCP使用的是三报文握手来建立连接 当使用两报文握手建立连接时会发生什么样的情况呢&#xff1f; 如上图所示 假设一个TCP连接请求在网络中拥堵了&#xff0c;在规定的时间内未能到达TCP服务器&#xff0c;因此客户端重传该TCP连接请求 在双方建立连接并传输数据后&#xff0c…

基于CentOS7.9安装部署docker(简洁版)

安装部署 1基于官方脚本安装&#xff08;不推荐 不能自行选择版本&#xff09; 官方文档&#xff1a;https://docs.docker.com/engine/install/centos/ 2 使用yum安装 阿里云文档&#xff1a;docker-ce镜像_docker-ce下载地址_docker-ce安装教程-阿里巴巴开源镜像站 # ste…

git拉取远程代码到本地

目录 一、介绍 二、拉取代码到idea操作步骤 三、打通前后端连接的项目例子&#xff08;额外篇&#xff09; 一、介绍 本文是介绍如何从国内码云&#xff08;Gitee&#xff09;或者国外GitHub上面拉起代码项目&#xff08;若依&#xff09;到本地的&#xff0c;是通过idea202…

算法竞赛入门【码蹄集新手村600题】(MT1180-1200)C语言

算法竞赛入门【码蹄集新手村600题】(MT1180-1200&#xff09;C语言 目录MT1181 圆包含MT1182 圆相交MT1183 矩形包含MT1184 矩形相交MT1185 while循环MT1186 do-while循环MT1187 累加和MT1188 平均值MT1189 正数负数的和MT1190 分数乘法MT1191 减半MT1192 翻倍MT1193 偶数的平方…

Spring事件监听机制

前言 事件监听机制其原理就是观察者模式&#xff0c;而观察者模式又被称为发布-订阅模式。 观察者模式将有依赖关系的对象抽象为了观察者和主题两个不同的角色&#xff0c;多个观察者同时观察一个主题&#xff0c;两者只通过抽象接口保持松耦合状态&#xff0c;这样双方可以相…

C++11并发与多线程笔记(10) future其他成员函数、shared_future、atomic

C11并发与多线程笔记&#xff08;10&#xff09; future其他成员函数、shared_future、atomic 1、std::future 的成员函数1.1 std::future_status 2、std::shared_future&#xff1a;也是个类模板3、std::atomic原子操作3.1 原子操作概念引出范例&#xff1a;3.2 基本的std::at…

CTFhub-sql注入-绕过空格过滤

常用绕过空格过滤的方法&#xff1a; /**/、()、%0a 1.判断是否存在sqli注入 1 1/**/union/**/select/**/11 1/**/union/**/select/**/12 如果1/**/union/**/select/**/11的显示结果与1/**/union/**/select/**/12的显示结果不一样&#xff0c; 与1的结果一样说明存在注入…

JMeter中利用Jython运行Python代码

介绍 Jython是Python和Java的结合。Jython语法和Python一样&#xff0c;不但可以使用Python的库&#xff0c;而且还可以调用Java的库。结合了Python和Java的优点&#xff0c;也就是说Jython既有动态语言的灵活性&#xff0c;又可以用静态语言的强大的类库。其实&#xff0c;我…

Unity进阶–通过PhotonServer实现联网登录注册功能(客户端)–PhotonServer(三)

文章目录 Unity进阶–通过PhotonServer实现联网登录注册功能(客户端)–PhotonServer(三)前情提要客户端部分 Unity进阶–通过PhotonServer实现联网登录注册功能(客户端)–PhotonServer(三) 前情提要 单例泛型类 using System.Collections; using System.Collections.Generic; …

Android6:片段和导航

创建项目Secret Message strings.xml <resources><string name"app_name">Secret Message</string><string name"welcome_text">Welcome to the Secret Message app!Use this app to encrypt a secret message.Click on the Star…

周末时间在家重新做了一个电脑系统,手艺没有丢!!!

有个朋友的电脑抱怨自己太卡&#xff0c;有缘见过几次他的电脑&#xff0c;确实哦&#xff0c;10年的老笔记本了&#xff0c;关键还是日本买的东芝t552,配置4G500G&#xff0c;昨天晚上朋友提过来的时候&#xff0c;大吃已经&#xff0c;还以为是电磁炉呢。看下面的图片就知道了…

平方数之和(力扣)双指针 JAVA

给定一个非负整数 c &#xff0c;你要判断是否存在两个整数 a 和 b&#xff0c;使得 a&#xff3e;2 b&#xff3e;2 c 。 示例 1&#xff1a; 输入&#xff1a;c 5 输出&#xff1a;true 解释&#xff1a;1 * 1 2 * 2 5 示例 2&#xff1a; 输入&#xff1a;c 3 输出&am…

Linux系统调试——核心转储(core dump)

本篇讲解Linux应用程序发生Segmentation fault段错误时&#xff0c;如何利用core dump文件定位错误。 核心转储 在 Linux 系统中&#xff0c;常将“主内存”称为核心(core)&#xff0c;而核心映像(core image) 就是 “进程”(process)执行当时的内存内容。 当进程发生错误或…

计算机竞赛 图像识别-人脸识别与疲劳检测 - python opencv

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是…