Age | Commit message (Collapse) | Author |
|
|
|
This is useful while compressing generated code; for example compressing JS
compiled by CoffeeScript (assuming you got a source map):
uglifyjs2 --in-source-map generated.js.map \
--source-map uglified.js.map \
-o uglified.js
The above assumes you have a "generated.js.map" file which is the source
mapping between your CoffeeScript and the generated.js (compiled output from
CoffeeScript). The name of the input file is not present in this example;
it will be fetched from the source map (but it can be passed manually too).
The output will be in "uglified.js" and the output map "uglified.js.map"
will actually map to the original CoffeeScript code, rather than to
generated.js.
|
|
|
|
referenced and have no side effects
|
|
|
|
|
|
- use a single AST_Toplevel node for all files
- keep original source filename in the tokens
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
and it's declared in scope, or x is not a symbol reference.
|
|
because https://github.com/mishoo/UglifyJS2/commit/43fd45154bac89b89330e13bd1f167e2a927a23c#commitcomment-1864505
|
|
|
|
|
|
|
|
if undefined is defined, ;-), we replace AST_Undefined nodes to a reference
to the "undefined" variable; in turn the mangler will compress it to a
single letter; this helps at least on jQuery.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
optimizations of if/return/continue seem to be even better now
|
|
if (foo) continue;
...body...
==>
if (!foo) { ...body ... }
Only when the parent block is the target loop of the `continue` statement.
|
|
|
|
var XXX;
for (var YYY; ...)
==>
for (var XXX,YYY; ...)
|
|
shortened to x === void 0 (or x === [][0] in unsafe mode)
|
|
when unsafe, compress undefined as [][0]
|
|
function f() {
if (foo) return x();
if (!bar) return y();
}
==>
function f() {
return foo ? x() : bar ? void 0 : y();
}
|
|
- a = a + x ==> a+=x
- joining consecutive var statements (hoisting is not always desirable)
- x == false ==> x == 0, x != true ==> x != 1
- x, x ==> x; x = exp(), x ==> x = exp()
- discarding useless break-s
|
|
|
|
- do multiple passes in tighten_body if it was changed
- transform if (foo) return x; return y; ==> return foo?x:y
- don't optimize !0 as true (use best_of after evaluation of constant expr)
With hoist_vars off we now beat UglifyJS v1 on jQuery-1.8.1
|
|
|
|
|
|
prefer to always use > and >= operators (idea from Closure)
|
|
|
|
|
|
- all symbols now have a `thedef` property which is a SymbolDef object,
instead of the `uniq` that we had before (pointing to the first occurrence
of the name as declaration).
- for undeclared symbols we still create a SymbolDef object in the toplevel
scope but mark it "undeclared"
- we can now call figure_out_scope after squeezing, which is useful in order
not to mangle names that were dropped by the squeezer
|
|
- discard statements with no side effects (unsafe? could be)
- safer hoist_vars (needs some revamping of scope/mangling)
|
|
|
|
|
|
|
|
|
|
|
|
( v1 report: https://github.com/mishoo/UglifyJS/pull/458 )
|
|
|