FED

©FrontEndDev.org
2015 - 2024
web@2.22.0 api@2.20.0

使用 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 

可一键安装