一位开发者发现,一个隐藏的 npx 查询导致 Claude Code 的每次交互都增加了大约 10 秒的延迟,而将该查询替换为全局安装后,每次交互缩短了 6 秒。

为什么延迟至关重要

Claude Code 在包含数十个组件的 monorepo 中进行导航、索引符号、在 Postgres 中持久化对话记录并发送错误报告。在模型响应开始出现滞后之前,工作流感觉非常流畅。随后的一次健康检查暴露了几处效率低下的地方以及一次代价高昂的网络调用。

健康检查发现了什么

  • 重复安装 – 一个原生启动器和一个过时的 npm-global 版本共存。删除陈旧的副本消除了不必要的路径查询。
  • 损坏的 agent 文件 – 一个没有描述的文件与一个有效文件的名称重复,导致 Claude Code 忽略了它。删除损坏的条目消除了这种混淆。
  • 未使用的扩展 – 禁用了从未运行过的插件和 MCP server,从而减小了运行时占用。
  • 臃肿的 “CLAUDE.md” 文件 – 这些文件重复了代码中已有的信息(例如构建命令),增加了发送给模型的有效载荷。精简这些文件后,只保留了必要的上下文。

这些清理工作有所帮助,但最大的改进来自于在每次模型响应后运行的 Stop hook

隐藏的 npx 税

Stop hook 会执行六个独立的命令,每个命令都带有 npx -y 前缀。-y 标志会强制 npx 在运行命令之前检查 npm 注册表是否有更新版本,从而触发网络请求。每次查询平均耗时 1.6 秒,因此六次调用为每次交互增加了 约 10 秒。在实践中,该 hook 的整体延迟测量为 12 秒,当网络出现波动时,偶尔会出现高达 113 秒 的峰值。

简单的修复方法

将 npx 调用替换为全局安装的二进制文件,从而消除了注册表查询:

  • 优化前: npx -y @invariance/gps → 每次调用 1.6 秒
  • 优化后: gps(全局安装) → 每次调用 0.7 秒

这一改动将 Stop hook 的运行时间每轮减少了约 6 秒,并消除了由远程检查引起的巨大延迟峰值。

后续注意事项

  • Hook 耗时 – 对任何自定义 hook 进行性能监测,以便在延迟影响用户之前将其暴露出来。
  • 依赖卫生 – 定期清理重复安装和未使用的扩展。
  • 配置文件 – 保持 “CLAUDE.md” 精简;仅提供模型无法推断的信息。

教训很简单:自动化可能会隐藏昂贵的底层操作。一次快速的健康检查可以揭示隐藏的网络调用,防止流畅的 AI 助手变成反应迟钝的助手。

核心要点: 当 Claude Code 感觉变慢时,请测量 hook 的耗时并消除任何 npx 查询;全局安装可以缩短每次交互的秒数,让你的开发流程保持顺畅。