'use strict'; /** * * * @author Mai * @date * @version */ 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); 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 }; cacheInfo.push(cache); } if (!cache.new_md5) { cache.text = fs.readFileSync(__dirname + '/app' + file, 'utf8'); cache.new_md5 = getMd5(cache.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}`); } } } 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();