CodeMirror Duplicate Finder 是当前最实用的 VSCode 重复代码检测插件,因不依赖语言服务、启动快、配置少、结果直观,适合中小型项目快速扫描;需调低 minLines 至 5、similarityThreshold 至 75,并启用 includeStrings 才能有效捕获 React Hook、JSX 等场景下的逻辑重复。

VSCode 原生不支持语义级重复检测,Ctrl+Shift+F 只能搜固定字符串,对变量名不同、缩进不一、注释穿插的“逻辑重复”完全失效。真要定位重复块,必须用插件辅助,并配合人工判断边界。
为什么 CodeMirror Duplicate Finder 是当前最实用的选择
它不依赖语言服务,启动快、配置少、结果直观,适合中小型项目快速扫描。不像 SonarLint 或 ESLint 插件需要完整项目分析和规则配置,它专注做一件事:找连续多行、结构高度相似的文本块。
-
duplicate-finder.minLines默认是 8,但 React Hook 或工具函数常只有 4–6 行,建议调到5 -
duplicate-finder.similarityThreshold默认 85,变量名一换就掉出范围,实际项目中设为75更合理 - 若重复藏在 JSX 或模板字符串里,必须手动开启
duplicate-finder.includeStrings: true,否则直接跳过 - 它不会扫描
.gitignore或files.exclude里排除的路径——常见漏查原因就是**/node_modules/**没临时关掉
查不到重复?先检查这三类干扰项
不是插件失灵,大概率是环境或内容被过滤了:
- 文件编码不是 UTF-8(尤其 Windows 上带 BOM 的文件),插件解析失败但不报错,只静默跳过
- 重复代码被包裹在注释或字符串中(如
/* ... */或`if (x) doY()`),默认不参与比对 -
.vscode/settings.json里配了files.exclude,把src/utils或shared/这类目录排除了
遇到“变体重复”只能靠组合技人工介入
插件对以下情况基本无解:两个函数只差一个参数名、同一段逻辑被拆进不同 if 分支、箭头函数 vs 普通函数、仅差一行日志或空校验。这时候更高效的做法是:
- 用
Ctrl+Shift+F搜共性标识符,比如axios.post、localStorage.setItem、catch (err) - 把疑似块复制进 diffchecker.com 快速比对结构差异
- 对小范围高置信度重复,用正则批量重构:比如搜
console\.log$$([^)]*)$$,替换成logger.debug($1) - 别指望自动合并——工具只负责把“全项目扫一遍”的工作压缩成“看三四个文件”,是否该抽成公共函数、要不要保留差异化,得你根据业务演化路径判断
真正容易被忽略的是:重复代码一旦跨模块(比如用户中心和订单系统各一份),合并前得想清楚它们未来会不会因业务差异走上不同迭代路径。工具能标出“长得像”,但不能回答“该不该合”。











