nodejs给文件链接添加md5

nodejs给文件链接添加md5

点点

2021-05-05 10:22 阅读 383 喜欢 0

因为没有用到webpack ,是java项目,所以准备做一个小工具,检索jsp或html中引用css js的地方,并根据对应的路径找到文件,对文件进行md5计算,最后给链接更新一个md5值,这样没有变化的就会缓存,有变化的就会从服务器更新。

大体思路

1.检索目标目录下的jsp 或 html 2.读取内容,根据正则找到 link 或 script 3.根据规则,找到对应的目录的文件 4.读取文件,计算MD5 5.更新回原来的地址 6.结束

代码实现

准备使用nodejs 来实现。

    //给jsp 或 html 中的css js 添加fileMd5值
    var fs = require('fs'),
readline = require('readline'),
path = require('path'),
join = path.join,
extname = path.extname,
async = require('async'),
colors = require('colors'),
url = require('url'),
crypto = require('crypto'),
qs = require('querystring');

    function AddMd5(directory,opts){
this.directory = directory;
this.fileList = [];
this.count = 0;
this.extList = opts.extList;//['.jsp','.html','.htm'];
this.exclude = opts.exclude;//['plugins'];
this.compress = opts.compress;
this.replace = opts.replace;//['${basepath}','${staticresdomain}','<%=basepath%>'];//替换字符串
return this;
 }
   //获得符合条件的文件
    AddMd5.prototype.getFiles = function(dirPath){
var thiz = this;
if(fs.existsSync(dirPath)){
    var files = fs.readdirSync(dirPath);
    if(files && files.length > 0){
        for(var i=0,max=files.length;i<max;i++){
            var temp = files[i];
            var filePath = join(dirPath,temp);
            var stats = fs.statSync(filePath);
            if(stats.isDirectory() && thiz.exclude.indexOf(temp) < 0){
                //继续
                thiz.getFiles(filePath);
            }else{
                var fileExt = extname(filePath).toLowerCase();
                if(thiz.extList.indexOf(fileExt) > -1){
                    //符合
                    thiz.fileList.push(filePath);
                }
            }
        }
    }
}
}
  AddMd5.prototype.start = function(){
var thiz = this,
    directory = thiz.directory;
thiz.getFiles(directory);
console.log('共计扫描到 '.green+(''+thiz.fileList.length).red+' 个符合条件的文件'.green);
async.mapLimit(thiz.fileList,5,function(item,cb){
    thiz.scan(item,cb);
},function(err,value){
    console.log('共计替换 '.green+(''+thiz.count).red +' 个链接'.green)
});
};

    AddMd5.prototype.scan = function(filePath,callback){
var thiz = this,compress = thiz.compress;
var is = fs.createReadStream(filePath);
var inter = readline.createInterface({input :is});
var strArr = '';
inter.on('line',function(line){
    var rst = thiz.checkLine(line);
    if(rst){//检查到有内容
        //处理并替换
        var type = rst.type;
        var md5 = rst.md5;
        //检索并替换
        var arr = /src[\s]*=[\s]*[\"\']?([^\'\"]*)[\'\"]?/i.exec(line);
        if(arr && arr.length > 0){
            var src = arr[1];
            var query = url.parse(src).query;
            var src2 = src.indexOf('?') > -1 ? src.substring(0,src.indexOf('?')) : src;
            var qsObj = qs.parse(query);
            qsObj.v = md5.substring(0,5);
            var qsStr = qs.stringify(qsObj);
            var newSrc= src2 + '?'+qsStr;
            line = line.replace(src,newSrc);
            console.log('替换 [ '.green+line.red+' ]'.green);
            thiz.count ++ ;
        }
    }
    strArr+=line+(compress ? '' : '\n');
});
inter.on('close',function(){
    //重新写入
    fs.writeFileSync(filePath,strArr);
    callback(null,null);
})
 };
     //根据文件路径获得FILEMD5
     AddMd5.prototype.getMd5 = function(filePath){
var buffer = fs.readFileSync(filePath);
var md5 = crypto.createHash('md5');
md5.update(buffer);
return md5.digest('hex').toLowerCase();
   };
     AddMd5.prototype.checkLine = function(str){
//检查字符串是否符合 link script 
var thiz = this,replace = thiz.replace,directory = thiz.directory;
str = str.toLowerCase().replace(/\s/g,'');
var rst = /\<script[\s\S]*src="([\$\{\}\w\.\/\<\%\=\>\?\&]*)"[\s\S]*\>[\s\S]*\<\/script\>/g.exec(str);
var src = '';
var type = '';
if(rst && rst.length > 0){
    src = rst[1];
    type = 'src';
}
rst = /^\<link[\s\S]*href="([\$\{\}\w\.\/\<\%\=\>\?\&]*)"[\s\S]*[\>|\/\>|\<\/link\>]$/g.exec(str);
if(rst && rst.length > 0 && rst[1].indexOf('favicon') < 0){
    src = rst[1];
    type = 'href';
}
if(src){
    if(replace && replace.length > 0){
        for(var i=0,max=replace.length;i<max;i++){
            src = src.replace(replace[i],'');
        }
    }
    var srcObj = url.parse(src);
    var query = srcObj.query;
    var filePath = join(directory,srcObj.pathname);
    if(fs.existsSync(filePath)){
        var fileMd5 = thiz.getMd5(filePath);
        return {
            md5 : fileMd5,
            query : query,
            filePath : srcObj.pathname,
            type : type
        };
    }
}
return null;
 };

 module.exports = AddMd5;

封装了一个命令行工具,以后就可以随意对某个目录进行压缩啦,发布后自己安装下就可以啦。

   npm install addmd5 -g

具体可以查看 https://github.com/chrunlee/addmd5

目前是最初的版本,很多地方还不严谨..尤其是我的正则比较烂。

转载请注明出处: http://sdxlp.cn/article/tianjia.html


如果对你有用的话,请赏给作者一个馒头吧 ...或帮点下页面底部的广告,感谢!!

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
日常生活中很多的小伙伴们可能会有的烦恼,咱们习惯了win7中的照片查看器,当咱们的电脑升级到win10之后,还想用win7的照片查看器该如何调出使用呢?
当小伙伴给电脑设置了密码,因为各种原因小伙伴们可能会忘记自己的电脑开机密码,在最新的windows10系统中忘记密码怎么办呢?这里为各位小伙伴带来分享,看一下开机密码忘记之后的解决办法,如何强制重置。
当我们换了新电脑后,怎样可以把微信的聊天记录迁到新电脑上哪?伙伴来这里我教你,简单实用。
在大时代的影响下,微信与支付宝的商战中,微信支付在日常生活工作中比支付宝略胜一筹,不过还是有很多的小伙伴喜欢使用支付宝,支付宝转账记录删除后,在手机端不能查看和恢复,只能通过电脑端登录支付宝,在 回收 站里查看和还原已经删除的交易记录。
近期很多当红app被央视点名,主要原因是我们个人的信息被过度的无情泄露了,微信聊天中我们可能用到很多私密的东西,比如身份证,银行卡等。即使我们有防范意识,在我们的聊天中删除了从我们手机的图库中删除啦。我们感觉可以放心啦.真的是这样吗?真的可以放心了吗?看一下下面的文章,你会有自己的选择。
现在小伙伴们都离开不了手机,它逐渐成为我们生活中必不可少的一样生活用品。很多小伙伴在用了 iPhone6 以后,遇到系统提示内存不足的问题。对于智能手机,相信小伙伴们都知道,同款机型不同内存大小,价格会相差很多,特别是对应iPhone这样的土豪手机,不同的内存版本更是相差多则上千。而很多当初选择了小内存的手机用户,发现在使用过程中彻底不够用。
日常生活中,我们经常使用到手机热点,它相当于一个移动路由器,可以开启WiFi在其他设备上直接连接使用,而且打开手机热点操作非常简单,那小伙伴们开启手机热点之后为什么连接不上呢,下面就和小编一起来看看吧!
我们很多小伙伴们经常使用的手机微信,对手机微信里面的内容和功能了解的都是非常到位的。比如我们想要在手机里查看微信里面的聊天记录,分分钟就可以将其翻出来,但是电脑版微信的操作步骤和手机微信就不相同了,如果我们想在电脑微信上查看聊天记录应该怎么操作呢?