|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434 |
- [![npm][npm]][npm-url]
- [![node][node]][node-url]
- [![deps][deps]][deps-url]
- [![test][test]][test-url]
- [![coverage][cover]][cover-url]
- [![chat][chat]][chat-url]
-
-
- <div align="center">
- <a href="https://github.com/webpack/webpack">
- <img width="200" height="200"
- src="https://cdn.rawgit.com/webpack/media/e7485eb2/logo/icon.svg">
- </a>
- <h1>UglifyJS Webpack Plugin</h1>
- <p>This plugin uses <a href="https://github.com/mishoo/UglifyJS2/tree/harmony">UglifyJS v3 </a><a href="https://npmjs.com/package/uglify-es">(`uglify-es`)</a> to minify your JavaScript</p>
- </div>
-
- > ℹ️ `webpack < v4.0.0` currently contains [`v0.4.6`](https://github.com/webpack-contrib/uglifyjs-webpack-plugin/tree/version-0.4) of this plugin under `webpack.optimize.UglifyJsPlugin` as an alias. For usage of the latest version (`v1.0.0`), please follow the instructions below. Aliasing `v1.0.0` as `webpack.optimize.UglifyJsPlugin` is scheduled for `webpack v4.0.0`
-
- <h2 align="center">Install</h2>
-
- ```bash
- npm i -D uglifyjs-webpack-plugin
- ```
-
- <h2 align="center">Usage</h2>
-
- **webpack.config.js**
- ```js
- const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
-
- module.exports = {
- //...
- optimization: {
- minimizer: [
- new UglifyJsPlugin()
- ]
- }
- }
- ```
-
- <h2 align="center">Options</h2>
-
- |Name|Type|Default|Description|
- |:--:|:--:|:-----:|:----------|
- |**`test`**|`{RegExp\|Array<RegExp>}`| <code>/\\.js$/i</code>|Test to match files against|
- |**`include`**|`{RegExp\|Array<RegExp>}`|`undefined`|Files to `include`|
- |**`exclude`**|`{RegExp\|Array<RegExp>}`|`undefined`|Files to `exclude`|
- |**`cache`**|`{Boolean\|String}`|`false`|Enable file caching|
- |**`cacheKeys`**|`{Function(defaultCacheKeys, file) -> {Object}}`|`defaultCacheKeys => defaultCacheKeys`|Allows you to override default cache keys|
- |**`parallel`**|`{Boolean\|Number}`|`false`|Use multi-process parallel running to improve the build speed|
- |**`sourceMap`**|`{Boolean}`|`false`|Use source maps to map error message locations to modules (This slows down the compilation) ⚠️ **`cheap-source-map` options don't work with this plugin**|
- |**`minify`**|`{Function}`|`undefined`|Allows you to override default minify function|
- |**`uglifyOptions`**|`{Object}`|[`{...defaults}`](https://github.com/webpack-contrib/uglifyjs-webpack-plugin/tree/master#uglifyoptions)|`uglify` [Options](https://github.com/mishoo/UglifyJS2/tree/harmony#minify-options)|
- |**`extractComments`**|`{Boolean\|RegExp\|Function<(node, comment) -> {Boolean\|Object}>}`|`false`|Whether comments shall be extracted to a separate file, (see [details](https://github.com/webpack/webpack/commit/71933e979e51c533b432658d5e37917f9e71595a) (`webpack >= 2.3.0`)|
- |**`warningsFilter`**|`{Function(source) -> {Boolean}}`|`() => true`|Allow to filter uglify warnings|
-
- ### `test`
-
- **webpack.config.js**
- ```js
- [
- new UglifyJsPlugin({
- test: /\.js($|\?)/i
- })
- ]
- ```
-
- ### `include`
-
- **webpack.config.js**
- ```js
- [
- new UglifyJsPlugin({
- include: /\/includes/
- })
- ]
- ```
-
- ### `exclude`
-
- **webpack.config.js**
- ```js
- [
- new UglifyJsPlugin({
- exclude: /\/excludes/
- })
- ]
- ```
-
- ### `cache`
-
- If you use your own `minify` function please read the `minify` section for cache invalidation correctly.
-
- #### `{Boolean}`
-
- **webpack.config.js**
- ```js
- [
- new UglifyJsPlugin({
- cache: true
- })
- ]
- ```
-
- Enable file caching.
- Default path to cache directory: `node_modules/.cache/uglifyjs-webpack-plugin`.
-
- #### `{String}`
-
- **webpack.config.js**
- ```js
- [
- new UglifyJsPlugin({
- cache: 'path/to/cache'
- })
- ]
- ```
-
- Path to cache directory.
-
- ### `cacheKeys`
-
- **webpack.config.js**
- ```js
- [
- new UglifyJsPlugin({
- cache: true,
- cacheKeys: (defaultCacheKeys, file) => {
- defaultCacheKeys.myCacheKey = 'myCacheKeyValue';
-
- return defaultCacheKeys;
- },
- })
- ]
- ```
-
- Allows you to override default cache keys.
-
- Default keys:
- ```js
- {
- 'uglify-es': versions.uglify, // uglify version
- 'uglifyjs-webpack-plugin': versions.plugin, // plugin version
- 'uglifyjs-webpack-plugin-options': this.options, // plugin options
- path: compiler.outputPath ? `${compiler.outputPath}/${file}` : file, // asset path
- hash: crypto.createHash('md4').update(input).digest('hex'), // source file hash
- }
- ```
-
- ### `parallel`
-
- #### `{Boolean}`
-
- **webpack.config.js**
- ```js
- [
- new UglifyJsPlugin({
- parallel: true
- })
- ]
- ```
-
- Enable parallelization.
- Default number of concurrent runs: `os.cpus().length - 1`.
-
- #### `{Number}`
-
- **webpack.config.js**
- ```js
- [
- new UglifyJsPlugin({
- parallel: 4
- })
- ]
- ```
-
- Number of concurrent runs.
-
- > ℹ️ Parallelization can speedup your build significantly and is therefore **highly recommended**
-
- ### `sourceMap`
-
- If you use your own `minify` function please read the `minify` section for handling source maps correctly.
-
- **webpack.config.js**
- ```js
- [
- new UglifyJsPlugin({
- sourceMap: true
- })
- ]
- ```
-
- > ⚠️ **`cheap-source-map` options don't work with this plugin**
-
- ### `minify`
-
- > ⚠️ **Always use `require` inside `minify` function when `parallel` option enabled**
-
- **webpack.config.js**
- ```js
- [
- new UglifyJsPlugin({
- minify(file, sourceMap) {
- const extractedComments = [];
-
- // Custom logic for extract comments
-
- const { error, map, code, warnings } = require('uglify-module') // Or require('./path/to/uglify-module')
- .minify(
- file,
- { /* Your options for minification */ },
- );
-
- return { error, map, code, warnings, extractedComments };
- }
- })
- ]
- ```
-
- By default plugin uses `uglify-es` package.
-
- Examples:
-
- #### `uglify-js`
-
- ```bash
- npm i -D uglify-js
- ```
-
- **webpack.config.js**
- ```js
- [
- new UglifyJsPlugin({
- // Uncomment lines below for cache invalidation correctly
- // cache: true,
- // cacheKeys(defaultCacheKeys) {
- // return Object.assign(
- // {},
- // defaultCacheKeys,
- // { 'uglify-js': require('uglify-js/package.json').version },
- // );
- // },
- minify(file, sourceMap) {
- // https://github.com/mishoo/UglifyJS2#minify-options
- const uglifyJsOptions = { /* your `uglify-js` package options */ };
-
- if (sourceMap) {
- uglifyJsOptions.sourceMap = {
- content: sourceMap,
- };
- }
-
- return require('uglify-js').minify(file, uglifyJsOptions);
- }
- })
- ]
- ```
-
- #### `terser`
-
- ```bash
- npm i -D terser
- ```
-
- **webpack.config.js**
- ```js
- [
- new UglifyJsPlugin({
- // Uncomment lines below for cache invalidation correctly
- // cache: true,
- // cacheKeys(defaultCacheKeys) {
- // return Object.assign(
- // {},
- // defaultCacheKeys,
- // { terser: require('terser/package.json').version },
- // );
- // },
- minify(file, sourceMap) {
- // https://github.com/fabiosantoscode/terser#minify-options
- const terserOptions = { /* your `terser` package options */ };
-
- if (sourceMap) {
- terserOption.sourceMap = {
- content: sourceMap,
- };
- }
-
- return require('terser').minify(file, terserOptions);
- }
- })
- ]
- ```
-
- ### [`uglifyOptions`](https://github.com/mishoo/UglifyJS2/tree/harmony#minify-options)
-
- |Name|Type|Default|Description|
- |:--:|:--:|:-----:|:----------|
- |**`ecma`**|`{Number}`|`undefined`|Supported ECMAScript Version (`5`, `6`, `7` or `8`). Affects `parse`, `compress` && `output` options|
- |**`warnings`**|`{Boolean}`|`false`|Display Warnings|
- |**[`parse`](https://github.com/mishoo/UglifyJS2/tree/harmony#parse-options)**|`{Object}`|`{}`|Additional Parse Options|
- |**[`compress`](https://github.com/mishoo/UglifyJS2/tree/harmony#compress-options)**|`{Boolean\|Object}`|`true`|Additional Compress Options|
- |**[`mangle`](https://github.com/mishoo/UglifyJS2/tree/harmony#mangle-options)**|`{Boolean\|Object}`|`{inline: false}`|Enable Name Mangling (See [Mangle Properties](https://github.com/mishoo/UglifyJS2/tree/harmony#mangle-properties-options) for advanced setups, use with ⚠️)|
- |**[`output`](https://github.com/mishoo/UglifyJS2/tree/harmony#output-options)**|`{Object}`|`{comments: extractComments ? false : /^\**!\|@preserve\|@license\|@cc_on/,}`|Additional Output Options (The defaults are optimized for best compression)|
- |**`toplevel`**|`{Boolean}`|`false`|Enable top level variable and function name mangling and to drop unused variables and functions|
- |**`nameCache`**|`{Object}`|`null`|Enable cache of mangled variable and property names across multiple invocations|
- |**`ie8`**|`{Boolean}`|`false`|Enable IE8 Support|
- |**`keep_classnames`**|`{Boolean}`|`undefined`|Enable prevent discarding or mangling of class names|
- |**`keep_fnames`**|`{Boolean}`|`false`| Enable prevent discarding or mangling of function names. Useful for code relying on `Function.prototype.name`. If the top level minify option `keep_classnames` is `undefined` it will be overriden with the value of the top level minify option `keep_fnames`|
- |**`safari10`**|`{Boolean}`|`false`|Enable work around Safari 10/11 bugs in loop scoping and `await`|
-
- **webpack.config.js**
- ```js
- [
- new UglifyJsPlugin({
- uglifyOptions: {
- ecma: 8,
- warnings: false,
- parse: {...options},
- compress: {...options},
- mangle: {
- ...options,
- properties: {
- // mangle property options
- }
- },
- output: {
- comments: false,
- beautify: false,
- ...options
- },
- toplevel: false,
- nameCache: null,
- ie8: false,
- keep_classnames: undefined,
- keep_fnames: false,
- safari10: false,
- }
- })
- ]
- ```
-
- ### `extractComments`
-
- #### `{Boolean}`
-
- All comments that normally would be preserved by the `comments` option will be moved to a separate file. If the original file is named `foo.js`, then the comments will be stored to `foo.js.LICENSE`.
-
- #### `{RegExp|String}` or `{Function<(node, comment) -> {Boolean}>}`
-
- All comments that match the given expression (resp. are evaluated to `true` by the function) will be extracted to the separate file. The `comments` option specifies whether the comment will be preserved, i.e. it is possible to preserve some comments (e.g. annotations) while extracting others or even preserving comments that have been extracted.
-
- #### `{Object}`
-
- |Name|Type|Default|Description|
- |:--:|:--:|:-----:|:----------|
- |**`condition`**|`{Regex\|Function}`|``|Regular Expression or function (see previous point)|
- |**`filename`**|`{String\|Function}`|`${file}.LICENSE`|The file where the extracted comments will be stored. Can be either a `{String}` or a `{Function<(string) -> {String}>}`, which will be given the original filename. Default is to append the suffix `.LICENSE` to the original filename|
- |**`banner`**|`{Boolean\|String\|Function}`|`/*! For license information please see ${filename}.js.LICENSE */`|The banner text that points to the extracted file and will be added on top of the original file. Can be `false` (no banner), a `{String}`, or a `{Function<(string) -> {String}` that will be called with the filename where extracted comments have been stored. Will be wrapped into comment|
-
- ### `warningsFilter`
-
- **webpack.config.js**
- ```js
- [
- new UglifyJsPlugin({
- warningsFilter: (src) => true
- })
- ]
- ```
-
- <h2 align="center">Maintainers</h2>
-
- <table>
- <tbody>
- <tr>
- <td align="center">
- <a href="https://github.com/hulkish">
- <img width="150" height="150" src="https://github.com/hulkish.png?size=150">
- </br>
- Steven Hargrove
- </a>
- </td>
- <td align="center">
- <a href="https://github.com/bebraw">
- <img width="150" height="150" src="https://github.com/bebraw.png?v=3&s=150">
- </br>
- Juho Vepsäläinen
- </a>
- </td>
- <td align="center">
- <a href="https://github.com/d3viant0ne">
- <img width="150" height="150" src="https://github.com/d3viant0ne.png?v=3&s=150">
- </br>
- Joshua Wiens
- </a>
- </td>
- <td align="center">
- <a href="https://github.com/michael-ciniawsky">
- <img width="150" height="150" src="https://github.com/michael-ciniawsky.png?v=3&s=150">
- </br>
- Michael Ciniawsky
- </a>
- </td>
- <td align="center">
- <a href="https://github.com/evilebottnawi">
- <img width="150" height="150" src="https://github.com/evilebottnawi.png?v=3&s=150">
- </br>
- Alexander Krasnoyarov
- </a>
- </td>
- </tr>
- <tbody>
- </table>
-
-
- [npm]: https://img.shields.io/npm/v/uglifyjs-webpack-plugin.svg
- [npm-url]: https://npmjs.com/package/uglifyjs-webpack-plugin
-
- [node]: https://img.shields.io/node/v/uglifyjs-webpack-plugin.svg
- [node-url]: https://nodejs.org
-
- [deps]: https://david-dm.org/webpack-contrib/uglifyjs-webpack-plugin.svg
- [deps-url]: https://david-dm.org/webpack-contrib/uglifyjs-webpack-plugin
-
- [test]: https://img.shields.io/circleci/project/github/webpack-contrib/uglifyjs-webpack-plugin.svg
- [test-url]: https://circleci.com/gh/webpack-contrib/uglifyjs-webpack-plugin
-
- [cover]: https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/branch/master/graph/badge.svg
- [cover-url]: https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin
-
- [chat]: https://img.shields.io/badge/gitter-webpack%2Fwebpack-brightgreen.svg
- [chat-url]: https://gitter.im/webpack/webpack
|