安全批量重命名 Vue3 的 useXxx Hook 需分步验证:先用 \buseUser\b 精准定位、限定 src/**/composables/ 等路径,替换为 useNewUser_TEMP 后通过类型检查再去除后缀;ref 提取需负向断言避坑,watch/computed 必须人工判断依赖与副作用;每次替换后必须运行 vue-tsc、启动服务查警告、全局搜索残留旧名。

Sublime 的正则表达式不能自动识别 Vue3 的组合式 API 语义,所有“重构”操作本质是带防护的文本替换;盲目跨文件 Replace All 极易把 useUser 改成 useNewUser 后又变成 useNewNewUser,必须分步验证 + 作用域人工判断。
如何安全批量重命名 useXxx 自定义 Hook
Vue3 中自定义 Hook 命名有强约定(use 开头 + 驼峰),这是正则能借力的唯一锚点。但 use 本身太常见,直接搜 useUser 会命中注释、字符串甚至 userStore 里的子串。
- 先用
Ctrl+F搜\buseUser\b,确认高亮全部落在import行或const xxx = useUser()调用处,排除"useUser": true这类 JSON 值 - 跨文件替换时,
Where栏必须限定路径:src/**/composables/*.ts, src/**/hooks/*.js,坚决避开node_modules和测试文件 - 替换目标别直接写
useNewUser——先替换成useNewUser_TEMP,跑一遍npm run type-check或vue-tsc --noEmit,确认无Cannot find name 'useNewUser'报错再删_TEMP
ref / reactive 变量批量提取与结构调整
重构时经常要把分散在 setup() 里的状态收进 useXxx(),这时需要把 const count = ref(0) 这类声明精准抽出来,但不能误伤 ref 的其他用法(如 ref(null)、toRef)。
- 搜
const\s+\w+\s*=\s*ref\s*\(\s*(?!(null|undefined|true|false))—— 利用负向先行断言避开基础字面量,匹配真正带业务值的ref - 替换时用捕获组:查找
const (\w+) = ref\((.*?)\);,替换为\1: ref(\2),(注意缩进和逗号),快速生成reactive({})内部结构 - 若目标是转成
ref(比如从reactive({ count: 0 })提取),搜(?,但必须手动检查是否漏掉计算属性或函数
为什么 computed 和 watch 不能靠正则批量移动
这两者依赖上下文:一个 computed(() => user.name) 能否移进 useUser,取决于 user 是否已作为参数传入;watch 更危险,watch(count, ...) 若 count 是局部变量,硬塞进 Hook 会导致引用丢失。
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
立即学习“前端免费学习笔记(深入)”;
- 正则根本无法判断
user是来自props、inject还是另一个ref,所以computed必须逐个看返回值是否只依赖当前 Hook 的输入 -
watch的回调里若有router.push或ElMessage这类副作用,说明它耦合了组件层逻辑,不该放进纯逻辑 Hook —— 这种判断只能人眼扫,正则只会帮你找到它们在哪 - 真要批量处理,只做最保守动作:用
\bwatch\s*\(\s*[\w.$]+,\s*function或\bwatch\s*\(\s*[\w.$]+,\s*\(定位,然后逐个打开文件,按Ctrl+D选中整个 watch 块再剪切
替换后必须立刻验证的三件事
正则改完代码只是第一步,Vue3 的响应式链和类型系统会立刻暴露问题,不验证等于没改。
- 运行
vue-tsc --noEmit:检查是否出现Property 'xxx' does not exist on type '...',这说明你漏改了某处解构或模板绑定 - 启动开发服务器,打开浏览器控制台,重点看是否有
[Vue warn]: Unhandled error during execution of watcher或Maximum recursive updates—— 这往往是因为watch里直接改了被监听源 - 搜索项目里残留的旧名:用
Ctrl+Shift+F搜\buseOldName\b和\bOldStateName\b,尤其注意.vue文件的<script setup>区块,那里容易漏掉未解构的引用
真正卡住重构进度的,从来不是正则写得够不够复杂,而是你有没有在每次 Replace All 前,花三秒确认 Where 路径、点一下 Find All 预览、以及改完后盯着终端看那几行类型错误——这些步骤跳过,后面 git revert 花的时间,够你手写两个新 Hook。

















