.ts未生效是因为它只匹配根目录下的TS文件,而src/**/*才递归匹配子目录;VSCode的“包含文件”严格按glob语法解析,不支持模糊匹配或自动补全,必须明确路径前缀以避免误触非业务代码。

为什么*.ts没生效,但src/**/*.ts可以?
VSCode 的“包含文件”字段不支持模糊匹配或自动补全,它严格按 glob 语法解析。写*.ts只匹配**当前工作区根目录下**的 .ts 文件(比如 index.ts),而不会进入子目录;**/*.ts才真正递归匹配所有层级。但更稳妥的是用src/**/*.ts——明确路径前缀能避免误触测试文件、配置脚本等非业务代码。
常见错误现象:替换后发现 src/api/user.ts 没被修改,但面板里显示“已替换 0 处”。大概率是“包含文件”填了*.ts或留空,导致 VSCode 默认扫描整个工作区(含 node_modules),结果因性能限制提前终止或跳过深层路径。
- 务必在“包含文件”输入框中填写带通配符的完整路径模式,如
src/**/*.ts、packages/**/src/**/*.vue - 不要依赖“默认范围”,VSCode 不会智能推断你想要的业务目录
- 如果项目有 Monorepo 结构,优先用
packages/*/src/**/*.ts而非**/*.ts,减少干扰
Replace in Files 和 Replace All 按钮根本不是一回事
点右上角那个带两个箭头的Replace All按钮,只是把当前已高亮的匹配项在内存里改了——文件标题栏出现 ● 圆点,不代表已写入磁盘。真正触发文件打开、编辑、保存三连操作的是Replace in Files(两个重叠文档图标),它才会实际修改未打开的文件。
容易踩的坑:
- 你在搜索面板输完内容,直接狂点
Replace All,结果关掉 VSCode 后发现全白忙——因为没保存,也没真正写入 - 某文件处于只读状态(右下角显示
Read-only),Replace in Files会静默跳过,不会报错也不会提示 - 没提前启用
Auto Save(File > Auto Save→afterDelay),手动保存时可能漏掉几个标签页
正则替换里$1不生效?先确认这三件事
写import\s+(\w+)\s+from\s+['"](.+?)['"]想捕获模块名和路径,替换填import $1 from "$2"却没变化?问题往往不在正则本身,而在开关没开对。
-
.*图标必须点亮(启用正则),否则括号会被当字面量,$1就是普通文本 -
.(跨行匹配)图标不能误点——它让.匹配换行符,在 JS/TS/HTML 中绝大多数场景不需要,开了反而常导致匹配失败 - 捕获组编号从左到右严格计数:
(?:non-capture)(\w+)中的\w+是$1,但(?:non-capture)不占编号;而\1是 PCRE 写法,VSCode 只认$1
排除node_modules靠的是search.exclude,不是“包含文件”
很多人以为在“包含文件”里填**/*.ts就万事大吉,结果搜了半天没结果——其实是 search.exclude 在后台静默拦截。VSCode 默认排除 **/node_modules/**、**/.git/**、**/dist/**,这个规则比“包含文件”优先级更高。
检查方式:
- 按
Ctrl+Shift+P→ 输入Preferences: Open Workspace Settings (JSON)→ 查看是否有search.exclude条目 - 临时绕过:搜索面板右上角点击
⋯→ 取消勾选使用排除设置(仅本次生效) - 路径陷阱:
**/api/**会排除所有含api的子目录(如src/utils/apiClient),而src/api/**才只排除顶层src/api
真正安全的做法是:先确认 search.exclude 没锁死你要改的目录,再填精准的 include 模式,最后点 Replace in Files —— 三者缺一不可。


















