這時候突然想到一個問題
有些文件夾下有大量的第三方引入和其他無需提取的文件。如果不對這些文件進行過濾,那么最后生成的文件樹勢必會有大量的無用路徑。這時候需要做一個類似于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)
})
}