亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用Node.js腳本自動(dòng)統(tǒng)計(jì)代碼量的實(shí)現(xiàn)代碼

 更新時(shí)間:2023年12月08日 08:48:47   作者:JYeontu  
手動(dòng)統(tǒng)計(jì)代碼行數(shù)通常會(huì)耗費(fèi)大量時(shí)間和精力,為了提高統(tǒng)計(jì)效率并減少人為錯(cuò)誤,我們可以借助自動(dòng)化工具來(lái)完成這項(xiàng)任務(wù),本文將介紹如何使用 Node.js 腳本來(lái)自動(dòng)化統(tǒng)計(jì)項(xiàng)目代碼行數(shù),讓我們能夠輕松快捷地獲取項(xiàng)目的代碼量信息,需要的朋友可以參考下

說(shuō)在前面

在軟件開(kāi)發(fā)領(lǐng)域,了解項(xiàng)目的代碼規(guī)模和復(fù)雜度對(duì)于項(xiàng)目管理、團(tuán)隊(duì)協(xié)作以及技術(shù)評(píng)估都至關(guān)重要。通過(guò)統(tǒng)計(jì)項(xiàng)目代碼行數(shù),我們能夠更好地把握項(xiàng)目的整體情況,包括但不限于代碼量的大小、不同類型文件的分布情況以及項(xiàng)目的結(jié)構(gòu)和復(fù)雜度。這些信息對(duì)于項(xiàng)目負(fù)責(zé)人做出決策、開(kāi)發(fā)人員進(jìn)行優(yōu)化和維護(hù)、以及評(píng)估項(xiàng)目的進(jìn)度和質(zhì)量都具有重要意義。

然而,手動(dòng)統(tǒng)計(jì)代碼行數(shù)通常會(huì)耗費(fèi)大量時(shí)間和精力,特別是在大型項(xiàng)目中。為了提高統(tǒng)計(jì)效率并減少人為錯(cuò)誤,我們可以借助自動(dòng)化工具來(lái)完成這項(xiàng)任務(wù)。本文將介紹如何使用 Node.js 腳本來(lái)自動(dòng)化統(tǒng)計(jì)項(xiàng)目代碼行數(shù),讓我們能夠輕松快捷地獲取項(xiàng)目的代碼量信息,從而更好地進(jìn)行項(xiàng)目管理和開(kāi)發(fā)工作。

效果展示

實(shí)現(xiàn)代碼

1、引用依賴

  • fs 模塊提供了讀取文件內(nèi)容的功能;
  • path 模塊用于處理文件路徑;
  • @jyeontu/j-inquirer模塊用于進(jìn)行命令行交互。

2、計(jì)算指定文件的代碼行數(shù)

function countLines(filePath) {
  const fileContent = fs.readFileSync(filePath, "utf-8");
  const lines = fileContent.split("\n");
  let validLines = 0;

  for (const line of lines) {
    // 排除空行和以雙斜杠開(kāi)頭的行
    if (line.trim() !== "" && !line.trim().startsWith("http://")) {
      validLines++;
    }
  }

  return validLines;
}

countLines 函數(shù)接收一個(gè)文件路徑作為參數(shù),讀取文件內(nèi)容并按行分割,然后通過(guò)遍歷每一行判斷是否為有效代碼行??招泻鸵噪p斜杠 // 開(kāi)頭的行將被排除。

3、遍歷目錄并統(tǒng)計(jì)代碼行數(shù)的函數(shù)

function countCodeLines(dirPath, config) {
  const { fileType, ignoreName, maxLine } = config;
  let totalLines = 0;
  function traverseDirectory(directory) {
    const files = fs.readdirSync(directory);

    files.forEach((file) => {
      const filePath = path.join(directory, file);
      const stats = fs.statSync(filePath);

      if (stats.isDirectory() && !ignoreName.includes(file)) {
        traverseDirectory(filePath);
      } else if (stats.isFile() && checkEndWith(file, fileType)) {
        const lines = countLines(filePath);
        if (lines > maxLine) {
          maxLineMap[filePath] = lines;
        }
        const type = file.split(".")[file.split(".").length - 1];
        numMap[type] = (numMap[type] || 0) + lines;
        totalLines += lines;
      }
    });
  }

  traverseDirectory(dirPath);
  return totalLines;
}

traverseDirectory 函數(shù)用于遍歷指定目錄下的所有文件和子目錄。對(duì)于每個(gè)文件,它會(huì)判斷文件類型,并統(tǒng)計(jì)所需類型的文件的代碼行數(shù)。對(duì)于子目錄,會(huì)遞歸調(diào)用自身來(lái)處理。

4、文件類型限制

我們可以通過(guò)控制臺(tái)交互來(lái)設(shè)置需要統(tǒng)計(jì)的文件類型(如vue, js, css, html, ts)、需要忽略的目錄(如node_modules, dist),以及行數(shù)閾值,如下圖:

