go to definition 失效主因是语言服务器未启动、配置未生效或类型信息缺失,而非插件问题;vscode 仅渲染 lsp 返回结果,不自行推断语义。

Go to Definition 不是插件问题,而是语言服务没加载或类型信息缺失
VSCode 内置的代码导航能力已经足够强,所谓“需要插件才能跳转”,多数时候是误判。真正卡住你的,往往是语言服务器没起来、配置没生效、或者你正在看的那段代码根本没提供可推导的类型上下文。
为什么 Go to Definition 在 JS/TS 里经常跳不到实现?
JavaScript 默认缺乏类型契约,Go to Definition 只能靠变量声明位置或 JSDoc 推断——一旦函数来自高阶组合、动态导入或未标注的第三方库,就容易失效。
- 在
.js文件中加@typedef注释(比如/** @typedef {import('./api').User} User */)能显著提升跳转准确率 - TypeScript 项目必须有
tsconfig.json,且不能空着include字段;否则tsserver可能只扫描当前文件,不建模整个项目 - 状态栏右下角显示
JavaScript React时,Go to Definition默认绕过 TS 规则;切回TypeScript或TypeScript React才启用类型感知跳转
Peek 和 Go to References 到底该用哪个?
Alt+F12(Peek)适合快速确认调用点是否符合预期,不打断当前编辑流;Shift+F12(Go to References)才真正列出所有引用位置,用于重构前评估影响范围。
-
Peek弹窗右上角 ↑ 图标点一下,就能展开全部引用,效果等同于Shift+F12 - Vue/JSX 的
template区域默认不识别v-model或@click为引用,需确保已启用vue-language-tools(Vue 3)或vetur.validation.template(Vue 2) - 引用数超 50 条时,
Peek会自动折叠,此时直接用Shift+F12更稳
ESLint 能不能帮你看逻辑错误?别被名字骗了
ESLint 不检查业务逻辑,只查可形式化规则:比如 no-unused-vars、no-constant-condition、eqeqeq。它不会告诉你“用户未登录却调用了 deleteAccount()”——这种问题需要类型系统或契约式编程。
- TypeScript 开启
"strict": true后,tsserver才会报告null解引用、switch分支遗漏等潜在逻辑矛盾 - Python 项目想捕获类似问题,应配
mypy作为语言服务器,而非只用pylint;mypy能追踪Optional[str]类型流,发现if x is not None: y = x.upper()中的隐含假设 - VSCode 只负责渲染 LSP 返回的诊断信息,它不分析、不推断、不补全语义——别指望它“理解你的业务”
真正容易被忽略的是:语言服务器的状态和作用域。很多“跳不到”“不报错”现象,根源不在插件或规则,而在你没注意到状态栏右下角那个小齿轮图标正在缓慢旋转,或者你改的是用户级 settings.json,而项目里已有 .vscode/settings.json 把它覆盖了。











