[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$flnqLd73bKKTgYVfhJFr_p4VZOAGGSdRAf9H5t2zkxzM":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},"f15a0e71-54bb-4467-b36a-d7db0c3aa1d9","article","LSIF：把“跳转定义”变成可以搬运的代码地图","lsif-remote-code-navigation-ai-coding","LSIF 将代码符号与引用关系保存为可交换的索引，让云端代码浏览和 AI Agent 能在不完整本地环境中进行导航。","## LSIF：把“跳转定义”变成可以搬运的代码地图\n\n很多代码导航功能默认依赖本地环境：编辑器知道项目在哪里，语言服务器可以读取依赖，索引也在本机生成。但在云端代码浏览、代码搜索和 AI Agent 场景中，服务端未必能完整安装你的项目。LSIF，也就是 Language Server Index Format，试图把语言服务器产生的代码关系保存成可交换的索引格式。\n\n## 它保存的不是源代码\n\nLSIF 更像一张地图，而不是一份复制品。地图可以记录某个文件有哪些符号、某个位置对应什么定义、哪些地方引用了某个函数。用户打开网页代码浏览器时，服务端可以利用这张地图快速回答导航请求，而不必每一次都重新启动完整的语言服务器。\n\n这和搜索引擎的索引很像。搜索引擎不会每次查询都重新阅读整本书，代码导航系统也可以提前整理符号关系。地图越新，结果越可信；代码一旦大规模变化，索引就需要重新生成或更新。\n\n## AI 编程为什么需要这种中间层\n\n云端 Agent 往往要在隔离环境里处理项目。它可能只拿到一个提交、一个分支，或者只加载了部分依赖。如果有结构化索引，Agent 可以先回答“这个接口有哪些调用者”“这个类的定义在哪里”，再决定要不要打开完整文件。这样能减少上下文浪费，也降低盲目搜索的次数。\n\nLSIF 还有一个重要意义：它把“代码理解”从某个编辑器的私有能力变成可共享的数据。不同的网页界面、审查工具和自动化 Agent 可以围绕同一套导航信息工作。\n\n## 索引不等于运行时事实\n\nLSIF 记录的是静态关系，不能告诉你某个分支在生产环境被执行了多少次，也不能保证生成代码的依赖和线上环境一致。动态加载、代码生成和未完成的分支，都可能让索引与实际行为产生距离。\n\n## 普通读者需要记住什么\n\n以后看到“代码库可导航”“跨文件理解”“云端跳转定义”这类能力，可以想到 LSIF 这样的索引层。它解决的是查找和连接问题，不是自动完成需求，也不是对软件正确性的最终证明。\n\n可以从 [LSP 官方页面对 LSIF 的介绍](https:\u002F\u002Fmicrosoft.github.io\u002Flanguage-server-protocol\u002F)开始了解这个术语。","\u002Fuploads\u002F2026-09-14\u002Ff0d82035-6526-499b-920a-e44c985ed54b.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},"4c2bbea6-eab7-40a8-8447-1de478ff7749","分析","analyse",{"id":36,"name":37,"slug":38},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug","官方资料","Microsoft Language Server Protocol","https:\u002F\u002Fmicrosoft.github.io\u002Flanguage-server-protocol\u002F","published","LSIF 是什么？云端代码导航与 AI 编程索引","理解语言服务器索引格式 LSIF 如何把代码导航能力搬到云端和 AI Agent 环境。",null,false,58,0,"2026-09-14T00:00:00.000Z","2026-09-14T15:01:29.099Z",[52,61,69],{"id":53,"type":6,"title":54,"slug":55,"summary":56,"coverUrl":57,"authorName":14,"sno":58,"publishedAt":59,"createdAt":60},"7cc644a5-e0de-4d7b-802e-9e8b69677e12","AI 生成的代码会不会复制开源项目","ai-code-open-source-reference-license","AI 生成代码不等于天然没有来源。本文区分常见写法与高相似片段，解释代码引用、许可证、依赖供应链和轻量来源检查，帮助团队把合规当成代码质量的一部分。","\u002Fuploads\u002F2026-09-13\u002F920327ad-de7f-4caa-a2f4-816d467c9f9c.jpg",40,"2026-09-13T00:00:00.000Z","2026-09-13T11:55:49.911Z",{"id":62,"type":6,"title":63,"slug":64,"summary":65,"coverUrl":66,"authorName":14,"sno":67,"publishedAt":59,"createdAt":68},"1ff2b0c1-c125-4469-a09c-b8ddbc5bf705","AI 写 SQL 和数据库迁移，为什么必须人工确认","ai-generated-sql-database-migrations","数据库迁移会改变持久数据、锁和应用契约，语法正确不代表上线安全。本文解释 AI 生成 SQL 的风险，介绍扩展、迁移、收缩的兼容策略，以及生产执行前应检查的门槛。","\u002Fuploads\u002F2026-09-13\u002F6e5177d7-f51a-4722-951b-0108e9b7ecae.jpg",41,"2026-09-13T11:55:59.196Z",{"id":70,"type":6,"title":71,"slug":72,"summary":73,"coverUrl":74,"authorName":14,"sno":75,"publishedAt":49,"createdAt":76},"2d59f625-ead9-4cfd-b944-3d56bd9ea19a","AST：AI 为什么不只是在“读代码文本”？","ast-ai-code-understanding","AST 把源代码从一串文本变成一棵结构树，帮助编辑器、静态分析器和 AI 编程工具理解函数、变量、调用与分支之间的关系。","\u002Fuploads\u002F2026-09-14\u002F529ce69d-c781-4f61-9864-0294ae857718.jpg",42,"2026-09-14T15:01:25.949Z"]