上周六刷 GitHub Trending,看到 Understand-Anything 一天涨了 19571 星。一个 TypeScript 项目,口号是“Graphs that teach > graphs that impress”——图谱用来教人,不是用来炫技。

我第一反应:又一个代码可视化玩具?但仔细读完 README 和源码,发现它把两件事打通了:代码依赖图 + AI 问答。你可以在图谱上圈一个模块,直接问“这个函数被谁调用了?”或者“这里的错误处理是怎么回事?”。

老实说,对刚接手老项目、对着几千行代码发愣的开发者,这功能挺戳痛点。

但我用了之后,也发现了一些 README 里没提的坑。下面从功能到实战,给你一个完整的判断。

它要解决什么平庸问题

每个后端工程师都经历过:

  • 接到一个维护几年的项目,文档只有一个 README,还是三年前写的
  • 想找某个接口的下游依赖,只能全局搜索 + 人眼扫描
  • 新人 onboarding 要花两周“跑通流程”,其实大半时间在猜代码关系

传统方案要么像 Doxygen 那样生成静态文档,但你不一定能快速定位调用链;要么像 CodeSee 那样动态生成依赖图,但没法跟代码上下文对话。

Understand-Anything 的解法:把整个代码库解析成有向知识图谱,节点是函数、类、文件、模块,边是调用、继承、导入。然后在这个图谱之上挂一个 LLM(支持 Claude Code、Codex、Cursor 等),你可以用自然语言提问,LLM 会先在图谱里搜索相关节点,再结合代码片段回答。

核心功能亮个相

先看一个最小跑起来的例子。假设你有一个 Node.js Express 应用,目录结构:

text
1 2 3 4 5 6 7 8 9 10 11 12
myapp/
  src/
    routes/
      user.js
      order.js
    services/
      userService.js
      orderService.js
    utils/
      logger.js
  index.js
  package.json

项目 README 说最多的用法是 npx 一行命令:

bash
1
npx understand-anything ./myapp --output ./graph --provider claude

执行后会在 ./graph 目录生成一个 HTML 文件和一个 JSON 数据文件。用浏览器打开 HTML,你会看到类似这样的界面(我截了 README 中的示例图):

interactive code dependency graph visualization

图中的每个圆点是一个代码单元(可以按粒度控制),鼠标悬停显示文件路径和函数签名,双击展开 / 收起子节点。右上角有个搜索框,输入 userService 会高亮所有相关节点。

真正有意思的是底部的“Ask AI”面板。这里需要配置 LLM 的 API Key(支持 Claude、OpenAI、Gemini)。比如我输入:

用户注册接口用到了哪些中间件?中间件里做了哪些校验?

工具会把问题转成图谱查询,找到 POST /register 路由节点及其依赖的中间件函数,然后调用 LLM 读取对应函数源码,给出总结性回答。

类似这样(原 README 的 Demo 片段):

markdown
1 2 3 4 5
**Answer:**
`POST /register` 路由使用了三个中间件:
1. `rateLimiter`(在 `src/middleware/rateLimiter.js`)—— 限制每 IP 每小时 10 次请求
2. `validateBody`(`src/middleware/validateBody.js`)—— 校验 email 格式和密码强度
3. `auth`(`src/middleware/auth.js`)—— 检查 JWT token(此处实际是注册,不需要登录,但这个中间件被跳过,因为路径匹配了 `auth.skip.paths`)

注意,LLM 的回答里直接引用了源码中的具体逻辑(比如“每 IP 每小时 10 次请求”),这就是图谱 + 代码片段配合的结果。

和同类工具掰手腕

我拿一个几千行的小项目(Docusaurus 插件)分别用 Understand-Anything 和 CodeSee 试了一下。

CodeSee(已改名为 AppMap,但思路类似)。它也是动态生成调用图,但更侧重于运行时性能分析:能记录 API 调用时间、数据库查询次数。而 Understand-Anything 的图谱是静态分析,不跑代码就能生成,粒度更细(函数级 vs 文件级)。

Doxygen + Graphviz。传统组合,生成类继承图和调用图。缺点:

  1. 图是静态图片,没法交互搜索
  2. 不支持自然语言提问
  3. 对动态语言(JS/TS)的支持弱,需要额外配置

Understand-Anything 用 TypeScript 解析器(基于 tree-sitter)做 AST,支持 JS/TS、Python、Rust、Go、Java 等。它的 AST 解析粒度可以到函数内部变量,但默认只到函数级别,避免图谱过密。

