UglifyJS 3 Released
github.com
github.com
The new primary committer, alexlamsl, is good about responding to bugs & pushing out new versions fast: https://github.com/mishoo/UglifyJS2/issues?q=is%3Aissue+is%3...
But there is still no CHANGELOG. He is aggressive at updating the docs, so you'll have to look at diffs yourself.
I believe Babili generates minified/mangled output directly from the Babel AST which would be way more performant during the dev cycle.
So yes, there is clearly still plenty of reasons to use boring old Uglify.
I'm sure some people can get it to work but on anything vaguely complex it always errors out for me.
It's alpha software for a reason.
https://github.com/mishoo/UglifyJS2/compare/v2.8.23...v3.0.0
That's a shame, I always enjoy that silly bit of humour every time I scan my uglify configs!
I totally get why it's safer to not do that sort of thing, nonetheless it does have a certain charm when done sparingly. I wonder if the change was in response to some specific feedback / complaints?
But... it appears that there are no release notes for version 3, apart from the three negative points at the top of the README: backwards incompatible, twice as slow on the latest Node, and still no ES6 (edit out of the box). No rationale for (or detail of) the breaking change is given. Really bizzare.
Unceremoniously closing the ticket on the other hand seems to me to indicate the maintainer really doesn't care.
but still to see if as good as the custom solution we have. it's something we did since early 2000 and save us a good 30% of size. but dangerous as hell.
[1] https://github.com/mishoo/UglifyJS2/blob/master/README.md#us...
edit:
What you meant with "it barely understands your code" is probably: if you compress just one JS and they access third party libraries, you have to write some annotation OR import their object namespaces (the annotation style is a bit weird in JS world and looks like Java Doc comments, but you can completely avoid it as I mentioned; read the documentation)
Closure Compiler compiles from JavaScript to better JavaScript. It parses your JavaScript, analyzes it, removes dead code and rewrites and minimizes what's left. It also checks syntax, variable references, and types, and warns about common JavaScript pitfalls. UglifyJS and co don't understand Javascript, they do regex/string replace operations which is faster, but you get bigger code output and less warranty as they don't understand JS.
Then you'll get a lot of use out of it.
Nothing wrong with that as such but it's a completely different thing.
We used it for a while but we've now completely abandoned it. The overheads of complying with its rules were significant, but worse, it sometimes produced output that didn't run in some older browsers where the original code did. Now, that might really not be Closure Compiler's fault, if the output it produced was technically equivalent to the input according to the JS standards. However, the fact is that we can't ship code that runs into bugs in production and whether those bugs come from the tools or the browsers does not change this.
We fixed that problem by removing the Closure Compiler step from our build process and switching to Uglify. It took a little time, but not much. It gave a handy speed-up in the development process, since CC is relatively slow. But most important of all, it has reliably produced working code from working code.
Here's Closure vs. Uglify on one of our apps:
$ wc -c index.js | grep -v total
9320511 index.js
$ cat index.js | time closure-compiler \
--warning_level quiet \
--third_party \
--jscomp_off es3 \
--compilation_level SIMPLE_OPTIMIZATIONS \
--language_in ECMASCRIPT5 > index.js.closure 2>/dev/null
33.54s user 0.93s system 369% cpu 9.336 total
$ cat index.js | time closure-compiler \
--warning_level quiet \
--third_party \
--jscomp_off es3 \
--compilation_level ADVANCED_OPTIMIZATIONS \
--language_in ECMASCRIPT5 > index.js.closure-advanced 2>/dev/null
33.54s user 0.93s system 369% cpu 9.336 total
$ cat index.js | time node_modules/.bin/uglifyjs \
--screw-ie8 --mangle --compress - > index.js.uglify 2>/dev/null
18.88s user 0.24s system 103% cpu 18.475 total
$ wc -c index.js.*. | grep -v total
1750478 index.js.closure
1515331 index.js.closure-advanced
1763350 index.js.uglify
$ gzip -9 index.js.*
$ wc -c index.js*.gz | grep -v total
369749 index.js.closure-advanced.gz
397468 index.js.closure.gz
387896 index.js.uglify.gz
This is Closure 20170218 (Oracle Java 8), uglify-js 2.4.19 (Node 6.8.1) on a quad-core MBP Pro 2015.Note the total times. Closure is heavily parallelized, and is twice as fast as uglify by using all 4 cores at almost 100% utilization. If you only have one core, though, Closure will be much slower.
Of course, YMMV.
It's true that Closure does a lot better if you use Google's Closure style, but it's not true that you have to. Without those tricks, Closure still produces code that's as compact as Uglify.
https://gist.github.com/atombender/a10c8ad409abb6c4995a60374...
https://groups.google.com/d/msg/closure-compiler-discuss/9WM...
Yep. This is what CC was really made for. Most people don't want to write adv mode compatible JS, but it can pay off big.
ScalaJS produces adv mode compatible JS, and uses Closure Compiler on it.
https://github.com/mishoo/UglifyJS2/commit/1e51586996ae4fdac...
This will enable removing unused transpiled classes from e.g. Babel.
I thought minification is good for the client. Smaller payload, easier for browser to parse the code because it doesn't have any unnecessary white space, comments and characters. Also not the best solution to security, but does obscure the code to make it harder for malicious client to read through the code.
Some do very much trade speed for size, but in my experience the opposite is overwhelmingly true.
So.. there are options :D