VSCode原生不支持语义级重复检测,需依赖插件;CodeMirror Duplicate Finder因轻量、响应快、配置简洁成为最实用选择,但需调参适配小函数、变量名变化及模板字符串等场景。

VSCode 原生不支持语义级重复检测,Ctrl+Shift+F 只能搜字符串,对变量名不同、缩进变化、模板字符串包裹的逻辑重复完全无效——真要查,必须用插件,且得调对参数。
为什么 CodeMirror Duplicate Finder 是当前最实用的选择
它轻量(不拖慢启动)、响应快、配置项少,专为“快速扫出可疑块”设计,不像 SonarLint 那样要拉起后台分析进程。安装后右键就能触发,结果直接分组列在侧边栏,点任意一处跳转所有匹配位置。
- 默认只扫描连续
8行以上、相似度 ≥85%的块,小函数或 React Hook 逻辑常不到 8 行,得手动改duplicate-finder.minLines到5 - 变量名一换相似度就掉,
duplicate-finder.similarityThreshold建议调到75,否则data和payload会被当成两段代码 - 重复藏在 JSX 或
`fetch(${url})`模板字符串里?默认跳过,必须开duplicate-finder.includeStrings: true - 如果
src/utils/**被.gitignore排除了,插件根本不会扫——不是失效,是压根没读到文件
Find in Files 搜不到逻辑重复的典型表现
它不是“不准”,而是根本不在同一个维度工作:不归一化语法结构、不忽略空白/换行/注释差异、不理解 for 循环和 map 的等价性。
-
axios.post('/api', data)搜出 5 处,第 6 处用了fetch()就漏掉 - 两个几乎一样的错误处理块,只差一个参数名
errvserror,Ctrl+Shift+F当成完全无关 - 一段日志拼接逻辑被写进带换行的模板字符串:
`[${new Date().toISOString()}] ${msg}`,搜索直接跳过 - JSX 中的重复渲染逻辑,比如连续三处
,但属性顺序或换行不同,字符串匹配失败
遇到“变体重复”时人工怎么补位
插件对结构错位、拆分支、箭头函数 vs 普通函数这类情况基本无解——这不是缺陷,是语义分析的天然边界。
- 先用
Ctrl+Shift+F搜共性关键词:localStorage.setItem、catch (err)、router.push,把疑似块集中起来 - 复制两段代码到 diffchecker.com,比对真实差异,比肉眼快得多
- 需要跨文件、宽松匹配(比如忽略空格和缩进),可临时跑一次
simian:simian -includes=**/*.ts -threshold=80 src/ - 别指望工具标出“该不该合并”,它只负责把“整个项目”压缩成“三四份文件”——要不要抽成
useApiErrorHandling,得你对着业务逻辑判断
真正容易被忽略的是:插件不会告诉你哪段重复“值得动”,也不会帮你决定抽成函数还是自定义 Hook。它只负责把文本相似性量化出来,剩下的判断,始终落在人身上。











