ENZH
和 AI 讨论这篇文章
ChatGPTClaude

Day 2-4,一半 commit 都是 fix css

📊 幻灯片

这三天一共提了 111 个 commit,讲道理其中得有一半的 message 都是 fix css。具体干了什么大概是这样的:Day 2 基本全在修 CSS,Day 3 加了第六个应用、顺手处理微信浏览器的坑,Day 4 做统一 API 层——这个是整个项目到现在最大的一次架构改动。

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

Day 2:全在修 CSS

起因是把 Tailwind 配置统一到 packages/config。统一完之后,所有依赖自定义 design token 的应用全崩了。

而且崩得不明显。不是那种红色报错页面直接告诉你哪坏了,是背景颜色好像差了一点点、按钮好像小了 2px 这种。这种 bug 是最难受的,你盯着屏幕知道不太对,但一时说不清到底哪不对。

后来搞明白问题出在哪了:每个应用都进化出了自己的一套 CSS 变量命名空间,八字用 --bz-*,塔罗用 --tarot-*,占星用 --zx-*。统一 Tailwind 配置,就得让这几套命名空间共存不打架,同时每个应用自己的视觉风格还得保住。所以就有了 38 个 commit,一轮修掉一批上次漏掉的 CSS 问题,修完发现还有,再修。

三套 CSS 变量命名空间如何在统一配置下共存不打架三套 CSS 变量命名空间如何在统一配置下共存不打架

不过这个过程里也干了点划算的活。修 CSS 是纯消耗,共享包的提取才是真正有积累的:顺手提取了 4 个新共享包——PDF 生成、聊天记录、共享聊天 UI,还有通用的 React hooks。之前是三个应用各写了一份自己的 ChatPanel 组件,实现还略有不同;PDF 导出也是三份,用的都是同一套 html2canvas 流程。现在全提取到 packages/uipackages/pdf 里,一处修复,处处生效。

把三份重复组件提取成一个共享包,一处修复处处生效把三份重复组件提取成一个共享包,一处修复处处生效

Day 3:第六个应用,还有微信浏览器

Day 3 提了 17 个 commit。新增了一个 MBTI 人格测试,第六个应用。这次集成轻松很多,因为它从第一天就知道自己要进 monorepo,一开始就是拿共享包搭的。

真正花时间的是微信浏览器。反正在中国做 app,微信这一关是躲不掉的,早晚都得过。做过中国互联网开发的应该都懂,微信内置浏览器的坑非常多:getUserMedia 的支持是残缺的,OAuth 流程的要求跟别家不一样,window.open 的行为也是受限的。UA 嗅探要检查 Android、iOS、桌面端各版本的 MicroMessenger,还有企业微信的变体(wxwork)。后来 PR #41 又暴露了一个新问题:某些微信版本嵌入的 UA 字符串,跟文档写的不一样,只好又加固了一轮。

Day 4:统一 API 层

统一 API 包

Day 4 提了 56 个 commit,最大的一件事是 packages/api,把所有应用跟 AI 模型的通信方式统一掉了。我觉得这是整个项目到现在最大的架构胜利。

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

现在换成一个工具函数 createAIStreamResponse(),传一个配置对象进去,带几个生命周期钩子:

  • initEvents — AI 开始流式输出之前,先把初始数据发出去

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

  • onError — 处理失败

  • refundCreditsOnError — 流中断了,自动把积分退回去

然后 52 条 API 路由全部迁移到这个模式上。这一步是 claude code 干的,也是 monorepo 加 AI 开发最舒服的地方——模式你只需要定义一次,铺开到全局的活交给 AI:给它看一个迁移好的示例,剩下的它自己全部应用过去,实际大概花了一个小时。这个活要是手动干,至少得一整天。

定义一次迁移模式,交给 Claude Code 铺开到 52 条路由定义一次迁移模式,交给 Claude Code 铺开到 52 条路由

内容过滤器 v1

同一天还把敏感词过滤器的第一版做了,基于 DFA。做中国市场,这个东西是必须有的。但玄学内容有个麻烦:它天然就带一堆会触发简单关键词过滤的词,算命、破财、桃花劫,全是。拿一个标准过滤器过来,一半正常内容都会被干掉。

DFA 的做法是从词表构建一棵 trie 树,然后逐字符扫描文本。第一版先做最简单的:消息里含敏感词就整条屏蔽,精细化留给后面迭代。

GDPR 和法律合规

还有法律合规的活:中英双语的服务条款和隐私政策。这种事没什么好写的,但必须做。后来 PR #83 又全面重写了一遍,拆成独立的中文版和英文版,加上了中国 AI 监管的合规条款。

最后验了一遍

大概晚上 11 点在本地验了一遍:6 个应用同时启动,用同一个账号登录,积分余额在各个标签页之间实时同步,都是通的。这套东西三天前还是 5 个各自独立的应用,现在账号和积分都是共享的,算是合成一个平台了。后面再加新应用,直接拿这几个共享包搭就行。

和 AI 讨论这篇文章
ChatGPTClaude

订阅更新

新文章发布时发到你的邮箱,不发别的。


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