50万行TypeScript代码被从npm源映射里扒出来,整个Claude Code CLI的底裤都亮了。我翻了一遍——不是找漏洞,就想看看一个正经的AI工具内部长什么样。
结果发现是个React应用。不是网页,是终端。
整个命令行界面用React组件渲染,基于Ink的一个定制分叉版本。这手笔本身就够狠的——大多数团队宁可写裸奔的ANSI转义序列,也不会在终端里架一套虚拟DOM。但真正的狠活不是这些大架构决策,是那些没人逼你做的小选择。
190个加载词,没有一个叫"Loading"
「Flibbertigibbeting」「Recombobulating」「Lollygagging」「Prestidigitating」「Shenaniganing」「Wibbling」——这些词出现在你的终端里,代替那个转个没完的「加载中」。
而且这玩意儿能配置:
用户可以自己追加或替换词库,有人甚至为此写了一套配置API。
这不是需求文档里的功能。这是一个开发者在某个下午想到:「万一有人也想玩呢?」然后真的做了。不是「用户反馈说加载太无聊」,是「我觉得这该有意思」。产品sense的一种,但发生在代码层。
Claude思考时的指示符是个数学符号:∴
「因此」的意思。模型正在推理,推导向结论。没有产品经理提这个需求,没有设计师画过这稿。是团队里有人在乎符号的含义,哪怕在终端这种地方。你不知道∴是什么?它就是个小三角。你知道?那你会明白这不是巧合。
50毫秒循环里的性能洁癖
加载动画拆成两个组件。SpinnerWithVerb管状态——该显示哪个词、连接是否卡住、代理在什么模式。状态变才重渲染。
SpinnerAnimationRow只管动画——50毫秒一次的心跳,颜色扫过每个字符。每秒重渲染20次,不管状态变没变。
代码注释里写着:父组件从每回合383次重渲染降到25次,15倍的削减。
标准的React性能优化思路,但用在终端上——每一次多余渲染都是肉眼可见的闪烁。不是「能用就行」,是「这里也得讲究」。工程品味的一种,但发生在没人会表扬的地方。
连接卡住的检测没用简单的超时阈值,是指数移动平均:
stalledIntensity += (target - stalledIntensity) * 0.1
令牌停止流入时,文字颜色平滑地漂向红色。没有突兀的跳变,没有「卡住/没卡住」的二元切换。你能感觉到连接在恶化,比任何提示都早。这是反馈设计,但做在数据层。
有个组件叫Ratchet。只长高,不缩水。
解决的是老问题:内容在「思考中/思考完」「工具运行中/运行完」之间切换时,输入框上下蹦跳。Ratchet把minHeight锁死,只记录最大高度。不是bug修复,是体验打磨——你甚至不会注意到它存在,除非它不存在。
工程品味的三个信号
翻完这50万行,几个模式反复出现:
第一,配置即接口。 加载词库、动画模式、符号选择——这些东西都暴露成配置,而不是写死。不是「扩展性设计」,是「万一有人想改呢」的默认假设。
第二,状态与渲染分离。 动画循环和业务状态解耦,性能优化发生在架构层而不是补丁层。React的最佳实践,但用在终端这种「本该粗糙」的场景。
第三,符号有意义。 ∴不是装饰,是语义。颜色渐变不是炫技,是信息密度。每个细节都在回答「用户此刻需要知道什么」,而不是「我们能做什么效果」。
这些决策的共同点:它们都不会出现在PRD里,不会被写在OKR上,不会成为销售话术。但把它们串起来,就是一个产品的「手感」。
有个细节让我停了一下。代码里对连接状态的描述不是「stalled」或「disconnected」,是「degrading」。不是二元状态,是连续过程。这个词选择本身,就是产品思维的泄露。
50万行代码里藏了多少这样的小决策?你用过Claude Code,但你知道它思考时用「因此」符号吗?
热门跟贴