cli 版agent工具又不需要界面为什么用 js 开发,这么重,用 go 等多好

15 次阅读

本文最后更新于 2026年10月20日。

核心一句话

不是技术人不懂 Go/Rust,是生态、开发速度、跨平台分发、已有业务复用压倒了内存开销;CLI 没界面 ≠ 只看运行内存。 下面拆开讲,同时说清楚 Go 的优势和 JS 的痛点,以及什么时候确实应该选 Go。

1. 最大原因:AI Agent 本身大量复用 JS/TS 生态

现在绝大多数 LLM Agent、MCP、工具调用、prompt 库、解析器、schema 校验、前端配套逻辑最早都是 JS/TS 写的:

  • OpenAI / Anthropic 官方 SDK 首选 TS;
  • MCP(Model Context Protocol)早期官方库是 TS;
  • 各种解析 Markdown、JSON schema、YAML、AST 代码解析、文件树遍历、沙箱工具,JS 库数量碾压;
  • 很多项目是前端团队转做 CLI Agent:一套 TS 代码,同时跑在 Web、VSCode 插件、CLI。一份逻辑多端复用,不用重写一遍 Go。

场景举例:VSCode 的 AI 插件,想配套一个同能力 CLI。如果用 Go,业务逻辑要双份维护;TS 写 CLI,直接复用插件里全部 agent 逻辑,测试、prompt、工具调用代码完全共用。 这是大量 CLI Agent 选择 TS 的头号理由,不是为 CLI 选 JS,是为了复用已有 JS 业务。

2. 开发迭代速度:TS 原型极快,Agent 特别吃快速试错

Agent 本质是胶水程序:拼接 prompt、调用 LLM、解析返回、调用本地工具、处理各种非结构化输出。

  • TS:类型系统够用,JSON 原生友好,动态构造工具定义、动态函数调用非常省事;改 prompt、加工具、调试链路,迭代速度很快。
  • Go:强类型、编译安全,但处理动态 JSON、动态工具注册、可变 schema 会写大量样板代码。Agent 项目经常今天新增一个工具,明天调整输出解析,Go 的静态类型会增加不少脚手架代码。

Agent 项目很多是快速验证产品想法:先跑通能力,后面流量/资源压力上来,再考虑把核心模块下沉到 Rust/Go。很多项目就是这个路径:TS MVP → 热点组件重写为原生。

3. 分发上,npm 是现成的全球包管理器,用户习惯已经养成

对开发者工具类 CLI: 用户天然会敲 npm install -g xxx。

  • npm 自动处理版本管理、升级、卸载;
  • 自带依赖解析,不用自己写跨平台安装脚本;
  • 可以在 package.json 里声明依赖,CI/CD 发布链路成熟。

而 Go 二进制分发你要自己搞定:

  • 为 windows/mac/amd64/arm64 编译多份二进制;
  • 写下载脚本、更新器;
  • 处理权限、PATH;
  • 做版本管理、回滚。

当然现在很多项目混合方案:npm 包只是一个几十行的 JS 下载器,安装时拉 Go/Rust 二进制,运行直接调用原生程序。兼顾 npm 分发体验 + Go 的低内存。

4. 但你说得完全没错:Node 做纯 CLI 确实很重

Node/V8 自带完整 JS 引擎,哪怕你的业务只有几十行,启动就要占用基础内存(几十MB起):

  • 进程基础开销大;冷启动慢;
  • V8 GC 行为不可控,长时间跑 Agent 持续加载上下文、历史消息时,堆内存容易持续上涨;
  • 并发任务多的时候,内存开销差距会被放大。

✅ 所以资源受限场景(容器批量跑大量 agent、边缘机器、小实例)Go/Rust 明显更合适:

  • 极小基础内存占用;
  • 启动毫秒级;
  • 内存可控,没有 V8 堆包袱;
  • 静态编译单文件,无运行时依赖。

5. 什么时候大家依然坚持 JS CLI,什么时候迁移 Go

适合 JS/TS CLI Agent

  1. 项目和 Web / VSCode 插件 / 浏览器端共享大量业务代码;
  2. 快速原型,频繁迭代 prompt、工具链;
  3. 用户群体是前端开发者,习惯 npm;
  4. 单机少量运行,内存不是瓶颈。

适合 Go/Rust CLI Agent

  1. 需要批量并发跑很多 Agent(容器批量任务);
  2. 长时间后台驻留运行;
  3. 资源紧张,内存预算低;
  4. 没有 Web 端复用需求,纯本地 CLI。

6. 行业现在的折中路线(越来越流行)

  1. 外层 CLI:Go/Rust(轻量二进制)
  2. Agent 核心推理/工具调用:复用 TS 库,通过子进程 / HTTP / MCP 协议调用
  3. 或者:npm wrapper 包,安装时下载 Go 二进制,你敲命令看起来是 npm 程序,实际跑原生程序。

总结你的疑问

CLI 又不需要界面为什么用 JS 开发,这么重,用 go 等多好

技术上 Go 确实更适合纯 CLI,内存和启动都占优;但选型不是只看运行时性能,更多看团队栈、代码复用成本、分发成本。 很多 CLI Agent 不是“为 CLI 选 JS”,而是本来就有一套 JS 的 Agent 逻辑,顺便打包成 CLI。

如果你打算自己写一个 CLI Agent:

  • 只做本地命令行工具,没有前端复用需求:优先 Go
  • 需要和 VSCode 插件、网页端共用 agent 逻辑:TS 更省事