模块合并小工具

这两天对seajs模块进行打包合并时,推荐的concat工具不是很好用,不知道是不是我们的使用姿势有问题,无法合并更深层级依赖的模块,所以只能自己写个合并工具来进行transport后的合并:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/**
 * @fileoverview
 * @author Random | http://weibo.com/random
 * @date 2013-11-27
 */
 
var fs=require("fs");
var fileList=[];
var readed={};
var conf = {
    path : "../build/transport/", //基础目录,模块文件地址依赖于该目录
    src : "_html/demo/index.js", //入口文件地址
    dist : "../build/" //合并生成后的文件存放目录
};
var re=new RegExp("(\\.[a-z]+)$","i");
 
function getModuleList(fileStream){
    var modules = [];
    var p = new RegExp("require\\([\"']([^\\)]+)[\"']\\)","img");
    var r = fileStream.match(p);
    var i;
     
    if(r){
        i=r.length;
        while(i--){
            r[i].match(p) && modules.push(RegExp.$1);
        }
    }
     
    return modules;
}
 
function getFile(moduleName){
    var stream="";
    var file;
     
    !(/\.js$/.test(moduleName)) && (moduleName+=".js");
    file= conf.path + moduleName;
     
    if(fs.existsSync(file)){
        stream = fs.readFileSync(file, "utf-8");
    }else{
        console.log("file not found:" + file);
    }
     
    return stream;
}
 
function find(file){
    var fstr;
    var mds;
    var i;
    var realFile;
     
    fstr = getFile(file);
 
    if(fstr && !readed[file]){
        fileList.push(fstr);
        readed[file] = 1;
        console.log(file);
         
        mds = getModuleList(fstr);
        if(mds.length){
            i = mds.length;
            while(i--){
                find(mds[i]);
            }
        }
    }
}
 
function getFileName(){
    var name;
    var arr = conf.src.split("/");
    var src = arr.pop();
     
    if(src.match(re)){
        name = conf.dist + src.replace(re, "-all"+RegExp.$1);
    }else{
        name = conf.dist + src + "-all";
    }
     
    return name;
}
 
 
find(conf.src);
if(fileList.length){
    if(!fs.writeFileSync(getFileName(), fileList.join("\n") ,"utf-8")){
        console.log("\nsuccessful");
    }
}

 

大家可以从 npm 直接安装:

  npm install grunt-cmd-combi

 

该工具可以从入口文件中开始查询所有层级的模块依赖,并最后合并这些文件到最终的大文件中。目前只支持js,而且用正则匹配的模块地址,后续有空再完善吧……

posted @   随机  阅读(406)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
历史上的今天:
2012-11-27 碎片6
点击右上角即可分享
微信分享提示