build_min.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. const crypto = require('crypto');
  10. const Uglyfy = require('uglify-es');
  11. const fs = require('fs');
  12. const JsFiles = require('./config/web');
  13. const version = require('./config/config.default')({ baseDir: __dirname + '/app', root: __dirname, name: 'calc' }).version;
  14. console.log(version);
  15. const savePath = __dirname + '/app' + JsFiles.webPath;
  16. const cachePath = __dirname + '/app' + JsFiles.cachePath;
  17. const cacheInfoFile = cachePath + 'cache.json';
  18. let cacheInfo = [];
  19. const newCacheInfo = [];
  20. if (!fs.existsSync(savePath)) fs.mkdirSync(savePath);
  21. if (!fs.existsSync(cachePath)) fs.mkdirSync(cachePath);
  22. const loadCache = function () {
  23. if (fs.existsSync(cacheInfoFile)) {
  24. cacheInfo = require(cacheInfoFile);
  25. }
  26. };
  27. const getMd5 = function (text) {
  28. const hash = crypto.createHash('md5');
  29. hash.update(text);
  30. return hash.digest('hex');
  31. };
  32. const findCache = function (file) {
  33. let cache = cacheInfo.find(x => { return x.file === file; });
  34. if (!cache) {
  35. cache = { file: file };
  36. cacheInfo.push(cache);
  37. }
  38. if (!cache.new_md5) {
  39. cache.text = fs.readFileSync(__dirname + '/app' + file, 'utf8');
  40. cache.new_md5 = getMd5(cache.text);
  41. }
  42. return cache;
  43. };
  44. const checkUseCache = function(files) {
  45. for (const f of files) {
  46. const cache = findCache(f);
  47. if (cache.md5 !== cache.new_md5) return false;
  48. }
  49. return true;
  50. };
  51. const mergeAndMin = function () {
  52. console.time('min');
  53. loadCache();
  54. for (const c in JsFiles.controller) {
  55. const controller = JsFiles.controller[c];
  56. for (const a in controller) {
  57. const action = controller[a];
  58. if (action.mergeFiles && action.mergeFile.length > 0) {
  59. const minFileName = savePath + action.mergeFile + '.' + version + '.min.js';
  60. const cacheFileName = cachePath + action.mergeFile + '.cache.js';
  61. const useCache = checkUseCache(action.mergeFiles);
  62. if (useCache && fs.existsSync(cacheFileName)) {
  63. fs.copyFileSync(cacheFileName, minFileName);
  64. } else {
  65. let code = '';
  66. for (const f of action.mergeFiles) {
  67. const cache = findCache(f);
  68. code = code + cache.text;
  69. }
  70. fs.writeFileSync(minFileName, Uglyfy.minify(code, { mangle: true }).code);
  71. fs.copyFileSync(minFileName, cacheFileName);
  72. }
  73. console.log(minFileName, `cache: ${useCache}`);
  74. }
  75. }
  76. }
  77. let needMinCode = '';
  78. for (const nm of JsFiles.needMin) {
  79. needMinCode = needMinCode + fs.readFileSync(__dirname + '/app' + nm, 'utf8');
  80. }
  81. const needMinFileName = __dirname + '/app/public/js/web/global.' + version + '.min.js';
  82. fs.writeFileSync(needMinFileName, Uglyfy.minify(needMinCode, { mangle: true }).code);
  83. const needVersionCss = ['/public/css/main'];
  84. for (const nvc of needVersionCss) {
  85. fs.copyFileSync(__dirname + '/app' + nvc + '.css', __dirname + '/app' + nvc + '.' + version + '.css');
  86. }
  87. fs.writeFileSync(cacheInfoFile, JSON.stringify(cacheInfo.map(x => { return { file: x.file, md5: x.new_md5 || x.md5 }; })));
  88. console.timeEnd('min');
  89. };
  90. mergeAndMin();