惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
博客园_首页
C
Check Point Blog
小众软件
小众软件
博客园 - 叶小钗
Blog — PlanetScale
Blog — PlanetScale
Engineering at Meta
Engineering at Meta
美团技术团队
Martin Fowler
Martin Fowler
Vercel News
Vercel News
D
Docker
罗磊的独立博客
B
Blog RSS Feed
The Cloudflare Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
Last Week in AI
Last Week in AI
T
Tailwind CSS Blog
雷峰网
雷峰网
博客园 - Franky

博客园 - 随机

10周年整 年中review Javascript 模块化开发上线解决方案 AMDJS编译工具 第三方组件接入方案(演示文稿图片) 代码打包预处理工具 manifest资源提取工具 也来山寨一版Flappy Bird (js版) 2014 todo list 2013年终总结 #1分钟删# 移动端页面前端提速的技术梳理 状态机——Javascript词法扫描示例 [整理] ES5 词法约定文档树状图 php并发请求 [转]给明年依然年轻的我们:欲望、外界、标签、天才、时间、人生目标、现实、后悔、和经历 javascript基础组件设计资料 2013 草莓音乐节妹子抓拍 [组图] 键盘按键事件的fireEvent 错觉
模块合并小工具
随机 · 2013-11-27 · via 博客园 - 随机

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

/** 
 * @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,而且用正则匹配的模块地址,后续有空再完善吧……