CodeMirror Duplicate Finder是当前最实用的VSCode重复代码检测插件;它基于行结构相似度聚类,支持跨文件扫描,默认8行/85%阈值,可调为5行/75%并启用字符串匹配,但无法识别逻辑拆分、语法差异或未保存文件。

CodeMirror Duplicate Finder 是当前最实用的选择
VSCode 原生的 Ctrl+Shift+F(Find in Files)完全无法识别逻辑重复,它只做字符串匹配:变量名一换、缩进一变、注释位置一动,就直接漏掉。真要跨文件扫重复块,CodeMirror Duplicate Finder 是目前响应最快、配置最轻、不拖慢编辑器的插件。
它不是靠语义分析,而是基于行结构相似度做聚类,适合快速定位“抄来抄去”的函数体、错误处理模板、API 封装逻辑等——这类重复占真实项目中可合并代码的 70% 以上。
- 安装后右键 →
Find Duplicates in Workspace,结果以分组形式出现在侧边栏 - 点击任意一处,自动跳转到所有匹配位置,支持跨 JS/TS/JSX 文件扫描
- 默认只扫描 UTF-8 编码文件;若项目含 BOM 或 GBK 文件,会静默跳过,不报错也不提示
必须调的三个配置项
默认参数对真实项目太保守:连续 8 行 + 相似度 ≥85% 的设定,会让大量小钩子、请求封装、状态处理逻辑直接逃逸。
打开 VSCode 设置(Ctrl+,),搜索以下关键词并修改:
-
duplicate-finder.minLines→ 改成5(常见 React hook、axios 封装常只有 4–6 行) -
duplicate-finder.similarityThreshold→ 改成75(变量名、空格数、单双引号差异不再导致归零) -
duplicate-finder.includeStrings→ 设为true(否则 JSX 中的return (块、模板字符串里的重复逻辑全被忽略)
改完不用重启,下次触发扫描即生效。但注意:**/node_modules/** 和 .gitignore 里排除的路径仍不会被扫描,想查 src/utils 下的重复,先确认它没被 files.exclude 拦住。
为什么有些“明显重复”就是找不到
不是插件失效,而是它根本不在检测范围内——CodeMirror Duplicate Finder 只识别「连续多行、结构接近」的文本块,对以下情况无解:
- 同一段逻辑被拆进两个
if分支,中间插了别的语句 - 一个用
const { data } = res,另一个用const data = res.data - 仅差一行日志、一个空校验
if (!x) return;或超时时间从5000改成10000 - JS 写法和 TS 写法混用(如
for (let i = 0; i vs <code>for (const item of arr))
这时更高效的做法是:Ctrl+Shift+F 搜共性标识符(如 localStorage.setItem、catch (err)、axios.post),把疑似块复制进 diffchecker.com 快速比对;或者用命令行工具 simian 跑一次全量扫描(需配 simian.json,它对缩进/空格更宽容)。
别指望一键合并,人工判断才是关键
插件只负责把“整个项目”压缩成“三四个可疑文件”,剩下那点是否该合并、抽成什么粒度的公共函数、要不要加参数控制分支逻辑——这些没法自动化。
尤其当两处重复分别在 src/user 和 src/order 下时,得先想清楚:它们未来会不会走上不同演化路径?比如用户中心要加埋点,订单模块要加重试,强行合并反而增加维护成本。
最易被忽略的一点:未保存的文件不会参与扫描,也不会被插件读取。操作前务必 Ctrl+S。


















