半年的布局系统
可切换的布局系统从做预设到整个删掉,前后半年,删只用了一天。
· 5 min read
布局这个词,在 Tuff 的仓库里出现得比 Tuff 这个名字还早。2023 年 4 月 9 号就有一条提交,标题里写着 Update Layout Module,而 Tuff 这个名字,要到 2025 年 8 月才有。
要讲清楚八月四号那天删掉的五千多行是怎么来的,得从这儿说起。
2023
当时项目叫 TalexTouch 才两个来月。后面的两年多里,布局这个词时不时冒出来:FlatLayout 早就有了,2023 年 6 月还有提交改过它;到 2025 年秋天又有了 DynamicLayout,11 月初删过一个 layout-manager。
二月
2026 年 2 月 4 号,一条提交加上了布局预设,还有导入导出。提交说明里列的预设有 compact、minimal、classic、card、dock,另外增强了 LayoutAtomEditor,还加了一层给用户自己写的样式用的 CSS 清洗。
“原子化”是什么意思,文档里是这样讲的:把布局拆成一组小参数,圆角、边框、侧栏放哪边、透明度多少,解析成 CSS 变量,灌进外壳的根节点。上面那五个再加 simple 和 flat,布局组件一共七个。编辑器里改了任何一点,都会存成一个叫 custom 的预设,布局也跟着切过去,custom 用的还是 simple 的壳。它算第八种,后来提交里说的八种可选布局,就是这么数出来的。
用户自己的 CSS 那一块,文档写得挺坦白:@import、url( 这些会被拦掉,长度默认不超过 8000,最后补了一句,这个过滤器不是严格的安全沙箱。
到 2 月 13 号,仓库里已经有一个画布式的编辑器了,叫 CanvasGridEditor,用来拖着摆位置。
八月四号
然后是八月四号,两条提交隔了不到八分钟。
第一条落下一个固定的外壳:260px 宽的侧栏,加一个主栏,按设计稿来。它的提交说明先交代了一句,原来那八种可切换的布局这时已经没有人引用,会在下一条里删,这样这一条自己也能单独退回去。
第二条就是删。八种布局,连同注册表、动态加载、原子配置、预设导入导出、远程预设、预览那一整套,还有外观页里布局那一栏,一共 41 个文件,大约 5200 行。给的理由只有半句:应用现在只有一个固定的外壳了。同一批带进仓库的一份任务文档说得多一点:八套能切换的布局,让外壳收不成一种样子。后面还有一段验证:类型检查零错误,lint 干净,构建通过,相关目录下的 32 个测试全绿。随后又有一条提交,把设置页重排了一遍,还加了首页的对话入口。
留下的
删的时候按一条事先说好的边界走,叫 layout only,只动布局。主题、壁纸、窗口效果留下了,它们不是在切布局。CoreBox 的画布编辑也留下了。
CanvasGridEditor 下面挂着两个编辑浮层,提交里管它们叫兄弟。一个改的是 CoreBox 窗口里各块的位置,logo、输入框、标签、动作、结果、底栏这些;提交说明说,它只是碰巧挂在布局那一栏下面,算 CoreBox 的窗口定制,入口挪进了一个新的小节。另一个改的是主界面的头部、侧栏和内容区,那个才是外壳布局,一起删了。两个编辑浮层在布局那一栏下面挂了半年,到删的时候才分得出哪个算布局。
再算算时间。从第一条 Update Layout Module 算起是三年多,从预设和导入导出算起,2 月 4 号加的,8 月 4 号拆,整整六个月。按理说,可切换就是每个版本都得验证八次,第二季度一个季度就发了五十多个 release。我没去查它们是不是真的都验证了,这只是按理推出来的。
设置的结构里,布局相关的几个字段还留着:layout、layoutAtomConfig、layoutCanvasConfig、presetState。应用本身已经不读它们了,留着是因为 Nexus 里的预设仓库还在用,而且 @talex-touch/utils 是发出去的包,第三方插件的类型依赖它。提交说明里的说法是,只清了读写的地方。
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.