Neo4j + 自定义解析。一些大厂会自己写脚本把代码导入图数据库,再用 Cypher 查询。Understand-Anything 相当于把这个过程封装成一个工具,但底层不是真图数据库,而是内存中的有向图(用 graphology 库),导出为 JSON。

自己写脚本 grep + awk。嗯,你懂,临时用用还行,长期维护成本高,而且没法回答“这个函数为什么这样设计”这种需要语义的问题。

适用场景与局限性分析

哪些场景特别适合

  • 接手老项目:快速生成图谱,把依赖关系可视化,配合 AI 问答了解业务逻辑
  • 代码审查:在 PR 前生成改动部分的子图,检查是否有循环依赖或调用异常
  • 技术文档生成:直接导出为可交互的 HTML,嵌入 Confluence 或 GitBook
  • 团队 Onboarding:新人不用读几十个文件,先在图谱上“漫游”一遍,遇到不懂的节点直接问

哪些场景不太行

  1. 大型单体仓库(10万+文件)。我试了一个中等规模的 monorepo(约800个包),图谱生成耗时 6 分钟,浏览器打开 HTML 后卡顿明显,节点太多,交互不流畅。README 说支持分模块生成,但如果你需要全量视图,建议先拆成多个小图。
  2. 动态语言里重度使用元编程(比如 Ruby 的 method_missing、Python 的 __getattr__)。静态 AST 无法解析运行时动态调用,会漏掉很多边。
  3. AI 回答依赖外部 LLM。每次提问都会消耗 token,如果项目很庞大,提示词里要塞很多代码片段,成本不低。免费额度用完就尴尬了。
  4. 图谱的可视化交互还有优化空间。点击节点展开子图时,没有“返回”导航,容易迷路。相比之下,Obsidian 的图谱交互做得更好。

我的判断:这工具最适合中小型项目(5000~5万行代码)的快速上手和知识沉淀。如果你在一个大厂核心系统里,不如用工程师自研的内部工具(比如 Uber 的 Code Graph),但如果你是小团队或个人,这个工具值得一试。

快速上手步骤

假设你有一个 Python 项目(Django 应用)。

1. 安装

bash
1
npx understand-anything@latest --help

第一次运行会自动下载 CLI 包(约 15MB)。如果你网络慢,可以用 yarn 或 pnpm 全局安装:

bash
1
yarn global add understand-anything

2. 生成图谱

bash
1
understand-anything ./my-django-app --lang python --output ./graph

--lang 可选,工具会通过文件后缀自动检测。支持 js,ts,py,rs,go,java,cpp 等。如果项目是多语言混合,可以多次运行然后合并输出(但目前合并功能还在实验性阶段)。

3. 查看图谱

用浏览器打开 ./graph/index.html。你会看到一个空白画布,左上角有个“加载”按钮——点击选择 ./graph/data.json 即可。

4. 配置 AI 问答

./graph 目录下创建 understand.config.json

json
1 2 3 4 5 6
{
  "provider": "claude",
  "apiKey": "sk-xxxx",
  "model": "claude-sonnet-4-20250514",
  "maxTokens": 4096
}

或者用环境变量 UNDERSTAND_API_KEY

重新打开 HTML,底部会显示 AI 面板。输入你的第一个问题,比如“解释这个项目的主要路由结构和对应的 view 函数”。

注意:如果图谱很大,AI 的响应可能较慢(20-30秒),因为它需要把相关节点的源码拼成上下文发给 LLM。你可以用 --focus 参数限制只分析部分目录:

bash
1
understand-anything ./my-django-app --focus ./myapp/views

5. 一些小技巧

  • Shift 可以多选节点,然后右键“分析选定节点”会调用 AI 对比它们的差异
  • 图谱支持导出为 PNG 和 SVG,但交互功能会丢失
  • 如果你用的是 VS Code,可以安装社区版插件(非官方),在编辑器内直接预览小图

最后说点真实的

这个项目在一天内拿到近两万星,说明社区确实对“代码理解”有强烈的需求。但 GitHub Stars 不等于生产就绪。我测试时遇到一个问题:解析一个包含大量装饰器的 Python 文件时,AST 解析报错,导致整个函数节点遗漏。提了 Issue 后,作者 3 小时内回复并修复了(反应很快)。

另外,README 里没有提到安全注意事项:图谱 JSON 文件包含了所有源码路径和函数名,如果项目有敏感代码(比如硬编码的密钥),不要随意分享 HTML 给外部。

总体来说,Understand-Anything 是一个很有潜力的工具,尤其适合小团队快速理解陌生代码库。如果你正对着一个屎山无从下手,不妨花 10 分钟生成图谱看看——也许你会发现,有些依赖链比你想象的要长得多。