先把线画对
公司一个流程设计器的前端,三个多月的提交,init 之后头几条画的都是线。
· 5 min read
翻了翻公司那个仓库的提交,算在我名下的,最早一条是 2024 年 1 月 22 号晚上 9 点 35 分,说明只有一个词,init。那天一共五条,除了 init,其余四条的说明里都带着 line,最后一条是修线的 bug,比前一条优化线的只晚了不到两分钟。
那是一个流程设计器的前端,往画布上放节点,再用线连起来。init 里节点已经有了,可接下来的四条全在改线。我猜是线最藏不住,节点歪一点还能当是设计,线歪了一眼就看得出来。
线
那时候连线我试了两种办法:一种很土,量出两个元素的位置,拼一条贝塞尔曲线,塞进一个 SVG;另一种是直接用页面里引的 jsPlumb。两种在 init 里就并排放着,八分钟后有一条提交,标题叫 second method draw lines,把手拼的那种先注释掉了。
画线的代码一开始挤在主组件里,当晚 11 点 17 分,我把二百多行拆出去,单独成了一个文件,两种办法在里面又都有。
2 月 18 号晚上,项目里多了 antv 的 x6(一个画图的库),新的画布用它来画线。2 月 28 号晚上 11 点 32 分,一条重构的提交把旧的主组件和那个画线的文件一起删了,两个加起来六百多行。从第一天数起,三十七天。
换了图库,节点之间隔多远,还是得我自己去告诉它,下面 2 月 29 号那条就是。
树
2 月 22 号晚上 10 点 54 分,有一条提交归在修复里,修的是交上去的数据还是一棵树。画布上用的确实是树,每个节点挂着自己的子节点,排版靠一个树形的布局库。可存下来的得是一份平的列表,每个节点自己记着前面是谁、后面是谁。这条提交把嵌套的节点摊平,加了 20 行,删了 9 行,只改一个文件。
我觉得这跟先画线是一回事。树里谁连着谁靠嵌套,拍平以后就只能靠 id 去认。
十三分之一
删掉旧画布七个半小时之后,2 月 29 号早上 7 点 06 分,一条提交说这是让流程图自动居中的数学模型。代码里是:节点之间的水平间距,按窗口宽度套一个一次函数,斜率正好是十三分之一;另外 1920 这个宽度,再加 1600 和 1445 前后各 50 像素的两段,各写死一个值。
读着更像一条直线加三个特例。这个提交加了 65 行,真算模型的只有十行上下,剩下大半是文件被重新排了一遍,引号换成双引号,补上分号。
半秒
3 月 11 号早上 8 点,一条提交的意思是,流程图数据转换超过半秒,就弹提示框,不让操作。打开一个存过的流程,要先请求数据,再把平的列表还原成树,才上得了画布。代码里起了一个半秒的定时器,到点了还没回来,才盖上那层提示;回来得快,就一次也不弹,大概是怕一闪而过。
459
整个仓库一千多条提交,算在我名下的有 459 条,四成多。里面 63 条是合并,63 条是 Update 加文件名,后面这种里有 38 条是同一个文件,components.d.ts,一个工具自动生成的声明文件。这 38 条里有 26 条,前后五分钟就有一次合并,我猜是合并时总在这个文件上冲突,解完就是一条。扣掉合并和这些 Update,剩 333 条,说我写了 459 条其实不准。
这 333 条里,开头是"修复"或 fix 的有 167 条,一半出头;"完善"16 条,"新增"15 条。写着"反显"的有 19 条,就是把存下来的数据原样读回画布。大概是修得比写得多。
别人的提交说明基本是一句话,没有前缀。我先写了四天英文的 feat、chore,再换成中文前缀,用到 2 月 7 号,之后也成了一句话,只有 2 月底到 3 月初那一轮重构,又用回了 ref: 这个前缀。返工也有:2 月 28 号下午 5 点 54 分回退了一个删除弹窗,39 分钟后又加了一个删除时的提示;2 月 19 号修过画布初始缩放太大,4 月 10 号干脆把缩放删了。
我在这个仓库的最后一条提交是 4 月 27 号晚上 9 点 27 分,加了一个回到顶部的按钮。
Copyright
© 2021-present TalexDS. All rights reserved.
Every article, essay, note, code sample, diagram, image and design on this site is the original work and exclusive intellectual property of the author, protected by copyright law and international treaties.
No reproduction. Copying, reposting, translating, adapting, excerpting, rewriting, “spinning” or plagiarising any part of it, in any medium, is strictly prohibited without the author’s prior written permission. Commercial use of any kind is forbidden.
No AI. No crawling. Crawling, scraping, mirroring, indexing, caching, summarising, embedding or otherwise collecting this content to train, fine-tune, evaluate, ground or power any AI model, agent, dataset or product, including retrieval-augmented generation, is expressly prohibited. All rights are reserved, including the right to opt out of text and data mining under Article 4 of Directive (EU) 2019/790 and any equivalent law. AI crawlers and agents must not access or process this page.
Violations will be pursued. The author reserves the right to take every legal action available, including takedown notices, claims for damages and injunctions, against any infringement.
版权声明:本站全部文章、笔记、代码示例、图片与设计均为作者原创,受《中华人民共和国著作权法》及国际公约保护。未经作者书面许可,严禁任何形式的转载、搬运、改写、洗稿与抄袭,严禁商业使用。严禁 AI 爬取:禁止以训练、微调、评测、检索增强或任何其他目的,抓取、镜像、索引、缓存、摘要或向量化本站内容。一经发现,将依法追究法律责任。
Distributed on an “AS IS” basis without warranties.