codekart
Version:
Web application framework for Node.js
128 lines (102 loc) • 3.62 kB
JavaScript
var fs = require('fs');
var UglifyJS = load.lib("!uglify-js");
var file = load.tool('!file');
var json = load.tool('!json');
var util = load.tool('!util');
var config = load.config();
var define = load.config('define');
var cpath = load.config('!path');
//js库依赖关系
var cjd = define.client_js_depend;
/*js缓存文件是否存在的缓存*/
var jsFileNameCache = {};
/**
* 合并js模块,生成js缓存文件
* @param stuff
* @param callback
*/
exports.ready = function(stuff,callback){
var jsFileName = cpath.static+stuff.client_name_js;
//log(jsFileName);
if(jsFileNameCache[jsFileName] && !config.compiled){
//log('js文件缓存');
return callback(null, true); /*检查读取缓存*/
}
fs.exists(jsFileName,function(have){
if(config.compiled || !have){ //总是编译文件
merger(stuff.js,function(err,js){
if(err){
if(config.debug) log(err);
return callback(err);
}
mergerTpl(stuff,function(err,pretpl){
//log('js文件缓存'+pretpl);
if(err){
if(config.debug) log(err);
return callback(err);
}
fs.writeFile(jsFileName,pretpl+js, function (err) { //创建缓存文件
if(err){ //文件写入错误
if(config.debug) log(err);
return callback(err);
}
jsFileNameCache[jsFileName] = true; //缓存
callback(null,js+'');//处理完毕
});
});
});
}else{
jsFileNameCache[jsFileName] = true; //缓存
return callback(null, true);//处理完毕
}
});
};
/**
* 读取tpl备用文件并合并
*/
function mergerTpl(stuff,callback){
var pre_tpl = {};
for(var k in stuff.tplpre){ //文件名数组
var one = stuff.tplpre[k];
for(var x in one){
var path = 'tpl/'+one[x]+'.tpl'
, tpl = read.resource(path);
if(tpl===null){
return callback("can't read resource : "+path)
}
pre_tpl[x] = compress(''+tpl);
}
}
var tplname = define.client_tpl_var || 'Tpls'
, tplstr = 'window.'+tplname+'='+json.stringify(pre_tpl)+';'; //前端js全局变量tpls
callback(null,tplstr);
}
//压缩tpl
function compress(tpl){
return tpl.replace(/\s+|\n/g, " ") //压缩空格和换行
.replace(/\s*<\s*/g, "<") //去掉< >// 括号两旁的空格
.replace(/\s*>\s*/g, ">") //去掉< >// 括号两旁的空格
.replace(/<\!--(\n|.)*?-->/g, ""); //去掉<!--- --->注释;
}
/**
* 读取js文件并合并
*/
function merger(jsary,callback){
//获取 ck 库文件依赖关系
var deps = define.client_js_depend || {}
, jslist = util.sortDependence(deps,jsary)
, leg = jslist.length
, filecontent = '';
for(var i=0;i<leg;i++){ //文件名数组
filecontent += read.resource('js/'+jslist[i]+'.js');
}
if(config.compress.js){
try{
filecontent = UglifyJS(filecontent); //压缩js
}catch(e){
if(config.debug) log(e);
return callback(e); //压缩错误
}
}
callback(null,filecontent);
}