VSCode原生不支持语义级重复检测,需依赖插件如CodeMirror Duplicate Finder并调优配置(minLines、similarityThreshold、includeStrings)才能有效识别单体应用中的逻辑重复。

VSCode 原生不支持语义级重复检测,大型单体应用里的逻辑重复(比如两处几乎一样的表单提交逻辑、状态处理钩子)必须靠插件+人工协同识别,不能指望一键扫光。
为什么 Find in Files 在大型单体里基本失效
Ctrl+Shift+F 只做纯文本匹配,而单体项目中重复代码往往藏在以下场景里:
- 变量名不同:
axios.post('/api/user', payload)vsaxios.post('/api/order', data)—— 搜索axios.post会漏掉后者 - 结构微调:一处是
if (loading) return;+ 主体逻辑,另一处把 loading 判断塞进函数体开头,行序错位后字符串完全不重合 - 模板字符串或 JSX 内嵌:重复的错误提示拼接逻辑写在
`请求失败:${err.message}`里,Find in Files 默认跳过字符串内容 - 被 .gitignore 或
"files.exclude"拦截:比如"src/legacy/**"被排除,但那里恰恰堆着最多历史复制粘贴代码
CodeMirror Duplicate Finder 的关键配置项
它不是装完就灵,尤其在 src/、packages/、apps/ 多目录并存的单体里,必须调这三项:
-
duplicate-finder.minLines改成4或5:单体里大量 hooks、utils 函数不足 8 行(默认值),不调就看不见 -
duplicate-finder.similarityThreshold降到70或75:参数名、空格数、注释位置一变,相似度立刻跌破 85,调低才能捕获“肉眼明显重复但工具沉默”的块 -
duplicate-finder.includeStrings设为true:否则 JSX 中这类高频 UI 重复直接隐身
改完配置后,右键 → Find Duplicates in Workspace,结果按分组列在侧边栏,点任意一项直接跳转所有位置 —— 这比翻 20 个文件找共性快得多。
遇到“查不到但明显有重复”时先检查三件事
别急着换工具,90% 的“查不到”是环境卡住:
- 确认
.gitignore里没 exclude 掉待查目录,例如"**/node_modules/**"是对的,但若你怀疑src/shared有重复,就得确保那行没写成"src/shared/**" - 文件编码必须是 UTF-8 无 BOM:Windows 上带 BOM 的 JS 文件会导致插件解析失败,控制台报
Invalid character却不提示来源 - 关掉其他扫描类插件:比如
sonarlint或eslint-plugin-detect-unused同时运行,可能抢占资源导致 Duplicate Finder 跳过部分文件
真正难啃的“变体重复”,得换策略
插件对这些无解:同一段校验逻辑,一处用 const validate = () => {...},另一处拆成 function validate() {...} + 额外日志;或者两个 API 调用只差一个 query 参数、超时时间。这时候:
- 用 Ctrl+Shift+F 搜共性标识符:
localStorage.setItem、catch (err)、navigator.geolocation,把返回的 3–5 个文件手动打开并排查看 - 复制疑似块到 diffchecker.com,选 “Ignore whitespace” 模式,一眼看出差异是否只是命名或空格
- 对高频重复模块(如权限判断、错误上报),直接跑一次 Simian:它不依赖 VSCode,能跨语言、容忍缩进差异,命令是
simian -includes=**/*.ts,**/*.js -threshold=6
工具永远只负责把“查全项目”压缩成“盯紧四五个文件”。剩下要不要合并、抽成 hook 还是 class、未来业务分歧风险怎么控——这些没法自动化,得你对着 PR 描述和需求文档拍板。











