[![NPM Version][npm-image]][npm-url] [![NPM Downloads][downloads-image]][downloads-url] [![CI pipeline][ci-image]][ci-url] [![Opencollective financial contributors][opencollective-contributors]][opencollective-url] A JavaScript mangler/compressor toolkit for ES6+. note: You can support this project on patreon: [link] The Terser Patreon is shutting down…
[![NPM Version][npm-image]][npm-url]
[![NPM Downloads][downloads-image]][downloads-url]
[![CI pipeline][ci-image]][ci-url]
[![Opencollective financial contributors][opencollective-contributors]][opencollective-url]
A JavaScript mangler/compressor toolkit for ES6+.
*note*: You can support this project on patreon: [link] The Terser Patreon is shutting down in favor of opencollective. Check out PATRONS.md for our first-tier patrons.
Terser recommends you use RollupJS to bundle your modules, as that produces smaller code overall.
*Beautification* has been undocumented and is *being removed* from terser, we recommend you use prettier.
Find the changelog in CHANGELOG.md
[npm-image]: https://img.shields.io/npm/v/terser.svg
[npm-url]: https://npmjs.org/package/terser
[downloads-image]: https://img.shields.io/npm/dm/terser.svg
[downloads-url]: https://npmjs.org/package/terser
[ci-image]: https://github.com/terser/terser/actions/workflows/ci.yml/badge.svg
[ci-url]: https://github.com/terser/terser/actions/workflows/ci.yml
[opencollective-contributors]: https://opencollective.com/terser/tiers/badge.svg
[opencollective-url]: https://opencollective.com/terser
Why choose terser?
------------------
uglify-es is no longer maintained and uglify-js does not support ES6+.
terser is a fork of uglify-es that mostly retains API and CLI compatibility
with uglify-es and uglify-js@3.
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 terser -g
From NPM for programmatic use:
npm install terser
Command line usage
<!-- CLI_USAGE:START -->
terser [input files] [options]
Terser can take multiple input files. It's recommended that you pass the
input files first, then pass the options. Terser 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.
Command line arguments that take options (like --parse, --compress, --mangle and
--format) can take in a comma-separated list of default option overrides. For
instance:
terser input.js --compress ecma=2015,computed_props=false
If no input file is specified, Terser 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:
terser --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 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 and DOM
API props.
`debug` Add debug prefix and suffix.
`keep_quoted` Only mangle unquoted properties, quoted
properties are automatically reserved.
`strict` disables quoted properties
being automatically reserved.
`regex` Only mangle matched property names.
`only_annotated` Only mangle properties defined with /*@__MANGLE_PROP__*/.
`reserved` List of names that should not be mangled.
-f, --format [options] Specify format options.
`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 parenthesis. Note: you may
want to disable `negate_iife` under
compressor options.
`wrap_func_args` Wrap function arguments in parenthesis.
-o, --output Output file path (default STDOUT). Specify `ast` or
`spidermonkey` to write Terser or SpiderMonkey AST
as JSON to STDOUT respectively.
--comments [filter] Preserve copyright comments in the output. By
default this works like Google Closure, keeping
JSDoc-style comments that contain e.g. "@license",
or start with "!". You can optionally pass one of the
following arguments to this flag:
- "all" to keep all comments
- `false` to omit comments in the output
- 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 Read `minify()` options from JSON file.
-d, --define [=value] Global definitions.
--ecma Specify ECMAScript release: 5, 2015, 2016, etc.
-e, --enclose [arg[:value]] Embed output in a big function with configurable
arguments and values.
--ie8 Support non-standard Internet Explorer 8.
Equivalent to setting `ie8: true` in `minify()`
for `compress`, `mangle` and `format` options.
By default Terser will not try to be IE-proof.
--keep-classnames Do not mangle/drop class names.
--keep-fnames Do not mangle/drop function names. Useful for
code relying on Function.prototype.name.
--module Input is an ES6 module. If `compress` or `mangle` is
enabled then the `toplevel` option, as well as strict mode,
will be enabled.
--name-cache File to hold mangled name mappings.
--safari10 Support non-standard Safari 10/11.
Equivalent to setting `safari10: true` in `minify()`
for `mangle` and `format` options.
By default `terser` will not work around
Safari 10/11 bugs.
--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` Name and/or location of the output source.
`includeSources` Pass this flag if you want to include
the content of source files in the
source map as sourcesContent property.
`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.
--wrap 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
Terser 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 tooutput.js.map).
Additional options:
--source-map "filename=''"to specify the name of the source map.
--source-map "root=''"to pass the URL where the original files can be found.
--source-map "url=''"to specify the URL where the source map can be found.
X-SourceMap is being used and will omit the
//# sourceMappingURL= directive.
For example:
terser js/file1.js js/file2.js \
-o foo.min.js -c -m \
--source-map "root='http://foo.com/src',url='foo.min.js.map'"
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 andhttp://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 andjs/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). Terser has an
option to take an input source map. Assuming you have a mapping from
CoffeeScript → compiled JS, Terser 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](#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:
terser 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:
toplevel(defaultfalse) -- mangle names declared in the top level scope.
eval(defaultfalse) -- mangle names visible in scopes whereevalorwithare used.
--mangle reserved — pass a
comma-separated list of names. For example:
terser ... -m reserved=['$','require','exports']
to prevent the require, exports and $ names from being changed.
CLI mangling property names (--mangle-props)
Note: THIS WILL BREAK YOUR CODE. A good rule of thumb is not to use this unless you know exactly what you're doing and how this works and read this section until the end.
Mangling property names is a separate step, different from variable name mangling. Pass--mangle-props to enable it. The least dangerous
way to use this is to use the regex option like so:
terser example.js -c -m --mangle-props regex=/_$/
This will mangle all properties that end with an
underscore. So you can use it to mangle internal methods.
By default, it will mangle all properties in the
input code with the exception of built in DOM properties and properties
in core JavaScript classes, which is what will break your code if you don't:
1. Control all the code you're mangling
2. Avoid using a module bundler, as they usually will call Terser on each file individually, making it impossible to pass mangled objects between modules.
3. Avoid calling functions like defineProperty or hasOwnProperty, because they refer to object properties using strings and will break your code if you don't know what you are doing.
An example:
javascript
// example.js
var x = {
baz_: 0,
foo_: 1,
calc: function() {
return this.foo_ + this.baz_;
}
};
x.bar_ = 2;
x["baz_"] = 3;
console.log(x.calc());
Mangle all properties (except for JavaScript builtins) (very unsafe):
bash
$ terser example.js -c passes=2 -m --mangle-props
javascript
var x={o:3,t:1,i:function(){return this.t+this.o},s:2};console.log(x.i());
Mangle all properties except for reserved properties (still very unsafe):
bash
$ terser example.js -c passes=2 -m --mangle-props reserved=[foo_,bar_]
javascript
var x={o:3,foo_:1,t:function(){return this.foo_+this.o},bar_:2};console.log(x.t());
Mangle all properties matching a regex (not as unsafe but still unsafe):
bash
$ terser example.js -c passes=2 -m --mangle-props regex=/_$/
javascript
var x={o:3,t:1,calc:function(){return this.t+this.o},i:2};console.log(x.calc());
Combining mangle properties options:
```bash
$ terser example
…
Members
-
terser
🗜 JavaScript parser, mangler and compressor toolkit for ES6+
JavaScript ★ 9.3k 2d agoExplain → -
html-minifier-terser
actively maintained fork of html-minifier - minify HTML, CSS and JS code using terser - supports ES6 code
JavaScript ★ 476 3d agoExplain → -
repl
📟 REPL web application
JavaScript ★ 19 2y agoExplain → -
terser-rust-experiment
No description.
JavaScript ★ 7 5y agoExplain → -
terser-functional-tests
No description.
JavaScript ★ 4 3y agoExplain → -
website
🌐 terser's website source code
JavaScript ★ 3 8d agoExplain → -
terser-bundle
A super fast EcmaScript compiler and bundler tightly integrated with Terser.
JavaScript ★ 2 3y agoExplain → -
terser.github.io
🌐 Terser's website (automatically generated! for source see the repo: website)
HTML ★ 0 8d agoExplain → -
require-terser
Require hook that minifies every file passed to it. Used for testing Terser.
JavaScript ★ 0 4y agoExplain →
No repos match these filters.