Ctrl+Shift+F(macOS为Cmd+Shift+F)是重构第一步,用于集中定位所有调用点;必须用\bgetUserInfo\b等单词边界避免误匹配;替换前需预览上下文、排除测试文件,并校验模块导出一致性。

Ctrl+Shift+F 是重构起点,不是辅助功能
重构时手动翻文件改函数名,等于主动放弃效率。Ctrl+Shift+F(macOS 用 Cmd+Shift+F)不是“顺手查一下”的工具,而是重构动作的第一步——它把散落在几十个文件里的调用点一次性拉到眼前。不打开这个面板就动笔改,大概率漏改、误改或改错上下文。
正则匹配 \b 边界符决定是否踩坑
直接搜 getUserInfo 会命中注释、字符串、变量名片段甚至类名,比如 getUserInfoModal 或 mockGetUserInfo。必须加单词边界:\bgetUserInfo\b 才只匹配独立函数名。
- 函数调用需保留参数:用
\bgetUserInfo\b\s*$$([^)]*)$$,替换为fetchUserDetails$1 - 方法调用(如
user.getUserInfo())要加点和空格:\.getUserInfo\b\s*$$([^)]*)$$ - 不加
\b的后果:替换后出现fetchUserDetailsModal这类语义错误
文件筛选器 !**/*.test.js 不是可选项
测试文件里大量使用旧函数名做断言,但它们不该被重构波及。一旦漏掉排除规则,getAllUsers 变成 fetchAllUsers 后,expect(mock.getAllUsers).toBeCalled() 就会报错。
- 常用组合:
**/*.js, **/*.ts(只搜源码) - 必须排除:
!**/*.test.js, !**/__tests__/**, !node_modules/** - 路径通配符不支持相对路径缩写,
src/*不等价于src/**/*.js,后者才递归匹配子目录
替换前必须点开每一处预览上下文
VSCode 的“全部替换”按钮不会判断语义。同一行里 const userInfo = getUserInfo(); 和 // fallback to getUserInfo if missing 都会被匹配,但只有前者该换。
- 点击文件名旁的三角展开,看高亮行前后 2–3 行代码
- 关注是否在
import语句、JSDoc、模板字符串或 JSX 属性中 - 对疑似边缘情况,先单个替换并运行单元测试,再推进其余
真正卡住重构进度的,从来不是正则写得够不够炫,而是某处 require('./utils').getUserInfo 被当成普通调用替换了,结果模块导出没同步更新。


















