[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fZLbrDgFlyHGyzrSjyR_KnaSWmWdvr3SE3vwM2NGo6qc":3},{"item":4,"related":51},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":39,"sourceName":40,"sourceUrl":41,"status":42,"seoTitle":43,"seoDescription":44,"canonicalUrl":45,"isFeatured":46,"sno":47,"sortOrder":48,"publishedAt":49,"updatedAt":50,"createdAt":50},"1be15b45-ad30-4bbf-b711-718a9ffc58b3","article","Tree-sitter：为什么编辑器不用每次重读整个文件？","tree-sitter-incremental-parsing-ai-coding","Tree-sitter 用增量解析和语法树帮助编辑器与 AI 编程工具只处理代码变化的局部，让搜索、补全和结构化修改更高效。","## Tree-sitter 解决的不是“把代码读懂”这么简单\n\nTree-sitter 是一个解析器生成工具和增量解析库。它的名字听起来像一棵会听代码的树，但真正重要的能力是：它能把源代码组织成语法树，并在文件发生小改动时尽量复用原来的结果，而不是每次从头解析整个文件。\n\n## 什么叫增量解析\n\n如果你在一个几千行的文件中只改了一个变量名，传统做法可能重新扫描整个文件。增量解析会保留没有受影响的树节点，只重新计算变化附近的结构。对人来说，这就像修改一本书中的一个句子时，不需要重新理解整本书的目录。\n\n编辑器的语法高亮、代码折叠、括号匹配和结构化选择，都可以从这棵树中获得帮助。即使代码暂时写到一半、语法还不完整，Tree-sitter 也会尽力恢复并标出错误节点，而不是因为一个缺失的括号就放弃分析。\n\n## 它为什么和 AI 编程有关\n\nAI 编程 Agent 经常需要做三类事情：找到某个函数，理解某个调用周围的上下文，以及把修改限制在结构边界内。直接按字符切片会把函数从中间截断，也可能把注释、字符串和真正的代码混在一起。基于语法树的查询则可以按照函数、调用表达式、条件节点来取上下文。\n\n这会改变“给模型多少代码”的问题。好的上下文不一定是整份文件，而可能是一个完整函数、它调用的几个关键函数，以及与修改相关的类型定义。这样既减少无关文本，也降低模型把相似代码混为一谈的概率。\n\n## Tree-sitter 也不是万能解析器\n\n它理解的是语法结构，不会自动知道数据库里的订单和代码里的 `order` 是同一个业务概念。不同语言需要不同语法描述，宏、动态生成代码和运行时反射也会给静态解析带来困难。解析成功只说明结构可读，不代表代码可以编译或运行。\n\n## 普通开发者能从中得到什么\n\n当一个 AI 工具提供“按函数修改”“只查看相关符号”或“结构化代码搜索”时，背后往往离不开解析器。你不需要直接学习 Tree-sitter 的查询语法，但可以关注工具是否能区分代码、注释和字符串，是否能在代码暂时不完整时继续工作，以及它给出的上下文是否以结构为单位。\n\nTree-sitter 的官方资料可以参考其[解析器与语法文档](https:\u002F\u002Fgithub.com\u002Ftree-sitter\u002Ftree-sitter)。","\u002Fuploads\u002F2026-09-14\u002Fc4a4730d-34e0-43bb-8d5c-bd79b20e1969.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn","foundit-ai-editorial",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27,31,35],{"id":24,"name":25,"slug":26},"0848beb4-db26-4fb8-b391-f852a11be192","AI编程","ai-coding",{"id":28,"name":29,"slug":30},"144abe77-0dc6-4f66-a176-20bddb1c0bfa","编程","coding",{"id":32,"name":33,"slug":34},"a202d639-99a6-488a-a712-4d4c6ffd7e15","开发","dev",{"id":36,"name":37,"slug":38},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug","官方资料","Tree-sitter","https:\u002F\u002Fgithub.com\u002Ftree-sitter\u002Ftree-sitter","published","Tree-sitter 是什么？增量解析如何帮助 AI 编程","了解 Tree-sitter、语法树、增量解析，以及 AI 编程工具为什么需要结构化代码上下文。",null,false,47,0,"2026-09-14T00:00:00.000Z","2026-09-14T15:01:26.675Z",[52,60,68],{"id":53,"type":6,"title":54,"slug":55,"summary":56,"coverUrl":57,"authorName":14,"sno":58,"publishedAt":49,"createdAt":59},"54d83c94-d588-400d-9d13-42daa20331e2","CAS：文件的身份可以由内容决定","content-addressable-storage-ai-coding","内容寻址存储 CAS 用内容摘要识别文件和构建产物，解释 AI 编程工具、容器和缓存为什么能复用结果。","\u002Fuploads\u002F2026-09-14\u002F3fab23b3-8bcd-4a3b-bf5a-2ab895ce3a10.jpg",41,"2026-09-14T15:01:41.114Z",{"id":61,"type":6,"title":62,"slug":63,"summary":64,"coverUrl":65,"authorName":14,"sno":66,"publishedAt":49,"createdAt":67},"373f9a49-3705-46dc-823c-7ef1923f1b54","OpenAPI 如何让 AI 同时写前后端不“各说各话”？","openapi-ai-frontend-backend-contract","AI 可以分别生成前端和后端，却容易在字段、错误和时间格式上互相错位。本文解释 OpenAPI 如何把接口输入输出变成共同契约，再连接生成代码和契约测试。","\u002Fuploads\u002F2026-09-14\u002F4e99751f-020c-45dd-a87d-1a9fbb8f0f83.jpg",48,"2026-09-14T11:00:08.021Z",{"id":69,"type":6,"title":70,"slug":71,"summary":72,"coverUrl":73,"authorName":14,"sno":74,"publishedAt":49,"createdAt":75},"b12a5d11-9995-4996-9517-451945ab9267","Hermetic Build：让构建不再偷偷依赖你的电脑","hermetic-builds-ai-coding","Hermetic Build 通过隔离工具、依赖和环境，减少“在我电脑上能运行”的问题，让 AI 编程更容易获得稳定反馈。","\u002Fuploads\u002F2026-09-14\u002F0a4eec65-0454-4f9d-9d96-e55b7644618d.jpg",49,"2026-09-14T15:01:37.834Z"]