2,9659分钟35/tech
给站内一个私密留言板加朗读功能时,一开始就排除了通用 TTS——想听到的是留言人自己的声音,不是一个标准播音腔。这篇记录方案选型和接入过程,但重点是搞懂声音复刻到底是怎么做到「用一段几十秒的录音就能复刻音色」的。
技术、思考与那些值得记下来的事
给站内一个私密留言板加朗读功能时,一开始就排除了通用 TTS——想听到的是留言人自己的声音,不是一个标准播音腔。这篇记录方案选型和接入过程,但重点是搞懂声音复刻到底是怎么做到「用一段几十秒的录音就能复刻音色」的。
Claude Code 用 grep 精确定位、用 LSP 跨文件追踪引用——两个工具解决的是不同层次的搜索问题。本文深入 ripgrep 的 Boyer-Moore 字符跳跃、Thompson NFA 正则引擎,以及 LSP 的 JSON-RPC 协议、tree-sitter 增量解析和符号表构建,理解 AI 代码助手在词法层和语义层各自如何工作。

Anthropic 工程团队总结的规模化部署经验:Claude Code 为什么选择主动搜索而非 RAG 索引,为什么 Harness 比模型本身更重要,以及 CLAUDE.md、Hooks、Skills、LSP、MCP、Subagents 七层如何协同工作。

「Prefetch」在前端语境里至少指三件不同的事:浏览器的 <link rel=prefetch> 资源提示、Next.js 基于 Router Cache 的路由预取、以及开发者手控触发时机的策略。三层各有边界,也有摩擦。文章从浏览器机制讲起,拆解 Next.js 静态路由与动态路由预取行为的差异,分析「进视口触发」的浪费与「完全关闭」的体验代价,最终落到 HoverPrefetchLink 这个悬停触发方案。

Next.js 16 内置了 React 19 的 ViewTransition API,加上 loading.tsx 骨架屏与悬停预取,三件事合在一起就能让页面切换从「瞬移」变成「流动」。

从「让 AI 写几段代码」到「让 AI 完成一段工程任务」,这两者之间的距离,不是一个更好的提示词,而是一套工程体系。

我对自己的行为模式非常熟悉,知道自己会怎么做。但为什么,以及那些「为什么」下面还藏着什么,是另一回事。

给站点加一个只对白名单设备可见的管理入口,看似是一次简单的权限收敛,却在 iOS Web Clip 上牵出三层叠加的假象:一个永不 resolve 的 Promise、一个卡死在 installing 的 Service Worker、一个被远程调试污染的权限判断。记录完整的排查链路和每一步的证据。

Web Push 的实现横跨 VAPID 密钥、Service Worker、加密订阅对象、推送服务中转四个层次,任何一层理解不到位都会踩坑。这篇文章完整记录在 Next.js 站点上为 iOS Web Clip 接入推送通知的全过程,以及调试中遇到的每一个真实问题。

积累了足够多的卡片之后,下一个障碍不是数量,而是孤立。每张卡片在自己那本书的语境里成立,但卡片之间没有对话。这篇讲的是如何让来自不同书的卡片碰撞——找到它们共同指向的隐藏主题,标注它们之间的关系类型,让不同框架的摩擦产生新的东西。
