Use @ndcode/disk_build to reduce startup time by caching minified stuff on disk
authorNick Downing <nick@ndcode.org>
Sat, 17 Nov 2018 23:44:24 +0000 (10:44 +1100)
committerNick Downing <nick@ndcode.org>
Sat, 17 Nov 2018 23:44:24 +0000 (10:44 +1100)
Server.js
package.json

index 588e9d1..086d726 100644 (file)
--- a/Server.js
+++ b/Server.js
@@ -3,6 +3,7 @@ let CleanCSS = require('@ndcode/clean-css')
 let JSONCache = require('@ndcode/json_cache')
 let Site = require('./Site')
 let assert = require('assert')
+let disk_build = require('@ndcode/disk_build')
 let emailjs = require('emailjs')
 let fs = require('fs')
 let jst = require('@ndcode/jst')
@@ -17,6 +18,7 @@ let zetjs = require('zetjs')
 
 let fs_mkdir = util.promisify(fs.mkdir)
 let fs_readFile = util.promisify(fs.readFile)
+let fs_writeFile = util.promisify(fs.writeFile)
 let yauzl_open = util.promisify(yauzl.open)
 let clean_css = new CleanCSS({returnPromise: true})
 
@@ -112,12 +114,24 @@ Server.prototype.get_css_min = function(pathname) {
   return /*await*/ this.build_cache_css_min.get(
     pathname,
     async result => {
-      let text = await fs_readFile(pathname, {encoding: 'utf-8'})
-      console.log('getting', pathname, 'as css_min')
-      let render = await clean_css.minify(text)
-      for (let i = 0; i < render.warnings.length; ++i)
-        console.log(`clean-css warning: ${render.warnings[i]}`)
-      result.value = Buffer.from(render.styles)
+      result.value = fs_readFile(
+        await disk_build(
+          pathname,
+          async built_pathname => {
+            console.log('getting', pathname, 'as css_min')
+            let text = await fs_readFile(pathname, {encoding: 'utf-8'})
+            console.log('building', built_pathname)
+            let render = await clean_css.minify(text)
+            for (let i = 0; i < render.warnings.length; ++i)
+              console.log(`clean-css warning: ${render.warnings[i]}`)
+            return /*await*/ fs_writeFile(
+              built_pathname,
+              render.styles,
+              {encoding: 'utf-8'}
+            )
+          }
+        )
+      )
     }
   )
 }
