使用 jscpd(JavaScript Copy/Paste Detector)工具检测指定路径下的代码文件中的重复代码,并输出重复代码的相关信息。
相关文章
检测重复代码
功能清单
- 解析目标路径: 使用 Node.js 内置的 path 模块解析指定的文件或目录路径,并将其转换为绝对路径格式。
- 定义检测选项: 根据解析得到的目标路径,设置 jscpd 检测重复代码的选项,包括检测路径、最小代码块大小、最小行数、最大行数等。
- 执行重复代码检测: 调用 jscpd 的 detectClones 函数进行重复代码检测,并等待检测结果。
- 处理检测结果: 对检测得到的重复代码信息进行处理,提取重复代码的相关信息,包括源文件名、起止行号等,并存储到一个数组中。
- 输出重复代码信息: 将处理后的重复代码信息数组输出到控制台,供开发者查看和分析。
一、jscpd是什么
jscpd 是一个用于检测和分析代码重复的工具。它可以帮助开发者发现代码中的重复部分,从而改善代码质量、减少重复工作、提高代码的可维护性。
通过 jscpd,您可以指定要检测的目标文件或目录,并设置检测的参数,例如最小代码块大小、最小行数、最大行数等。工具会分析这些文件或目录中的代码,找出其中的重复部分,并提供详细的报告,指出重复代码的位置、内容等信息,帮助开发者识别和解决代码重复的问题。
二、使用jscpd检测重复代码
1、定义检测选项
1 2 3 4 5 6 7 8 9 10
| function defineDetectionOptions(targetPath) { const options = { path: [targetPath], minTokens: 10, minLines: 5, maxLines: 1000, silent: true, }; return options; }
|
2、检测重复代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| function resolveTargetPath() { const targetPath = path.resolve(__dirname, "./src").replace(/\\/g, '/'); console.error("检测路径:", targetPath); return targetPath; }
const duplicateResults = [];
async function detectDuplicateCode() { try { const targetPath = resolveTargetPath(); const options = defineDetectionOptions(targetPath);
const clones = await detectClones(options);
processClones(clones);
console.log("重复代码信息:"); console.log(duplicateResults); } catch (error) { console.error("检测重复代码时发生错误:", error); } }
|
3、提取重复代码信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function processClones(clones) { clones.forEach((clone) => { const { duplicationA, duplicationB } = clone;
duplicateResults.push({ 源文件: duplicationA.sourceId, 源内容: `${duplicationA.start.line} - ${duplicationA.end.line}行`, 目标文件: duplicationB.sourceId, 目标内容: `${duplicationB.start.line} - ${duplicationB.end.line}行`, }); }); }
|
三、完整示例
src目录
a.js
1 2 3 4 5 6 7 8 9 10 11
| var a = 1 var b = 1 var c = 1 var d = 1 var e = 1 var f = 1 var g = 1 var h = 1 var i = 1 var j = 1 var k = 1
|
b.js
1 2 3 4 5 6 7 8 9 10
| var a = 1 var b = 1 var c = 1 var d = 1 var e = 1 var g = 1 var h = 1 var i = 1 var j = 1 var k = 1
|
检测方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| const { detectClones } = require("jscpd"); const path = require("path");
function resolveTargetPath() { const targetPath = path.resolve(__dirname, "./src").replace(/\\/g, '/'); console.error("检测路径:", targetPath); return targetPath; }
function defineDetectionOptions(targetPath) { const options = { path: [targetPath], minTokens: 10, minLines: 5, maxLines: 1000, silent: true, }; return options; }
const duplicateResults = [];
async function detectDuplicateCode() { try { const targetPath = resolveTargetPath(); const options = defineDetectionOptions(targetPath);
const clones = await detectClones(options);
processClones(clones);
console.log("重复代码信息:"); console.log(duplicateResults); } catch (error) { console.error("检测重复代码时发生错误:", error); } }
function processClones(clones) { clones.forEach((clone) => { const { duplicationA, duplicationB } = clone;
duplicateResults.push({ 源文件: duplicationA.sourceId, 源内容: `${duplicationA.start.line} - ${duplicationA.end.line}行`, 目标文件: duplicationB.sourceId, 目标内容: `${duplicationB.start.line} - ${duplicationB.end.line}行`, }); }); }
detectDuplicateCode();
|
输出结果