遍歷文件的時(shí)候先判斷是否為我們需要統(tǒng)計(jì)的文件類型:

function checkEndWith(file, fileTypeList) {
  for (const fileType of fileTypeList) {
    if (file.endsWith("." + fileType)) return true;
  }
  return false;
}

遍歷文件夾時(shí)忽略我們不需要統(tǒng)計(jì)的目錄:

if (stats.isDirectory() && !ignoreName.includes(file)) {
    traverseDirectory(filePath);
} else if (stats.isFile() && checkEndWith(file, fileType)) {
    const lines = countLines(filePath);
    if (lines > maxLine) {
      maxLineMap[filePath] = lines;
    }
    const type = file.split(".")[file.split(".").length - 1];
    numMap[type] = (numMap[type] || 0) + lines;
    totalLines += lines;
}

5、交互輸入保存

我們不希望每次都要重復(fù)修改設(shè)置需要統(tǒng)計(jì)的文件類型、需要忽略的目錄以及行數(shù)閾值,所以這里加入了一個(gè)配置文件,運(yùn)行腳本會(huì)讀取配置文件來(lái)設(shè)置默認(rèn)值,如下圖為config.json文件內(nèi)容

const config = require("./config.json");
const {fileType,ignoreName,maxLine} = config;
const options = [
    {
      type: "folder",
      message: "請(qǐng)選擇項(xiàng)目目錄:",
      name: "folderName",
      default: "",
      dirname: baseDir,
    },
    {
      type: "input",
      message: `請(qǐng)輸入需要統(tǒng)計(jì)的文件后綴(默認(rèn)為${fileType.join("、")}):`,
      name: "fileType",
      default: fileType.join("、"),
    },
    {
      type: "input",
      message: `請(qǐng)輸入需要忽略的文件或目錄(默認(rèn)為${ignoreName.join("、")}):`,
      name: "ignoreName",
      default: ignoreName.join("、"),
    },
    {
      type: "input",
      message: `請(qǐng)輸入單文件行數(shù)閾值(默認(rèn)為${maxLine}):`,
      name: "maxLine",
      default: maxLine,
    },
];

交互輸入后將輸入內(nèi)容更新到配置文件中,保留最后一次交互輸入的配置

const answers = await new inquirer(options).prompt();
for (const key in answers) {
    if (answers[key].includes("、")) answers[key] = answers[key].split("、");
}
const jsonData = JSON.stringify(answers, null, 2); // 將對(duì)象轉(zhuǎn)換為格式化的JSON字符串
try {
    fs.writeFileSync(path.join(__dirname, "./config.json"), jsonData, "utf-8");
} catch (err) {
    console.error("寫入文件時(shí)發(fā)生錯(cuò)誤:", err);
}

6、輸出結(jié)果

腳本會(huì)輸出每種類型文件的行數(shù)及總行數(shù),并統(tǒng)計(jì)出行數(shù)超出閾值的文件及行數(shù):

實(shí)際應(yīng)用:

代碼行數(shù)統(tǒng)計(jì)在實(shí)際項(xiàng)目管理中有著廣泛的應(yīng)用。以下是一些應(yīng)用案例:

1、評(píng)估項(xiàng)目規(guī)模

通過(guò)統(tǒng)計(jì)代碼行數(shù),可以對(duì)項(xiàng)目的規(guī)模有一個(gè)大致的了解。這對(duì)于項(xiàng)目排期、團(tuán)隊(duì)資源規(guī)劃等方面非常有幫助。

2、監(jiān)控代碼質(zhì)量

代碼行數(shù)統(tǒng)計(jì)可以作為一項(xiàng)質(zhì)量指標(biāo)之一,用于監(jiān)控代碼的復(fù)雜性和維護(hù)難度。隨著項(xiàng)目的進(jìn)行,代碼行數(shù)的增長(zhǎng)趨勢(shì)可能表示需求變更頻繁或代碼冗余。

3、決策重構(gòu)和優(yōu)化

通過(guò)統(tǒng)計(jì)代碼行數(shù),可以發(fā)現(xiàn)一些代碼量過(guò)大的文件或模塊。這些地方可能需要進(jìn)行重構(gòu)或優(yōu)化以提高代碼的可讀性和可維護(hù)性。

使用

該工具已經(jīng)發(fā)布到 npm 上,可以直接通過(guò)命令npm i -g jyeontu進(jìn)行安裝,安裝完后在控制臺(tái)中輸入jyeontu file即可進(jìn)行操作。選擇行數(shù)統(tǒng)計(jì)即可:

源碼

Gitee

該工具的源碼也已經(jīng)開(kāi)源,有興趣的同學(xué)可以到Gitee上查看:Gitee地址;

以上就是使用Node.js腳本自動(dòng)統(tǒng)計(jì)代碼量的實(shí)現(xiàn)代碼的詳細(xì)內(nèi)容,更多關(guān)于Node.js腳本自動(dòng)統(tǒng)計(jì)代碼量的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論