CodeMirror Duplicate Finder 默认跳过 node_modules、.gitignore 路径和二进制文件,避免拖慢扫描与误报;需手动启用 "duplicate-finder.includeNodeModules": true(v1.4.0+)才可检查第三方库。

CodeMirror Duplicate Finder 默认不扫描 node_modules
它按默认配置会跳过 node_modules、.gitignore 排除路径和二进制文件,所以哪怕你项目里装了两个都带 debounce 实现的库(比如 lodash 和 underscore),插件也根本不会去读它们的源码。这不是 bug,是设计使然——避免拖慢扫描、防止误报。
想让它查第三方库,得手动放开限制:
- 在 VSCode 设置中搜索
files.exclude,删掉或注释掉"**/node_modules/**": true这一行 - 打开
settings.json,加一条:"duplicate-finder.includeNodeModules": true(注意:该配置项需插件 v1.4.0+ 才支持;旧版不识别,得升级) - 确认目标库没被
.vscode/settings.json或工作区设置二次排除
为什么查到的“重复”大概率是假阳性
第三方库代码结构高度相似(比如都用 IIFE 包裹、都有相同的 UMD 模块头、都带类似的 license 注释块),CodeMirror Duplicate Finder 会把它们当成重复块高亮——但它只比对文本行,不理解模块作用域或导出差异。
常见干扰项包括:
- 所有 ES 模块开头的
import块(import { debounce } from 'lodash'vsimport debounce from 'underscore') - 构建产物里的重复打包头(如 Webpack 的
/***/ (function(module, exports, __webpack_require__) {) - 同一作者写的多个库共用的工具函数(比如
isPlainObject在lodash、jquery、axios的 dist 文件里都出现过)
这些不是你该合并的“重复”,而是依赖本身的合理复用。别急着删,先看它是否出现在你自己的 src/ 目录下。
真要定位第三方库间的逻辑重叠,换工具更靠谱
CodeMirror Duplicate Finder 是为项目源码设计的,不是为依赖分析。查第三方库重复,优先用语义级静态分析工具:
- 运行
npx simian@3.2.0 -includes=**/*.js,**/*.ts -threshold=80 ./node_modules/lodash ./node_modules/underscore(simian能忽略空格/换行/变量名,更适合比对压缩前源码) - 用
depcheck查未使用依赖,间接减少“疑似重复”的引入面:npx depcheck --ignore-bin-package-managers - 在 VSCode 中打开某个第三方库源码(比如
node_modules/lodash/debounce.js),右键 →Find Duplicates in File,只做单文件内结构自查(常能发现库自己打包时混入的冗余 polyfill)
最该警惕的其实是“你自己写的胶水层重复”
真正危险的不是 lodash 和 underscore 都实现了 debounce,而是你写了两段一模一样的封装:
export const apiClient = axios.create({ baseURL: '/api' });
// —— 然后在 utils/request.ts 和 services/user.ts 里各 copy 了一次
这类重复藏在你自己的代码里,但调用的是第三方 API。检测它,反而不需要碰 node_modules:
- 用
Ctrl+Shift+F搜axios.create、new WebSocket、fetch(这类特征字符串,快速定位调用点 - 把搜出的几处代码块复制进 diffchecker.com,人工比对结构
- 检查是否漏配了
duplicate-finder.includeStrings: true——很多胶水层逻辑藏在模板字符串或 JSX 属性里(比如url: `/api/${type}/list`)
第三方库本身是否重复,通常属于架构决策问题;而你写在项目里、又调用它们的那层薄薄的 glue code,才是重复高发区,也是唯一值得用工具扫一遍的地方。











