VSCode本身不提供查找未使用符号的功能,真正有效的是TypeScript编译器(启用noUnusedLocals)和ESLint(配eslint-plugin-unused-imports),配合全局搜索交叉验证;Shift+F12仅查已存在引用,对未使用符号无效。

VSCode 本身不提供“查找未使用的符号引用”这个功能——因为“未使用”不是引用,而是缺失引用。你真正想查的,是「声明了但没被任何人调用的变量、函数、import」,这类问题靠 Shift+F12(查找所有引用)完全无效,它只对有引用的目标起作用。
为什么 Shift+F12 对未使用符号毫无反应
Shift+F12 的设计目标是“这个东西在哪被用了”,不是“这个东西有没有被用”。如果你有个 const helper = () => {} 从头到尾没人调用,语言服务器压根不会把它加入引用图谱,快捷键自然返回空列表。这不是 bug,是能力边界。
- 对 import 行按
Shift+F12,查的是导出名(如map)的引用,不是这行 import 本身是否冗余 - 光标停在未声明变量上按
F12,提示“无法找到定义”,和“未使用”是两回事 - 灰色高亮(如 TypeScript 的
noUnusedLocals)只是提示,不代表可安全删除——obj[key]、eval、配置对象里的 key 都可能绕过检测
真正能定位未使用符号的三个可靠路径
必须依赖静态分析工具,而不是 VSCode 原生导航功能:
-
TypeScript 编译器原生规则:在
tsconfig.json中启用"noUnusedLocals": true和"noUnusedParameters": true,VSCode 实时标出未使用的局部变量和参数(注意:不检查顶层import) -
ESLint +
eslint-plugin-unused-imports:配unused-imports/no-unused-imports和no-unused-vars规则,能标出未使用的import、const、function;但对动态访问(require('./' + name))无能为力 -
全局文本搜索交叉验证:选中函数名后按
Ctrl+Shift+F,勾选Match Whole Word和Match Case,再手动确认是否真没人调用;同时搜from '.\/xxx'或import.*xxx看有没有模块导入它
容易被忽略的致命细节
很多“未使用”报错其实是配置缺失导致的假阳性:
- JS 项目没配
jsconfig.json,或里面没写"allowJs": true,语言服务就只扫描打开的文件,大量引用关系断裂 -
tsconfig.json的include漏了目录(比如没覆盖src/utils),里面导出的函数在别处就会标红“未解析”,而非“未使用” - 改完配置后必须手动执行
Ctrl+Shift+P→Restart TS server,否则新规则不生效 - 别信“自动删未使用代码”的插件——
Auto Remove Unused Imports类插件会直接删import行,但若代码里还有require()或运行时拼接路径,立刻报ReferenceError
最常被误删的是:Webpack 插件入口、Mock 数据生成器、测试辅助函数、Vue/React 配置对象里的方法字段。它们往往没被 import,也没出现在引用列表里,但删了就坏。


















