这时候突然想到一个问题
有些文件夹下有大量的第三方引入和其他无需提取的文件。如果不对这些文件进行过滤,那么最后生成的文件树势必会有大量的无用路径。这时候需要做一个类似于gitIgnore功能的文件来进行相关配置。
这时候就要会node读取json
node读取json
node系统提供了require快捷引入json的方式。
也可以通过文件读取的形式,可以参考这个链接来看,这个帖子里说到如果json中如果有BOM相关的东西需要额外进行处理,由于这里不会遇到这个问题,所以先暂不去研究~
node事件
由于需要代码中会有大量的异步操作,除了非要用sync同步处理的API之外,在寻找更加推荐的异步处理办法。
最不推荐的就是回调套回调这种写法。
node中的事件系统可以很好的处理这个需求。可是文档上的events 那块依旧解释的很烂。这时候参考了下这篇帖子熟悉了下node的事件系统。
代码如下
const event = require('events').EventEmitter; //引入事件模块
fs.readFile(item+'\\GPIgnore.json','utf8',function (err,data) {
emitter.emit('aaa',data); //触发事件
});
emitter.on('aaa',function (data) { //注册事件
console.log(data)
})
在这里,会做这么一个逻辑:如果一个文件夹路径下有GPIgnore.json(generatePath)的时候,则认为该目录是需要被读取的,而如果路径下没有这个文件,则认为这个文件夹是不被读取的。
这一阶段结束之后的代码如下
const path = require('path');
const fs = require('fs');
const event = require('events').EventEmitter;
//同步读取所有的文件和文件夹
const rootPathList = fs.readdirSync('./');
let rootFileList = [],
rootDirList = [],
realDirList = [];
getRootPathList();
generateFileTree();
function getRootPathList(){
rootPathList.forEach(function (item, index) {
let fsStats = fs.statSync(item);
if(fsStats.isFile()){ //将文件和文件夹分类出来。
rootFileList.push(item);
}else if(fsStats.isDirectory()){
rootDirList.push(item);
}
})
}
function generateFileTree(path){
const emitter = new event();
rootDirList.forEach(function (item) {
//这里用同步的写法而不用异步的
try{
file = fs.readFileSync(item+'\\GPIgnore.json','utf8');
}catch (e){
console.log(e)
}
fs.readFile(item+'\\GPIgnore.json','utf8',function (err,data) { //读取json配置文件
if(err){ //这里要做这个判断,没有这个json的路径不需要进行后续的处理。
}else{
realDirList.push(item);
emitter.emit('haveGPIgnore',{
path:item,
data:JSON.parse(data)
});
}
});
})
emitter.on('haveGPIgnore',function (data) {
console.log(data)
})
}