v-kitty
Version:
hello kitty
196 lines (173 loc) • 6.66 kB
JavaScript
var path = require('path');
var fs = require('fs');
var fse = require('fs-extra');
var crypto = require('crypto');
var spawn = require('child_process').spawn;
var moduleId = 0;
var Loader = {
minifyjs: function (content) {
var UglifyJS = require("uglify-js");
content = UglifyJS.minify(content, {fromString: true}).code;
return content;
},
minifycss: function (content) {
var less = require('less');
less.render(content, {compress: true}, function (err, output) {
if (err) {
console.error('Error: minifycss error ' + actionFile.file);
} else {
content = output.css;
}
});
return content;
},
minifyhtml: function (content) {
var minify = require('html-minifier').minify;
content = minify(content);
return content;
},
jstag: function (content) {
return '<script>' + content + '</script>';
},
csstag: function (content) {
return '<style type="text/css">' + content + '</style>';
},
less: function (content, actionFile) {
var less = require('less');
less.render(content, function (err, output) {
if (err) {
console.error('Error: less error ' + actionFile.file);
} else {
content = output.css;
}
});
return content;
},
babel: function (content, actionFile) {
if(!content){
return '';
}
var module = this._setModule(content,actionFile);
var modules = this._getModuleFuns(content,actionFile);
var strModules = [];
Object.keys(modules).forEach(function(key){
strModules.push('"'+modules[key].mid+'":'+modules[key].content);
});
var tpl = fs.readFileSync(path.resolve(__dirname, './tpl.js')).toString();
tpl = tpl.replace('{{key}}', module.mid);
tpl = tpl.replace('module_funs', strModules.join(','));
return tpl;
},
_getModuleFuns: function (content,actionFile) {
var self = this;
var result = {};
var getContent = function (content) {
var startStr = 'function(module,_kitty_require){';
var endStr = '}';
content = startStr + content + endStr;
return content;
};
result[actionFile.file] = Object.create(this.modules[actionFile.file]);
result[actionFile.file].content = getContent(result[actionFile.file].content);
var getModule = function(content){
var moduleFiles = content.match(/_kitty_require\([\'\"][^\'\"]+[\'\"]\)/g) || [];
moduleFiles.forEach(function(moduleFile){
var moduleId = moduleFile.replace(/_kitty_require\([\'\"]/,'').replace(/[\'\"]\)/,'');
Object.keys(self.modules).forEach(function(key){
var module = self.modules[key];
if(module.mid.toString()===moduleId){
result[module.file] = Object.create(module);
result[module.file].content = getContent(result[module.file].content);
getModule(result[module.file].content);
}
});
})
};
getModule(content);
return result;
},
_setModule:function(content, bufferFile){
this.modules = this.modules || {};
var mid;
if(this.modules[bufferFile.file]){
mid = this.modules[bufferFile.file].mid
}else{
mid = moduleId++;
}
this.modules[bufferFile.file] = {
file:bufferFile.file,
content:content,
mid:mid
};
return this.modules[bufferFile.file];
},
_require: function (content, bufferFile) {
if(!content){
return '';
}
var module = this._setModule(content,bufferFile);
return '_kitty_require("' + module.mid + '")';
},
encode: function (content, actionFile) {
return encodeURIComponent(content)
},
minify: function (content, actionFile) {
var file = actionFile.name;
if (/\.js/.test(file)) {
return Loader.minifyjs(content);
}
if (/\.css/.test(file) || /\.less/.test(file)) {
return Loader.minifycss(content);
}
if (/\.html/.test(file)) {
return Loader.minifyhtml(content);
}
},
cdn: function (content, actionFile,depend) {
depend.param = depend.param || '';
var options = depend.options || {};
options.cdn = options.cdn || '';
var openTag = config.varTag.open;
var closeTag = config.varTag.close;
var resourceDir = path.resolve(config.baseDir, config.resourceDir);
//获取生成的文件名称
var parse = path.parse(options.cdn);
var name = options.cdn.replace(openTag + 'cdn' + closeTag, '').replace(/\?.*$/, '');
if (!/^\//.test(name)) {
name = '/' + name;
}
//判断是否已经有后缀,如果有后缀,表明使用自定义的文件名称
if (parse.ext) {
var destfile = path.resolve(resourceDir + name);
} else {
var hash = crypto.createHash('md5').update(actionFile.compile).digest('hex');
parse = path.parse(actionFile.file);
destfile = path.resolve(resourceDir + name + '/' + hash + parse.base.replace('.less', '.css'));
}
var cdnUrl = destfile.replace(resourceDir, config.cdnUrl).replace();
if (actionFile.ext.indexOf('.less') > -1 || actionFile.ext.indexOf('.css') > -1) {
fse.ensureFileSync(destfile);
fs.writeFileSync(destfile, content);
content = '<link rel="stylesheet" href="' + cdnUrl + depend.param + '"/>';
} else if (/\.(jpeg|jpg|gif|png)/i.test(parse.ext)) {
content = cdnUrl + depend.param;
if (!fs.existsSync(destfile)) {
fse.ensureFileSync(destfile);
spawn('cp', ['-rf', actionFile.file, destfile]);
}
} else if (/\.js/i.test(parse.ext)) {
fse.ensureFileSync(destfile);
fs.writeFileSync(destfile, content);
content = '<script src="' + cdnUrl + depend.param + '"></script>';
}
actionFile.cdnUrl = cdnUrl;
return content;
},
afterCompile: function (content, actionFile) {
return content;
},
beforeCompile: function (content) {
return content;
}
};
module.exports = Loader;