VSCode不支持语义级重复代码识别,仅能通过全局文本搜索(Ctrl+Shift+F)配合正则表达式定位模式化代码,需手动判断逻辑重复性,且须排除node_modules等无关路径。

VSCode 本身不提供“智能识别语义重复代码”的能力,所谓“查找重复代码”实际是靠人工判断 + 精准定位,核心方法只有两个:用 Ctrl+Shift+F(Windows/Linux)或 Cmd+Shift+F(macOS)做全局文本搜索,配合正则表达式缩小范围。别指望它自动标出“这段逻辑和另一处高度相似”——那是专用工具(如 jscpd、simian)干的事。
怎么用正则快速定位疑似重复的函数块?
多数重复代码集中在函数定义、API 调用、状态更新等模式化结构上。比如多个地方都写了类似 setLoading(true); apiCall().then(...).finally(() => setLoading(false)); 的逻辑。
- 打开全局搜索面板,勾选 “使用正则表达式”(.* 图标)
- 输入类似
setLoading\(\s*true\s*\);\s*apiCall\(\).+?\.finally\(\s*\(?\s*=>?\s*setLoading\(\s*false\s*\)\s*\)?\s*\),注意启用 “点匹配换行符”(.图标)才能跨行匹配 - 如果结果太多,先缩小搜索范围:在搜索框下方的
files to include输入**/*.ts或src/**/hooks/*.js - 正则里慎用
.*,优先用[\s\S]*?或.+?配合“点匹配换行符”,避免贪婪匹配吞掉整个文件
为什么搜 useEffect 总是漏掉某些重复逻辑?
因为 useEffect 写法太灵活:有人写 useEffect(() => { ... }, []),有人拆成两行,还有人加了注释或空行。纯文本搜字面量必然漏。
- 用正则
useEffect\(\s*\(?\s*=>?\s*\{[\s\S]*?\},\s*\[?\s*\]?\s*\)?能覆盖大部分变体 - 但更实用的做法是:先搜
useEffect,再手动看每个结果的依赖数组是否为空([])且内部只做副作用(无return清理、无条件判断),这才是常见重复模式 - VSCode 的搜索不分析 AST,所以无法区分
useEffect(() => {}, [a, b])和useEffect(() => {}, [])的语义差异——得靠你肉眼判断上下文
搜索时如何排除 node_modules 和构建产物?
默认全局搜索会扫 node_modules、dist、build,不仅慢,还会把第三方库里的雷同代码当成本地重复。
- 在搜索面板底部
files to exclude输入:**/node_modules/**,**/dist/**,**/build/**,**/.git/** - 如果项目用 pnpm,加上
**/.pnpm/**;用 yarn v3,加上**/.yarn/** - 这些路径规则是 glob 模式,不是正则,不支持括号或
+,写错一个星号就可能失效 - 也可以在工作区根目录的
.vscode/settings.json里配"search.exclude",一劳永逸
真正难的不是搜出相同字符串,而是判断“这两段看着像,到底算不算重复逻辑”。比如一个地方 Math.round(a * 100) / 100,另一个地方封装成 roundToTwo(a) —— VSCode 搜不到后者,但它们确实是重复。这种只能靠静态分析工具补位,编辑器只是第一道筛子。



















