|  | @@ -9,41 +9,103 @@
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +const crypto = require('crypto');
 | 
	
		
			
				|  |  |  const Uglyfy = require('uglify-es');
 | 
	
		
			
				|  |  |  const fs = require('fs');
 | 
	
		
			
				|  |  |  const JsFiles = require('./config/web');
 | 
	
		
			
				|  |  |  const version = require('./config/config.default')({ baseDir: __dirname + '/app', root: __dirname, name: 'calc' }).version;
 | 
	
		
			
				|  |  |  console.log(version);
 | 
	
		
			
				|  |  |  const savePath = __dirname + '/app' + JsFiles.webPath;
 | 
	
		
			
				|  |  | +const cachePath = __dirname + '/app' + JsFiles.cachePath;
 | 
	
		
			
				|  |  | +const cacheInfoFile = cachePath + 'cache.json';
 | 
	
		
			
				|  |  | +let cacheInfo = [];
 | 
	
		
			
				|  |  | +const newCacheInfo = [];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  if (!fs.existsSync(savePath)) fs.mkdirSync(savePath);
 | 
	
		
			
				|  |  | +if (!fs.existsSync(cachePath)) fs.mkdirSync(cachePath);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -for (const c in JsFiles.controller) {
 | 
	
		
			
				|  |  | -    const controller = JsFiles.controller[c];
 | 
	
		
			
				|  |  | -    for (const a in controller) {
 | 
	
		
			
				|  |  | -        const action = controller[a];
 | 
	
		
			
				|  |  | -        if (action.mergeFiles && action.mergeFile.length > 0) {
 | 
	
		
			
				|  |  | -            const minFileName = savePath + action.mergeFile + '.' + version + '.min.js';
 | 
	
		
			
				|  |  | -            console.log(minFileName);
 | 
	
		
			
				|  |  | -            let code = '';
 | 
	
		
			
				|  |  | -            for (const f of action.mergeFiles) {
 | 
	
		
			
				|  |  | -                code = code + fs.readFileSync(__dirname + '/app' + f, 'utf8');
 | 
	
		
			
				|  |  | +const loadCache = function () {
 | 
	
		
			
				|  |  | +    if (fs.existsSync(cacheInfoFile)) {
 | 
	
		
			
				|  |  | +        cacheInfo = require(cacheInfoFile);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const getMd5 = function (text) {
 | 
	
		
			
				|  |  | +    const hash = crypto.createHash('md5');
 | 
	
		
			
				|  |  | +    hash.update(text);
 | 
	
		
			
				|  |  | +    return hash.digest('hex');
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const findCache = function (file) {
 | 
	
		
			
				|  |  | +    let cache = cacheInfo.find(x => { return x.file === file; });
 | 
	
		
			
				|  |  | +    if (!cache) {
 | 
	
		
			
				|  |  | +        cache = { file: file };
 | 
	
		
			
				|  |  | +        cache.text = fs.readFileSync(__dirname + '/app' + file, 'utf8');
 | 
	
		
			
				|  |  | +        cache.new_md5 = getMd5(cache.text);
 | 
	
		
			
				|  |  | +        cacheInfo.push(cache);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    if (!cache.new_md5) {
 | 
	
		
			
				|  |  | +        const text = fs.readFileSync(__dirname + '/app' + file, 'utf8');
 | 
	
		
			
				|  |  | +        cache.new_md5 = getMd5(text);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return cache;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const checkUseCache = function(files) {
 | 
	
		
			
				|  |  | +    for (const f of files) {
 | 
	
		
			
				|  |  | +        const cache = findCache(f);
 | 
	
		
			
				|  |  | +        if (cache.md5 !== cache.new_md5) return false;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return true;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const mergeAndMin = function () {
 | 
	
		
			
				|  |  | +    console.time('min');
 | 
	
		
			
				|  |  | +    loadCache();
 | 
	
		
			
				|  |  | +    for (const c in JsFiles.controller) {
 | 
	
		
			
				|  |  | +        const controller = JsFiles.controller[c];
 | 
	
		
			
				|  |  | +        for (const a in controller) {
 | 
	
		
			
				|  |  | +            const action = controller[a];
 | 
	
		
			
				|  |  | +            if (action.mergeFiles && action.mergeFile.length > 0) {
 | 
	
		
			
				|  |  | +                const minFileName = savePath + action.mergeFile + '.' + version + '.min.js';
 | 
	
		
			
				|  |  | +                const cacheFileName = cachePath + action.mergeFile + '.cache.js';
 | 
	
		
			
				|  |  | +                const useCache = checkUseCache(action.mergeFiles);
 | 
	
		
			
				|  |  | +                if (useCache && fs.existsSync(cacheFileName)) {
 | 
	
		
			
				|  |  | +                    fs.copyFileSync(cacheFileName, minFileName);
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    let code = '';
 | 
	
		
			
				|  |  | +                    for (const f of action.mergeFiles) {
 | 
	
		
			
				|  |  | +                        const cache = findCache(f);
 | 
	
		
			
				|  |  | +                        code = code + cache.text;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    fs.writeFileSync(minFileName, Uglyfy.minify(code, { mangle: true }).code);
 | 
	
		
			
				|  |  | +                    fs.copyFileSync(minFileName, cacheFileName);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                console.log(minFileName, `cache: ${useCache}`);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            fs.writeFileSync(minFileName, Uglyfy.minify(code, { mangle: true }).code);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -let needMinCode = '';
 | 
	
		
			
				|  |  | -for (const nm of JsFiles.needMin) {
 | 
	
		
			
				|  |  | -    needMinCode = needMinCode + fs.readFileSync(__dirname + '/app' + nm, 'utf8');
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -const needMinFileName = __dirname + '/app/public/js/web/global.' + version + '.min.js';
 | 
	
		
			
				|  |  | -fs.writeFileSync(needMinFileName, Uglyfy.minify(needMinCode, { mangle: true }).code);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -const needVersionCss = ['/public/css/main'];
 | 
	
		
			
				|  |  | -for (const nvc of needVersionCss) {
 | 
	
		
			
				|  |  | -    fs.copyFileSync(__dirname + '/app' + nvc + '.css', __dirname + '/app' + nvc + '.' + version + '.css');
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let needMinCode = '';
 | 
	
		
			
				|  |  | +    for (const nm of JsFiles.needMin) {
 | 
	
		
			
				|  |  | +        needMinCode = needMinCode + fs.readFileSync(__dirname + '/app' + nm, 'utf8');
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const needMinFileName = __dirname + '/app/public/js/web/global.' + version + '.min.js';
 | 
	
		
			
				|  |  | +    fs.writeFileSync(needMinFileName, Uglyfy.minify(needMinCode, { mangle: true }).code);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const needVersionCss = ['/public/css/main'];
 | 
	
		
			
				|  |  | +    for (const nvc of needVersionCss) {
 | 
	
		
			
				|  |  | +        fs.copyFileSync(__dirname + '/app' + nvc + '.css', __dirname + '/app' + nvc + '.' + version + '.css');
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    fs.writeFileSync(cacheInfoFile, JSON.stringify(cacheInfo.map(x => { return { file: x.file, md5: x.new_md5 || x.md5 }; })));
 | 
	
		
			
				|  |  | +    console.timeEnd('min');
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +mergeAndMin();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 |