使用Node.js腳本自動(dòng)統(tǒng)計(jì)代碼量的實(shí)現(xiàn)代碼
說(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)文章
node.js使用npm 安裝插件時(shí)提示install Error: ENOENT報(bào)錯(cuò)的解決方法
這篇文章主要介紹了node.js使用npm 安裝插件時(shí)提示install Error: ENOENT報(bào)錯(cuò)的解決方法,需要的朋友可以參考下2014-11-11深入理解Node.js中CORS的三個(gè)重要響應(yīng)頭
CORS是一種安全機(jī)制,通過(guò)配置適當(dāng)?shù)捻憫?yīng)頭,服務(wù)器可以允許或限制外部域?qū)Y源的訪問(wèn),本文主要介紹了Node.js中CORS的三個(gè)重要響應(yīng)頭,感興趣的可以了解一下2024-12-12win10環(huán)境使用nvm安裝多版本nodejs并配置環(huán)境變量的完整步驟
這篇文章主要給大家介紹了關(guān)于win10環(huán)境使用nvm安裝多版本nodejs并配置環(huán)境變量的相關(guān)資料,需要的朋友可以參考下2024-01-01node 安裝 windows-build-tools全過(guò)程
這篇文章主要介紹了node 安裝 windows-build-tools全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10