ENZH

Day 2-4:三天 111 次 Commit

三天。111次commit。我敢说其中一半的commit message都写着"fix css"。

一只炸毛的猫咪被CSS文件和代码碎片的旋风包围一只炸毛的猫咪被CSS文件和代码碎片的旋风包围

第2天:CSS地狱 — 38次Commit

把Tailwind配置统一到packages/config之后,每一个依赖自定义design token的应用全崩了。

但不是那种明显的红色报错页面——是那种微妙的、让人抓狂的"背景颜色好像差了一丢丢""为什么那个按钮小了2px"。开发者最怕的不是bug,是你盯着屏幕觉得"不太对"但说不清哪不对。

问题出在哪?每个应用进化出了自己的CSS变量命名空间。八字用--bz-*系列token,塔罗用--tarot-*,占星用--zx-*

统一Tailwind配置意味着这些得共存且不冲突,同时每个应用还得保持自己的视觉风格。

38次commit,每一次都在修之前漏掉的CSS问题。

但好消息是,过程中顺手提取了4个新的共享包:PDF生成、聊天记录、共享聊天UI、通用React hooks。

三个应用各有自己的ChatPanel组件,实现略有不同。三个应用各有PDF导出代码,用的都是同样的html2canvas流程。提取到packages/uipackages/pdf之后,一处修复,处处生效。

修CSS是还债。提取共享包才是攒钱。

第3天:第6个应用和微信这个坑王 — 17次Commit

新增了MBTI人格测试成为第六个应用。这次集成就轻松多了——从第一天就知道它要进monorepo,一开始就用上了共享包。

更有意思的挑战是微信浏览器。

做过中国互联网开发的人都知道,微信内置浏览器就是个坑王:有限的getUserMedia支持、不一样的OAuth流程要求、受限的window.open行为。UA嗅探得检查Android、iOS和桌面端各版本的MicroMessenger,还有企业微信变体(wxwork)。

后来PR #41又暴露了新问题——某些微信版本嵌入的UA字符串跟文档写的根本不一样。又加固了一轮。

在中国做App,微信这一关躲不掉。必须过。

第4天:大日子 — 56次Commit

统一API包:整个项目最大的架构胜利

packages/api标准化了所有应用和AI模型通信的方式。

之前是什么状态?每个应用都有自己的流式路由,大约80行样板代码搞ReadableStream设置、SSE事件格式化、错误处理和积分扣减。同样的逻辑,重复了15次以上。

之后:createAIStreamResponse() — 一个工具函数,配置对象带生命周期钩子:

  • initEvents — AI流式传输开始前发送初始数据

  • onComplete — 保存结果、记录费用

  • onError — 优雅处理失败

  • refundCreditsOnError — 流中断时自动退还积分

52条API路由迁移到了这个模式。Claude Code看了一个示例,就把它应用到了其余全部。实际耗时大约一小时,手动做的话至少一整天。

你定义一次模式,AI帮你铺满全局。这就是monorepo + AI开发的威力。

内容过滤器v1

同一天搞定的还有:基于DFA的敏感词过滤器。

做中国市场必须要有这个。玄学内容天然包含会触发简单关键词过滤的词——算命、破财、桃花劫。标准的过滤器会把一半正常内容都干掉。

DFA(确定性有限自动机)的做法是从词表构建一棵trie树,逐字符扫描文本。第一版先做最简单的——包含敏感词的整条消息直接屏蔽。精细化后面再迭代。

GDPR和法律合规

中英双语的服务条款和隐私政策。不光鲜,但必须做。后来PR #83又全面重写了一遍,分成独立的中文版和英文版,加入了中国AI监管合规条款。

那个瞬间

大约晚上11点,我在本地同时启动了6个应用,用同一个账号登录,看着积分在各个标签页之间实时同步。

一次登录。一个积分余额。六个产品。

跑起来了。

三天前还有5个独立应用。现在有了一个平台。


© Xingfan Xia 2024 - 2026 · CC BY-NC 4.0