一个脚本实现批量修改文件,减少重复工作

假设有这么一个场景,我们接收一个 React 的旧项目,该项目使用的是 js 开发的,按照正常来说,该文件的结尾应该是使用 jsx 来进行开发的,但是项目中使用的是 js 文件结尾来进行编写。

我们想要更改一下所有的文件,那么我们有什么办法去修改到这些文件,又能实现节省时间呢,通过这篇文章我们将来学习一下怎么通过这个脚本来实现这个功能。

实现

具体代码实现如下所示:

js 复制代码
const fs = require("fs");
const path = require("path");

const srcDirectory = "./src";

// 正则表达式匹配JSX标签
const jsxRegex = /<\w+(\s+[^>]*)*>/;

// 递归地遍历文件夹
function walkDir(dir, callback) {
  fs.readdirSync(dir).forEach((f) => {
    let dirPath = path.join(dir, f);
    let isDirectory = fs.statSync(dirPath).isDirectory();
    isDirectory ? walkDir(dirPath, callback) : callback(dirPath);
  });
}

// 检查文件内容是否包含JSX代码
function checkAndRename(filePath) {
  const content = fs.readFileSync(filePath, "utf8");
  if (jsxRegex.test(content)) {
    const newPath = filePath.replace(/\.js$/, ".jsx");
    fs.renameSync(filePath, newPath);
    console.log(`Renamed: ${filePath} -> ${newPath}`);
  }
}

// 开始遍历src目录
walkDir(srcDirectory, (filePath) => {
  if (path.extname(filePath) === ".js") {
    checkAndRename(filePath);
  }
});

这段代码的核心是一个递归函数,遍历所有文件夹和文件。对于每个.js 文件,脚本读取其内容并使用正则表达式检测是否存在 JSX 模式。如果检测到 JSX,脚本就会将文件重命名为.jsx。

为什么要检测他是否有写 jsx 代码,而不是是否有引入 React 的依赖包呢?答案是在 nextjs 中,你可以不导入 react 依赖包的情况下可以直接编写 jsx 代码,因为在项目中,src 目录下我们不仅要 jsx 代码,还包括了一些工具函数,这些函数是不需要 jsx 文件结尾的。

接下来我们看看该代码的运行结果,首先创建如下文件:

执行代码,最终结果如下图所示:

代码执行完成,只有 index.js 文件发送了变化,utils.js 并没有发生变化。

这个过程是自动的,可以在几秒钟内处理整个项目。

总结

自动化工具和脚本是现代软件开发的重要组成部分,能够显著提高开发效率和代码质量。通过使用简单但强大的脚本,如本文介绍的 JS 到 JSX 的转换器,开发团队可以更加专注于创造价值,而不是重复的、机械的任务。

相关推荐
@大迁世界41 分钟前
41.ShadCN 是什么?它如何和 Tailwind CSS 集成,从而更容易构建可访问且可自定义的 React 组件?
前端·javascript·css·react.js·前端框架
千叶风行1 小时前
Text-to-SQL 技术设计与注意事项
前端·人工智能·后端
软件开发技术深度爱好者1 小时前
HTML5+JavaScript读取DOCX 文档完整内容
前端·html5
幽络源小助理2 小时前
苹果CMS V10 MXPro V4.5模版下载, 自适应视频主题源码, 幽络源源码
前端·开源·源码·php源码
kyriewen2 小时前
坏了,黑客学会用AI写外挂了
前端·程序员·ai编程
xiangxiongfly9153 小时前
Vue3 根据角色权限动态加载路由
前端·javascript·vue.js·动态加载路由
达达尼昂3 小时前
Claude 多 Agent 系统:从零搭建一个 4 Agent 团队
前端·架构·ai编程
费曼学习法4 小时前
React 18 并发模式(Concurrent Mode):Fiber 架构的终极进化
javascript·react.js
容智信息4 小时前
AI Agent(智能体)的输出格式应该从 Markdown 转向 HTML吗?
前端·人工智能·rust·编辑器·html·prompt
_风满楼4 小时前
TDD 进阶:换个角度看会议室预约
前端·javascript·github