必须先打开文件夹工作区,否则ctrl+shift+h仅作用于当前文件;全局替换未扫到src文件是因为处于单文件模式,需通过file→open folder…加载项目根目录,并确认右下角显示“1 root”等多根提示。

必须先打开文件夹工作区,否则 Ctrl+Shift+H 仅作用于当前文件,根本不会扫描子目录。
为什么全局替换没扫到 src 下的文件?检查工作区是否加载正确
VSCode 的全局替换(Ctrl+Shift+H)只在「已打开文件夹」状态下生效。如果左下角状态栏显示 No folder opened 或只显示一个文件名(如 index.ts),说明你处于单文件模式——此时快捷键会退化为当前文件内替换,node_modules、dist 等目录压根不会被纳入范围。
务必通过 File → Open Folder… 打开项目根目录(例如 my-app/),而非用 Open File… 直接打开某个 .ts 文件。
- 多根工作区(
.code-workspace)也支持,但需确认所有文件夹图标旁无感叹号 - 右下角若显示「1 root」或「2 roots」,说明工作区已就绪
- 临时验证:按
Ctrl+Shift+F搜export default,看是否列出多个文件;若只列 1 个,大概率是工作区没开对
如何排除 node_modules、dist 等目录?用 files to exclude 而非依赖默认规则
VSCode 默认跳过 node_modules、.git 是靠内置规则,但这些规则不透明、不可控,且可能被用户级 search.exclude 配置覆盖。真正可靠的做法是每次替换时手动设置排除项。
操作路径:Ctrl+Shift+H → 点击搜索面板右上角 … 图标 → 在 files to exclude 输入框填:
node_modules, dist, **/test/**, *.log
注意:
- 多个路径用英文逗号分隔,不要加空格
-
**/test/**表示递归匹配所有 test 子目录,dist匹配根级 dist 文件夹 - 想临时包含被默认排除的目录(比如要改
dist/index.html),直接清空files to exclude或删掉对应项 - 这些过滤只影响本次搜索,不会修改
.vscode/settings.json
只想替换 src 下的 .ts 文件?用 files to include 精确收口
比起“排除一堆”,更安全的做法是明确“只包含哪些”。尤其在大型项目中,files to include 能避免漏掉本该处理的文件,也能防止误触配置文件或构建产物。
典型写法:
src/**/*.ts
或更严格:
src/**/!(*.d).ts
常见错误:
- 填
*.ts→ 会匹配根目录下的tsconfig.json(它含.ts字符串),也可能扫到__tests__里的 .ts - 填
src/*.ts→ 只匹配 src 根目录,忽略src/utils/foo.ts - 忘记点
files to include旁的… → Add pattern,直接输内容可能被忽略
替换后文件没变?确认是否手动保存 + 检查文件是否被忽略
VSCode 替换完不会自动保存文件,这是最容易被忽略的一环。替换完成后,必须按 Ctrl+Shift+S(全部保存)或逐个文件 Ctrl+S,否则 Git diff 看不到任何变更。
另一个隐形坑:某些文件即使在文件夹里,也可能被 VSCode 主动跳过:
- 文件名匹配了
files.exclude或search.exclude中的 glob 模式(如**/*.min.js) - 文件编码异常(如 UTF-16),VSCode 默认不搜索非 UTF-8 编码文件
- 文件被 Git 标记为
assume-unchanged,VSCode 有时会同步跳过 - 搜索前未点击
Find All,导致Replace All只作用于已缓存的少量匹配项
遇到“明明有匹配却没替换”,优先打开命令面板(Ctrl+Shift+P),运行 Developer: Toggle Developer Tools,看 Console 是否报 searchService: no results 类错误——这往往指向排除规则或编码问题。











