UglifyJS is a JavaScript parser, minifier, compressor and beautifier toolkit.
Note:
uglify-js supports JavaScript and most language features in ECMAScript.
For more exotic parts of ECMAScript, process your source file with transpilers
like Babel before passing onto uglify-js.
uglify-js@3 has a simplified API and CLI
that is not backwards compatible with uglify-js@2.
Install
First make sure you have installed the latest version of node.js
(You may need to restart your computer after this step).
From NPM for use as a command line app:
npm install uglify-js -g
From NPM for programmatic use:
npm install uglify-js
Command line usage
uglifyjs [input files] [options]
UglifyJS can take multiple input files. It's recommended that you pass the
input files first, then pass the options. UglifyJS will parse input files
in sequence and apply any compression options. The files are parsed in the
same global scope, that is, a reference from a file to some
variable/function declared in another file will be matched properly.
If no input file is specified, UglifyJS will read from STDIN.
If you wish to pass your options before the input files, separate the two with
a double dash to prevent input files being used as option arguments:
uglifyjs --compress --mangle -- input.js
Command line options
-h, --help Print usage information.
`--help options` for details on available options.
-V, --version Print version number.
-p, --parse <options> Specify parser options:
`acorn` Use Acorn for parsing.
`bare_returns` Allow return outside of functions.
Useful when minifying CommonJS
modules and Userscripts that may
be anonymous function wrapped (IIFE)
by the .user.js engine `caller`.
`expression` Parse a single expression, rather than
a program (for parsing JSON).
`spidermonkey` Assume input files are SpiderMonkey
AST format (as JSON).
-c, --compress [options] Enable compressor/specify compressor options:
`pure_funcs` List of functions that can be safely
removed when their return values are
not used.
-m, --mangle [options] Mangle names/specify mangler options:
`reserved` List of names that should not be mangled.
--mangle-props [options] Mangle properties/specify mangler options:
`builtins` Mangle property names that overlaps
with standard JavaScript globals.
`debug` Add debug prefix and suffix.
`domprops` Mangle property names that overlaps
with DOM properties.
`keep_quoted` Only mangle unquoted properties.
`regex` Only mangle matched property names.
`reserved` List of names that should not be mangled.
-b, --beautify [options] Beautify output/specify output options:
`beautify` Enabled with `--beautify` by default.
`preamble` Preamble to prepend to the output. You
can use this to insert a comment, for
example for licensing information.
This will not be parsed, but the source
map will adjust for its presence.
`quote_style` Quote style:
0 - auto
1 - single
2 - double
3 - original
`wrap_iife` Wrap IIFEs in parentheses. Note: you may
want to disable `negate_iife` under
compressor options.
-O, --output-opts [options] Specify output options (`beautify` disabled by default).
-o, --output <file> Output file path (default STDOUT). Specify `ast` or
`spidermonkey` to write UglifyJS or SpiderMonkey AST
as JSON to STDOUT respectively.
--annotations Process and preserve comment annotations.
(`/*@__PURE__*/` or `/*#__PURE__*/`)
--no-annotations Ignore and discard comment annotations.
--comments [filter] Preserve copyright comments in the output. By
default this works like Google Closure, keeping
JSDoc-style comments that contain "@license" or
"@preserve". You can optionally pass one of the
following arguments to this flag:
- "all" to keep all comments
- a valid JS RegExp like `/foo/` or `/^!/` to
keep only matching comments.
Note that currently not *all* comments can be
kept when compression is on, because of dead
code removal or cascading statements into
sequences.
--config-file <file> Read `minify()` options from JSON file.
-d, --define <expr>[=value] Global definitions.
-e, --enclose [arg[:value]] Embed everything in a big function, with configurable
argument(s) & value(s).
--ie Support non-standard Internet Explorer.
Equivalent to setting `ie: true` in `minify()`
for `compress`, `mangle` and `output` options.
By default UglifyJS will not try to be IE-proof.
--keep-fargs Do not mangle/drop function arguments.
--keep-fnames Do not mangle/drop function names. Useful for
code relying on Function.prototype.name.
--module Process input as ES module (implies --toplevel)
--name-cache <file> File to hold mangled name mappings.
--self Build UglifyJS as a library (implies --wrap UglifyJS)
--source-map [options] Enable source map/specify source map options:
`base` Path to compute relative paths from input files.
`content` Input source map, useful if you're compressing
JS that was generated from some other original
code. Specify "inline" if the source map is
included within the sources.
`filename` Filename and/or location of the output source
(sets `file` attribute in source map).
`includeSources` Pass this flag if you want to include
the content of source files in the
source map as sourcesContent property.
`names` Include symbol names in the source map.
`root` Path to the original source to be included in
the source map.
`url` If specified, path to the source map to append in
`//# sourceMappingURL`.
--timings Display operations run time on STDERR.
--toplevel Compress and/or mangle variables in top level scope.
--v8 Support non-standard Chrome & Node.js
Equivalent to setting `v8: true` in `minify()`
for `mangle` and `output` options.
By default UglifyJS will not try to be v8-proof.
--verbose Print diagnostic messages.
--warn Print warning messages.
--webkit Support non-standard Safari/Webkit.
Equivalent to setting `webkit: true` in `minify()`
for `compress`, `mangle` and `output` options.
By default UglifyJS will not try to be Safari-proof.
--wrap <name> Embed everything in a big function, making the
“exports” and “global” variables available. You
need to pass an argument to this option to
specify the name that your module will take
when included in, say, a browser.
Specify --output (-o) to declare the output file. Otherwise the output
goes to STDOUT.
CLI source map options
UglifyJS can generate a source map file, which is highly useful for
debugging your compressed JavaScript. To get a source map, pass
--source-map --output output.js (source map will be written out to
output.js.map).
Additional options:
--source-map "filename='<NAME>'" to specify the name of the source map. The value of
filename is only used to set file attribute (see the spec)
in source map file.
--source-map "root='<URL>'" to pass the URL where the original files can be found.
--source-map "names=false" to omit symbol names if you want to reduce size
of the source map file.
--source-map "url='<URL>'" to specify the URL where the source map can be found.
Otherwise UglifyJS assumes HTTP X-SourceMap is being used and will omit the
//# sourceMappingURL= directive.
The above will compress and mangle file1.js and file2.js, will drop the
output in foo.min.js and the source map in foo.min.js.map. The source
mapping will refer to http://foo.com/src/js/file1.js and
http://foo.com/src/js/file2.js (in fact it will list http://foo.com/src
as the source map root, and the original files as js/file1.js and
js/file2.js).
Composed source map
When you're compressing JS code that was output by a compiler such as
CoffeeScript, mapping to the JS code won't be too helpful. Instead, you'd
like to map back to the original code (i.e. CoffeeScript). UglifyJS has an
option to take an input source map. Assuming you have a mapping from
CoffeeScript → compiled JS, UglifyJS can generate a map from CoffeeScript →
compressed JS by mapping every token in the compiled JS to its original
location.
To use this feature pass --source-map "content='/path/to/input/source.map'"
or --source-map "content=inline" if the source map is included inline with
the sources.
CLI compress options
You need to pass --compress (-c) to enable the compressor. Optionally
you can pass a comma-separated list of compress options.
Options are in the form foo=bar, or just foo (the latter implies
a boolean option that you want to set true; it's effectively a
shortcut for foo=true).
Example:
uglifyjs file.js -c toplevel,sequences=false
CLI mangle options
To enable the mangler you need to pass --mangle (-m). The following
(comma-separated) options are supported:
eval (default: false) — mangle names visible in scopes where eval or
with are used.
reserved (default: []) — when mangling is enabled but you want to
prevent certain names from being mangled, you can declare those names with
--mangle reserved — pass a comma-separated list of names. For example:
to prevent the require, exports and $ names from being changed.
CLI mangling property names (--mangle-props)
Note: THIS WILL PROBABLY BREAK YOUR CODE. Mangling property names
is a separate step, different from variable name mangling. Pass
--mangle-props to enable it. It will mangle all properties in the
input code with the exception of built in DOM properties and properties
in core JavaScript classes. For example:
In order for this to be of any use, we avoid mangling standard JS names by
default (--mangle-props builtins to override).
A default exclusion file is provided in tools/domprops.json which should
cover most standard JS and DOM properties defined in various browsers. Pass
--mangle-props domprops to disable this feature.
A regular expression can be used to define which property names should be
mangled. For example, --mangle-props regex=/^_/ will only mangle property
names that start with an underscore.
When you compress multiple files using this option, in order for them to
work together in the end we need to ensure somehow that one property gets
mangled to the same name in all of them. For this, pass --name-cache filename.json
and UglifyJS will maintain these mappings in a file which can then be reused.
It should be initially empty. Example:
Using quoted property name (o["foo"]) reserves the property name (foo)
so that it is not mangled throughout the entire script even when used in an
unquoted style (o.foo). Example:
You can also pass --mangle-props debug in order to mangle property names
without completely obscuring them. For example the property o.foo
would mangle to o._$foo$_ with this option. This allows property mangling
of a large codebase while still being able to debug the code and identify
where mangling is breaking things.
You can also pass a custom suffix using --mangle-props debug=XYZ. This would then
mangle o.foo to o._$foo$XYZ_. You can change this each time you compile a
script to identify how a property got mangled. One technique is to pass a
random number on every compile to simulate mangling changing with different
inputs (e.g. as you update the input script with new properties), and to help
identify mistakes like writing mangled keys to storage.
API Reference
Assuming installation via NPM, you can load UglifyJS in your application
like this:
varUglifyJS=require("uglify-js");
There is a single high level function, minify(code, options),
which will perform all minification phases in a configurable
manner. By default minify() will enable the options compress
and mangle. Example:
varcode="function add(first, second) { return first + second; }";varresult=UglifyJS.minify(code);console.log(result.error);// runtime error, or `undefined` if no errorconsole.log(result.code);// minified output: function add(n,d){return n+d}
You can minify more than one JavaScript file at a time by using an object
for the first argument where the keys are file names and the values are source
code:
varcode={"file1.js": "function add(first, second) { return first + second; }","file2.js": "console.log(add(1 + 2, 3 + 4));"};varresult=UglifyJS.minify(code);console.log(result.code);// function add(d,n){return d+n}console.log(add(3,7));
请发表评论