VSCode原生不支持离线语义级代码重复检测,必须依赖插件;CodeMirror Duplicate Finder是目前唯一纯本地、无网络依赖、开箱即用的实用选择,需调minLines为5、similarityThreshold为75,并开启includeStrings:true才能有效识别中小型项目中的逻辑重复。

离线检测本地代码重复,VSCode 原生不支持,必须靠插件,且插件本身得能离线运行——CodeMirror Duplicate Finder 是目前唯一满足「纯本地、无网络依赖、开箱即用」的实用选择。
为什么 Find in Files 在离线时也查不到逻辑重复
Ctrl+Shift+F 本质是字符串/正则扫描,它完全不理解代码语义:for (let i = 0; i < arr.length; i++) 和 for (const item of arr) 在它眼里就是两段完全不同字符;变量名一换(data → payload)、缩进多一个空格、中间加一行注释,匹配就直接失败。它甚至跳过模板字符串和 JSX 内容,默认不扫描注释块。
常见错误现象包括:
- 手动搜
axios.post找到 4 处,第 5 处用了fetch就漏掉 - 两个几乎一样的错误处理函数,只因参数名不同,被当成完全独立
- 重复逻辑藏在
`${a}\n${b}`里,搜索结果为空
CodeMirror Duplicate Finder 离线可用的关键配置
它默认不联网,但默认配置对中小型项目偏保守,需手动调两处才能真正起效:
- 把
duplicate-finder.minLines改成5(默认8):React Hook、工具函数常只有 4–6 行,设太高会直接忽略 - 把
duplicate-finder.similarityThreshold调到75(默认85):变量名或空格差异会让相似度骤降,75 更贴近真实可合并范围 - 若重复藏在模板字符串或 JSX 中,必须开启
duplicate-finder.includeStrings:true,否则自动跳过 - 确认
.gitignore或files.exclude没排除待查目录(如"src/utils/**"),否则插件根本不会读那些文件
哪些重复它根本发现不了,得你手动干预
插件只比对连续多行的文本结构,对以下情况完全无感:
- 同一段逻辑被拆进两个
if分支,结构错位 - 一个用箭头函数 + 解构,另一个用普通函数 +
arguments - 仅差一行日志、一个空校验(
if (!x) return;)或超时时间(5000→10000)
这时更高效的做法是:Ctrl+Shift+F 搜共性标识符(如 localStorage.setItem、catch (err)),把疑似块复制进 diffchecker.com 快速比对;或者用 Simian 命令行工具跑一次跨文件扫描(需提前配好 simian.json,它对空格/缩进更宽容)。
别指望插件标出全部重复——它只是帮你把“扫整个项目”的动作,压缩成“盯三四个文件就够了”。剩下那点是否真该合并、抽成公共函数、还是留着应对未来分化,得你对着业务逻辑判断。尤其当两处重复分别在用户中心和订单模块时,合并前先想清楚:它们演化路径会不会很快分叉?


















