Angular13搭配RxJS7:如何用脚本将$obs.toPromise()迁移为lastValueFrom($obs)
RxJS 7
toPromise() 批量迁移脚本 你提供的基础实现思路是可行的,修复了原有逻辑缺陷、适配绝大多数业务场景的可直接运行脚本如下:
前置注意事项
- 执行脚本前务必将所有未提交的改动存入Git,避免修改错误无法回滚
- 脚本默认仅扫描src目录下的.ts文件,自动排除node_modules、dist等构建目录
- 会自动判断文件是否已经导入
lastValueFrom,不会重复添加导入语句
使用步骤
- 在项目根目录安装开发依赖:
npm install glob @types/glob ts-node -D
- 项目根目录新建
replace-to-promise.ts文件,粘贴下方优化后的脚本代码 - 执行迁移命令:
npx ts-node replace-to-promise.ts
- 迁移完成后手动校验边缘场景:
- 自定义类/方法命名为
toPromise的非RxJS调用 - 无赋值、无await的独立
toPromise()调用 - 多级链式调用嵌套场景下的替换是否正确
优化后脚本代码
import * as fs from 'fs'; import * as glob from 'glob'; // 不需要扫描的目录可在ignore数组中添加,需要排除测试文件可加 !src/**/*.spec.ts const files = glob.sync(`src/**/*.ts`, { ignore: ['node_modules/**', 'dist/**'] }); let changedFileCount = 0; files.forEach(file => { const fileContent = fs.readFileSync(file, 'utf-8'); // 跳过没有toPromise调用的文件 if (!fileContent.includes('toPromise()')) return; // 替换所有匹配的.toPromise()调用,支持带await、不带await直接赋值的场景 const replacedContent = fileContent.replace(/([^\s]+)\.toPromise\(\)/g, 'lastValueFrom($1)'); // 无有效替换则跳过 if (replacedContent === fileContent) return; // 校验是否已经存在lastValueFrom导入 const hasLvfImport = /import\s*{\s*[^}]*lastValueFrom[^}]*}\s*from\s*['"]rxjs['"]/.test(replacedContent); const finalContent = hasLvfImport ? replacedContent : `import { lastValueFrom } from 'rxjs';\n${replacedContent}`; fs.writeFileSync(file, finalContent, 'utf-8'); changedFileCount++; console.log(`已处理:${file}`); }); console.log(`迁移执行完毕,共修改 ${changedFileCount} 个文件`);
内容的提问来源于stack exchange,提问作者ar099968
相关产品推荐
相关产品推荐

