专业编程基础技术教程

网站首页 > 基础教程 正文

用NodeJS编写的FindUsages(查找引用)工具

ccvgpt 2024-07-18 12:54:14 基础教程 5 ℃

最近在用NodeJS写项目,无奈查找关联引用太麻烦,因此萌生了写一个FindUsages小工具的想法。

// 公用包

用NodeJS编写的FindUsages(查找引用)工具

var fs = require('fs-extra'); // 基于fs组建开发的封装

var glob = require('glob'); // 可全局(渗透)查找相关后缀的文件

var path = require('path'); // 用于处理文件路径,主要是配合glob一起用的

var readline = require('readline'); // 用于以行形式读取文本类文件,这里是用于查找 line和index

废话不多说,直接贴代码。

// 命令行参数处理

var args = process.argv.splice(2);

let targetModel = args[0]; // 目标引用模型,也就是查询引用了该模型的文件

let ext = args[1] || 'js'; // 从哪种拓展名文件搜索,默认是 js文件

// 封装通用方法

function hasTarget (content) { // 用于判断是否包含目标引用

let index = content.indexOf(targetModel);

return [index >= 0, index]; // 返回 是否存在引用和引用所在位置的封装数组

}

// 开始查找

if (targetModel) { // 判断是否传入了应用名

var targetDir = path.resolve(__dirname, './'); // __dirname 则是当前文件夹

var globPath = targetDir + '/**/*.' + ext;

glob.sync(globPath).forEach((file) => {

var isExistTarget = false; // 用于判断该文件是否引用了目标

var lineCount = 1; // 用于记录引用行数

var lineIndex = []; // 用于记录每一行的引用位置

var rl = readline.createInterface({ // 创建行阅读组建的实例

input: fs.createReadStream(file, {enconding: 'utf8'}),

output: null

});

rl.on('line', (lineContent) => { // 添加行阅读事件

let result = hasTarget(lineContent);

if (result[0]) { // 如果该行存在引用

isExistTarget = true; // 标志该文件引用了目标

lineIndex.push(lineCount + ':' + result[1]); // 记录该行数以及该行首个引用位置

}

lineCount++;

}).on('close', () => { // 添加实例关闭事件

if (isExistTarget) { // 如果引用了目标,则打印文件相对路径以及引用行数和引用位置

console.log(file.substr(__dirname,length) + ' Lines: ' + lineIndex.join(' '));

console.log('--------华丽的分割线--------');

}

});

});

}

// 使用方法

// node 工具名 引用名 [拓展名(要从什么类型文件中搜索)]

node findUsages glob js

// 相关开源

// FindUsages 开源链接

https://www.npmjs.com/package/find_usages

// 个人开源

// https://github.com/ChangedenCZD

// 个人网站

// http://www.changeden.net

Tags:

最近发表
标签列表