Abandon Closure Compiler in favor of UglifyES (#2285)

Moved to UglifyES, ditched async cruft, clarified responsibilities between cli & minify.

Makes for faster, more reliable, synchronous, non-Google-reliant minification.
This commit is contained in:
Scotty Simpson 2018-11-06 12:48:48 -08:00 committed by Isiah Meadows
parent 9d2586df9c
commit 843d7ad454
5 changed files with 67 additions and 126 deletions

View file

@ -1,11 +1,12 @@
"use strict"
var fs = require("fs");
var zlib = require("zlib")
var bundle = require("./bundle")
var minify = require("./minify")
var aliases = {o: "output", m: "minify", w: "watch", a: "aggressive", s: "save"}
var aliases = {o: "output", m: "minify", w: "watch", s: "save"}
var params = {}
var args = process.argv.slice(2), command = null
for (var i = 0; i < args.length; i++) {
@ -24,26 +25,31 @@ function add(value) {
command = null
}
function format(n) {
return n.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,")
}
bundle(params.input, params.output, {watch: params.watch})
if (params.minify) {
minify(params.output, params.output, {watch: params.watch, advanced: params.aggressive}, function(stats) {
function format(n) {
return n.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,")
}
// mFiles = { original: String(mithril.js), compressed: String(mithril.min.js) }
var mFiles = minify(params.output, {watch: params.watch})
var originalSize = mFiles.original.length
var compressedSize = mFiles.compressed.length
var originalGzipSize = zlib.gzipSync(mFiles.original).byteLength
var compressedGzipSize = zlib.gzipSync(mFiles.compressed).byteLength
console.log("Original size: " + format(stats.originalGzipSize) + " bytes gzipped (" + format(stats.originalSize) + " bytes uncompressed)")
console.log("Compiled size: " + format(stats.compressedGzipSize) + " bytes gzipped (" + format(stats.compressedSize) + " bytes uncompressed)")
console.log("Original size: " + format(originalGzipSize) + " bytes gzipped (" + format(originalSize) + " bytes uncompressed)")
console.log("Compiled size: " + format(compressedGzipSize) + " bytes gzipped (" + format(compressedSize) + " bytes uncompressed)")
if (params.save) {
var readme = fs.readFileSync("./README.md", "utf8")
var kb = stats.compressedGzipSize / 1000
if (params.save) {
var readme = fs.readFileSync("./README.md", "utf8")
var kb = compressedGzipSize / 1000
fs.writeFileSync("./README.md",
readme.replace(
/(<!-- size -->)(.+?)(<!-- \/size -->)/,
"$1" + (kb % 1 ? kb.toFixed(2) : kb) + " KB$3"
)
fs.writeFileSync("./README.md",
readme.replace(
/(<!-- size -->)(.+?)(<!-- \/size -->)/,
"$1" + (kb % 1 ? kb.toFixed(2) : kb) + " KB$3"
)
}
})
}
)
}
}

View file

@ -1,69 +1,26 @@
"use strict"
var http = require("https")
var querystring = require("querystring")
var fs = require("fs")
var UglifyES = require("uglify-es")
module.exports = function(input, output, options, done) {
function minify(input, output) {
var code = fs.readFileSync(input, "utf8")
module.exports = function(filePath, options) {
function minify(filePath) {
var original = fs.readFileSync(filePath, "utf8"),
uglified = UglifyES.minify(original),
compressed = uglified.code
if (uglified.error) throw new Error(uglified.error)
var data = {
output_format: "json",
output_info: ["compiled_code", "warnings", "errors", "statistics"],
compilation_level: options.advanced ? "ADVANCED_OPTIMIZATIONS" : "SIMPLE_OPTIMIZATIONS",
warning_level: "default",
output_file_name: "default.js",
js_code: code,
}
var body = querystring.stringify(data)
var response = ""
var req = http.request({
method: "POST",
hostname: "closure-compiler.appspot.com",
path: "/compile",
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
"Content-Length": body.length
}
}, function(res) {
res.on("data", function(chunk) {
response += chunk.toString()
})
res.on("end", function() {
try {
var results = JSON.parse(response)
} catch(e) {
console.error(response);
throw e;
}
if (results.errors) {
for (var i = 0; i < results.errors.length; i++) console.log(results.errors[i])
}
else {
fs.writeFileSync(output, results.compiledCode, "utf8")
console.log("done")
if(typeof done === "function") done(results.statistics)
}
})
})
req.write(body)
req.end()
console.log("minifying...")
fs.writeFileSync(filePath, compressed, "utf8")
return {original: original, compressed: compressed}
}
function run() {
minify(input, output)
console.log("minifying...")
return minify(filePath)
}
run()
if (options && options.watch) fs.watchFile(input, run)
if (options && options.watch) fs.watchFile(filePath, run)
return run()
}