@@ -126,116 +140,128 @@ Server.prototype.get_js_min = function(pathname) {
   return /*await*/ this.build_cache_js_min.get(
     pathname,
     async result => {
-      let files = {}
-      files[pathname] = await fs_readFile(pathname, {encoding: 'utf-8'})
-      console.log('getting', pathname, 'as js_min')
-      let render = uglify_es.minify(
-        files,
-        {
-          //compress: {
-            //arrows        : true,
-            //booleans      : true,
-            //collapse_vars : true,
-            //comparisons   : true,
-            //computed_props: true,
-            //conditionals  : true,
-            //dead_code     : true,
-            //drop_console  : false,
-            //drop_debugger : true,
-            //ecma          : 5,
-            //evaluate      : true,
-            //expression    : false,
-            //global_defs   : {},
-            //hoist_funs    : false,
-            //hoist_props   : true,
-            //hoist_vars    : false,
-            //ie8           : false,
-            //if_return     : true,
-            //inline        : true,
-            //join_vars     : true,
-            //keep_classnames: false,
-            //keep_fargs    : true,
-            //keep_fnames   : false,
-            //keep_infinity : false,
-            //loops         : true,
-            //negate_iife   : true,
-            //passes        : 1,
-            //properties    : true,
-            //pure_getters  : true && "strict",
-            //pure_funcs    : null,
-            //reduce_funcs  : true,
-            //reduce_vars   : true,
-            //sequences     : true,
-            //side_effects  : true,
-            //switches      : true,
-            //top_retain    : null,
-            //toplevel      : !!(options && options["top_retain"]),
-            //typeofs       : true,
-            //unsafe        : false,
-            //unsafe_arrows : false,
-            //unsafe_comps  : false,
-            //unsafe_Function: false,
-            //unsafe_math   : false,
-            //unsafe_methods: false,
-            //unsafe_proto  : false,
-            //unsafe_regexp : false,
-            //unsafe_undefined: false,
-            //unused        : true,
-            //warnings      : false,
-          //},
-          //ecma: undefined,
-          //ie8: false,
-          //keep_classnames: undefined,
-          //keep_fnames: false,
-          //mangle: {},
-          //nameCache: null,
-          //output: {
-            //ascii_only       : false,
-            //beautify         : false,
-            //bracketize       : false,
-            //comments         : false,
-            //ecma             : 5,
-            //ie8              : false,
-            //indent_level     : 4,
-            //indent_start     : 0,
-            //inline_script    : true,
-            //keep_quoted_props: false,
-            //max_line_len     : false,
-            //preamble         : null,
-            //preserve_line    : false,
-            //quote_keys       : false,
-            //quote_style      : 0,
-            //safari10         : false,
-            //semicolons       : true,
-            //shebang          : true,
-            //shorthand        : undefined,
-            //source_map       : null,
-            //webkit           : false,
-            //width            : 80,
-            //wrap_iife        : false
-          //},
-          //parse: {
-            //bare_returns   : false,
-            //ecma           : 8,
-            //expression     : false,
-            //filename       : null,
-            //html5_comments : true,
-            //shebang        : true,
-            //strict         : false,
-            //toplevel       : null
-          //},
-          //rename: undefined,
-          //safari10: false,
-          //sourceMap: false,
-          //timings: false,
-          toplevel: true //false,
-          //warnings: false,
-          //wrap: false
-        }
+      result.value = fs_readFile(
+        await disk_build(
+          pathname,
+          async built_pathname => {
+            console.log('getting', pathname, 'as js_min')
+            let files = {}
+            files[pathname] = await fs_readFile(pathname, {encoding: 'utf-8'})
+            console.log('building', built_pathname)
+            let render = uglify_es.minify(
+              files,
+              {
+                //compress: {
+                  //arrows        : true,
+                  //booleans      : true,
+                  //collapse_vars : true,
+                  //comparisons   : true,
+                  //computed_props: true,
+                  //conditionals  : true,
+                  //dead_code     : true,
+                  //drop_console  : false,
+                  //drop_debugger : true,
+                  //ecma          : 5,
+                  //evaluate      : true,
+                  //expression    : false,
+                  //global_defs   : {},
+                  //hoist_funs    : false,
+                  //hoist_props   : true,
+                  //hoist_vars    : false,
+                  //ie8           : false,
+                  //if_return     : true,
+                  //inline        : true,
+                  //join_vars     : true,
+                  //keep_classnames: false,
+                  //keep_fargs    : true,
+                  //keep_fnames   : false,
+                  //keep_infinity : false,
+                  //loops         : true,
+                  //negate_iife   : true,
+                  //passes        : 1,
+                  //properties    : true,
+                  //pure_getters  : true && "strict",
+                  //pure_funcs    : null,
+                  //reduce_funcs  : true,
+                  //reduce_vars   : true,
+                  //sequences     : true,
+                  //side_effects  : true,
+                  //switches      : true,
+                  //top_retain    : null,
+                  //toplevel      : !!(options && options["top_retain"]),
+                  //typeofs       : true,
+                  //unsafe        : false,
+                  //unsafe_arrows : false,
+                  //unsafe_comps  : false,
+                  //unsafe_Function: false,
+                  //unsafe_math   : false,
+                  //unsafe_methods: false,
+                  //unsafe_proto  : false,
+                  //unsafe_regexp : false,
+                  //unsafe_undefined: false,
+                  //unused        : true,
+                  //warnings      : false,
+                //},
+                //ecma: undefined,
+                //ie8: false,
+                //keep_classnames: undefined,
+                //keep_fnames: false,
+                //mangle: {},
+                //nameCache: null,
+                //output: {
+                  //ascii_only       : false,
+                  //beautify         : false,
+                  //bracketize       : false,
+                  //comments         : false,
+                  //ecma             : 5,
+                  //ie8              : false,
+                  //indent_level     : 4,
+                  //indent_start     : 0,
+                  //inline_script    : true,
+                  //keep_quoted_props: false,
+                  //max_line_len     : false,
+                  //preamble         : null,
+                  //preserve_line    : false,
+                  //quote_keys       : false,
+                  //quote_style      : 0,
+                  //safari10         : false,
+                  //semicolons       : true,
+                  //shebang          : true,
+                  //shorthand        : undefined,
+                  //source_map       : null,
+                  //webkit           : false,
+                  //width            : 80,
+                  //wrap_iife        : false
+                //},
+                //parse: {
+                  //bare_returns   : false,
+                  //ecma           : 8,
+                  //expression     : false,
+                  //filename       : null,
+                  //html5_comments : true,
+                  //shebang        : true,
+                  //strict         : false,
+                  //toplevel       : null
+                //},
+                //rename: undefined,
+                //safari10: false,
+                //sourceMap: false,
+                //timings: false,
+                toplevel: true //false,
+                //warnings: false,
+                //wrap: false
+              }
+            )
+            if (render.error !== undefined)
+              throw render.error
+            return /*await*/ fs_writeFile(
+              built_pathname,
+              render.code,
+              {encoding: 'utf-8'}
+            )
+          }
+        )
       )
-      if (render.error !== undefined)
-        throw render.error
-      result.value = Buffer.from(render.code)
     }
   )
 }
index 7a5c62c..5ca92fa 100644 (file)
@@ -6,9 +6,10 @@
   "directories": {},
   "dependencies": {
     "@ndcode/build_cache": "^0.1.0",
+    "@ndcode/clean-css": "^0.1.0",
+    "@ndcode/disk_build": "^0.1.0",
     "@ndcode/json_cache": "^0.1.0",
     "@ndcode/jst": "^0.1.2",
-    "@ndcode/clean-css": "^0.1.0",
     "babel-cli": "^6.26.0",
     "commander": "^2.18.0",
     "cookie": "^0.3.1",