UNPKG

v-kitty

Version:

hello kitty

196 lines (173 loc) 6.66 kB
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;