Przeglądaj źródła

build_min,使用缓存

MaiXinRong 6 miesięcy temu
rodzic
commit
31b74b30e7
2 zmienionych plików z 87 dodań i 24 usunięć
  1. 86 24
      build_min.js
  2. 1 0
      config/web.js

+ 86 - 24
build_min.js

@@ -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();
+
+
+
 
 

+ 1 - 0
config/web.js

@@ -33,6 +33,7 @@
  */
 const JsFiles = {
     webPath: '/public/js/web/',
+    cachePath: '/public/js/webCache/',
     commonFiles: [
         '/public/js/jquery/jquery-3.2.1.min.js',
         '/public/js/jquery/jquery-ui.js',