使用 nodejs 判断本地文件是否变更信息
当我们在日常开发中需要上线压缩文件时,通常的做法是整个目录的全部压缩一遍。当项目很大或者入口很多的时候,压缩这个过程非常痛苦,尤其是uglifyjs的压缩大文件速度让人发指。
那么,如果想节约时间,最好的办法就是只压缩 合并后 有内容变更的文件。
这个实现起来很简单,原理不过就是字符串读来,然后md5一下,存到一个地方,下次再读md5的时候比对一下,有变化的既为变更文件。
我专门从自己的项目里抽出了一部分代码,写了个 package。主要代码实现如下:
/**
* @author xiaojue
* @email designsor@gmail.com
* @fileoverview 获取路径下变化的文件列表
*/
var lithe = require('lithe');
var fs = require('fs');
var crypto = require('crypto');
var path = require('path');
var hfs = lithe.hfs;
function getMd5(p){
var str = fs.readFileSync(p,'utf-8');
var md5um = crypto.createHash('md5');
md5um.update(str);
return md5um.digest('hex');
}
function gcf(){
this.database = path.join(process.cwd(),'./.gcf');
if(!fs.existsSync(this.database)){
hfs.writeFileSync(this.database,'{}','utf-8');
}
}
gcf.prototype = {
constructor:gcf,
get:function(p,filter){
var self = this,
base = fs.readFileSync(this.database),
changedList = [],
files;
base = JSON.parse(base);
hfs.walk(p,function(lists,a){
files = lists;
files.forEach(function(filepath){
var md5str = getMd5(filepath);
if(!base[filepath] || (base[filepath] && base[filepath] !== md5str)) changedList.push(filepath);
base[filepath] = md5str;
});
hfs.writeFileSync(self.database,JSON.stringify(base),'utf-8');
},{
filter:filter
});
return changedList;
}
};
module.exports = new gcf();
使用起来也还不错,因为考虑到实际需求,全部都做成同步执行的了,没有什么异步复杂回调的担忧,本地保存了一个.gcf文件来记录每次的md5值,就酱紫。
var gcf = require('gcf');
var changed = gcf.get('./',function(item){
if(item.match(/^node_modules|^\./)) return false;
return true;
});
console.log(changed); // [];
这是使用方法,直接获取到变化文件列表数组。
https://github.com/xiaojue/getChangeFiles 是项目地址。
npm install gcf
可一键安装
</>
</>