You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.md 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. # HTMLMinifier
  2. [![NPM version](https://img.shields.io/npm/v/html-minifier.svg)](https://www.npmjs.com/package/html-minifier)
  3. [![Build Status](https://img.shields.io/travis/kangax/html-minifier.svg)](https://travis-ci.org/kangax/html-minifier)
  4. [![Dependency Status](https://img.shields.io/david/kangax/html-minifier.svg)](https://david-dm.org/kangax/html-minifier)
  5. [HTMLMinifier](https://kangax.github.io/html-minifier/) is a highly **configurable**, **well-tested**, JavaScript-based HTML minifier.
  6. See [corresponding blog post](http://perfectionkills.com/experimenting-with-html-minifier/) for all the gory details of [how it works](http://perfectionkills.com/experimenting-with-html-minifier/#how_it_works), [description of each option](http://perfectionkills.com/experimenting-with-html-minifier/#options), [testing results](http://perfectionkills.com/experimenting-with-html-minifier/#field_testing) and [conclusions](http://perfectionkills.com/experimenting-with-html-minifier/#cost_and_benefits).
  7. [Test suite is available online](https://kangax.github.io/html-minifier/tests/).
  8. Also see corresponding [Ruby wrapper](https://github.com/stereobooster/html_minifier), and for Node.js, [Grunt plugin](https://github.com/gruntjs/grunt-contrib-htmlmin), [Gulp module](https://github.com/jonschlinkert/gulp-htmlmin), [Koa middleware wrapper](https://github.com/koajs/html-minifier) and [Express middleware wrapper](https://github.com/melonmanchan/express-minify-html).
  9. For lint-like capabilities take a look at [HTMLLint](https://github.com/kangax/html-lint).
  10. ## Minification comparison
  11. How does HTMLMinifier compare to other solutions — [HTML Minifier from Will Peavy](http://www.willpeavy.com/minifier/) (1st result in [Google search for "html minifier"](https://www.google.com/#q=html+minifier)) as well as [htmlcompressor.com](http://htmlcompressor.com) and [minimize](https://github.com/Swaagie/minimize)?
  12. | Site | Original size *(KB)* | HTMLMinifier | minimize | Will Peavy | htmlcompressor.com |
  13. | ---------------------------------------------------------------------------- |:--------------------:| ------------:| --------:| ----------:| ------------------:|
  14. | [Google](https://www.google.com/) | 48 | **44** | 48 | 49 | 48 |
  15. | [HTMLMinifier](https://github.com/kangax/html-minifier) | 154 | **117** | 128 | 133 | 128 |
  16. | [Twitter](https://twitter.com/) | 203 | **162** | 195 | 219 | 195 |
  17. | [Stack Overflow](https://stackoverflow.com/) | 254 | **196** | 208 | 216 | 205 |
  18. | [Bootstrap CSS](https://getbootstrap.com/docs/3.3/css/) | 271 | **260** | 269 | 229 | 269 |
  19. | [BBC](https://www.bbc.co.uk/) | 288 | **230** | 280 | 281 | 272 |
  20. | [Amazon](https://www.amazon.co.uk/) | 508 | **439** | 495 | 501 | n/a |
  21. | [Wikipedia](https://en.wikipedia.org/wiki/President_of_the_United_States) | 533 | **434** | 517 | 536 | 517 |
  22. | [New York Times](https://mathiasbynens.be/_tmp/nyt.html) | 699 | **619** | 693 | 683 | n/a |
  23. | [NBC](https://www.nbc.com/) | 700 | **657** | 698 | 699 | n/a |
  24. | [Eloquent Javascript](https://eloquentjavascript.net/1st_edition/print.html) | 870 | **815** | 840 | 864 | n/a |
  25. | [ES6 table](https://kangax.github.io/compat-table/es6/) | 5308 | **4529** | 5025 | n/a | n/a |
  26. | [ES draft](https://tc39.github.io/ecma262/) | 6082 | **5456** | 5624 | n/a | n/a |
  27. ## Options Quick Reference
  28. Most of the options are disabled by default.
  29. | Option | Description | Default |
  30. |--------------------------------|-----------------|---------|
  31. | `caseSensitive` | Treat attributes in case sensitive manner (useful for custom HTML tags) | `false` |
  32. | `collapseBooleanAttributes` | [Omit attribute values from boolean attributes](http://perfectionkills.com/experimenting-with-html-minifier/#collapse_boolean_attributes) | `false` |
  33. | `collapseInlineTagWhitespace` | Don't leave any spaces between `display:inline;` elements when collapsing. Must be used in conjunction with `collapseWhitespace=true` | `false` |
  34. | `collapseWhitespace` | [Collapse white space that contributes to text nodes in a document tree](http://perfectionkills.com/experimenting-with-html-minifier/#collapse_whitespace) | `false` |
  35. | `conservativeCollapse` | Always collapse to 1 space (never remove it entirely). Must be used in conjunction with `collapseWhitespace=true` | `false` |
  36. | `customAttrAssign` | Arrays of regex'es that allow to support custom attribute assign expressions (e.g. `'<div flex?="{{mode != cover}}"></div>'`) | `[ ]` |
  37. | `customAttrCollapse` | Regex that specifies custom attribute to strip newlines from (e.g. `/ng-class/`) | |
  38. | `customAttrSurround` | Arrays of regex'es that allow to support custom attribute surround expressions (e.g. `<input {{#if value}}checked="checked"{{/if}}>`) | `[ ]` |
  39. | `customEventAttributes` | Arrays of regex'es that allow to support custom event attributes for `minifyJS` (e.g. `ng-click`) | `[ /^on[a-z]{3,}$/ ]` |
  40. | `decodeEntities` | Use direct Unicode characters whenever possible | `false` |
  41. | `html5` | Parse input according to HTML5 specifications | `true` |
  42. | `ignoreCustomComments` | Array of regex'es that allow to ignore certain comments, when matched | `[ /^!/ ]` |
  43. | `ignoreCustomFragments` | Array of regex'es that allow to ignore certain fragments, when matched (e.g. `<?php ... ?>`, `{{ ... }}`, etc.) | `[ /<%[\s\S]*?%>/, /<\?[\s\S]*?\?>/ ]` |
  44. | `includeAutoGeneratedTags` | Insert tags generated by HTML parser | `true` |
  45. | `keepClosingSlash` | Keep the trailing slash on singleton elements | `false` |
  46. | `maxLineLength` | Specify a maximum line length. Compressed output will be split by newlines at valid HTML split-points |
  47. | `minifyCSS` | Minify CSS in style elements and style attributes (uses [clean-css](https://github.com/jakubpawlowicz/clean-css)) | `false` (could be `true`, `Object`, `Function(text, type)`) |
  48. | `minifyJS` | Minify JavaScript in script elements and event attributes (uses [UglifyJS](https://github.com/mishoo/UglifyJS2)) | `false` (could be `true`, `Object`, `Function(text, inline)`) |
  49. | `minifyURLs` | Minify URLs in various attributes (uses [relateurl](https://github.com/stevenvachon/relateurl)) | `false` (could be `String`, `Object`, `Function(text)`) |
  50. | `preserveLineBreaks` | Always collapse to 1 line break (never remove it entirely) when whitespace between tags include a line break. Must be used in conjunction with `collapseWhitespace=true` | `false` |
  51. | `preventAttributesEscaping` | Prevents the escaping of the values of attributes | `false` |
  52. | `processConditionalComments` | Process contents of conditional comments through minifier | `false` |
  53. | `processScripts` | Array of strings corresponding to types of script elements to process through minifier (e.g. `text/ng-template`, `text/x-handlebars-template`, etc.) | `[ ]` |
  54. | `quoteCharacter` | Type of quote to use for attribute values (' or ") | |
  55. | `removeAttributeQuotes` | [Remove quotes around attributes when possible](http://perfectionkills.com/experimenting-with-html-minifier/#remove_attribute_quotes) | `false` |
  56. | `removeComments` | [Strip HTML comments](http://perfectionkills.com/experimenting-with-html-minifier/#remove_comments) | `false` |
  57. | `removeEmptyAttributes` | [Remove all attributes with whitespace-only values](http://perfectionkills.com/experimenting-with-html-minifier/#remove_empty_or_blank_attributes) | `false` (could be `true`, `Function(attrName, tag)`) |
  58. | `removeEmptyElements` | [Remove all elements with empty contents](http://perfectionkills.com/experimenting-with-html-minifier/#remove_empty_elements) | `false` |
  59. | `removeOptionalTags` | [Remove optional tags](http://perfectionkills.com/experimenting-with-html-minifier/#remove_optional_tags) | `false` |
  60. | `removeRedundantAttributes` | [Remove attributes when value matches default.](http://perfectionkills.com/experimenting-with-html-minifier/#remove_redundant_attributes) | `false` |
  61. | `removeScriptTypeAttributes` | Remove `type="text/javascript"` from `script` tags. Other `type` attribute values are left intact | `false` |
  62. | `removeStyleLinkTypeAttributes`| Remove `type="text/css"` from `style` and `link` tags. Other `type` attribute values are left intact | `false` |
  63. | `removeTagWhitespace` | Remove space between attributes whenever possible. **Note that this will result in invalid HTML!** | `false` |
  64. | `sortAttributes` | [Sort attributes by frequency](#sorting-attributes--style-classes) | `false` |
  65. | `sortClassName` | [Sort style classes by frequency](#sorting-attributes--style-classes) | `false` |
  66. | `trimCustomFragments` | Trim white space around `ignoreCustomFragments`. | `false` |
  67. | `useShortDoctype` | [Replaces the `doctype` with the short (HTML5) doctype](http://perfectionkills.com/experimenting-with-html-minifier/#use_short_doctype) | `false` |
  68. ### Sorting attributes / style classes
  69. Minifier options like `sortAttributes` and `sortClassName` won't impact the plain-text size of the output. However, they form long repetitive chains of characters that should improve compression ratio of gzip used in HTTP compression.
  70. ## Special cases
  71. ### Ignoring chunks of markup
  72. If you have chunks of markup you would like preserved, you can wrap them `<!-- htmlmin:ignore -->`.
  73. ### Preserving SVG tags
  74. SVG tags are automatically recognized, and when they are minified, both case-sensitivity and closing-slashes are preserved, regardless of the minification settings used for the rest of the file.
  75. ### Working with invalid markup
  76. HTMLMinifier **can't work with invalid or partial chunks of markup**. This is because it parses markup into a tree structure, then modifies it (removing anything that was specified for removal, ignoring anything that was specified to be ignored, etc.), then it creates a markup out of that tree and returns it.
  77. Input markup (e.g. `<p id="">foo`)
  78. Internal representation of markup in a form of tree (e.g. `{ tag: "p", attr: "id", children: ["foo"] }`)
  79. Transformation of internal representation (e.g. removal of `id` attribute)
  80. Output of resulting markup (e.g. `<p>foo</p>`)
  81. HTMLMinifier can't know that original markup was only half of the tree; it does its best to try to parse it as a full tree and it loses information about tree being malformed or partial in the beginning. As a result, it can't create a partial/malformed tree at the time of the output.
  82. ## Installation Instructions
  83. From NPM for use as a command line app:
  84. ```shell
  85. npm install html-minifier -g
  86. ```
  87. From NPM for programmatic use:
  88. ```shell
  89. npm install html-minifier
  90. ```
  91. From Git:
  92. ```shell
  93. git clone git://github.com/kangax/html-minifier.git
  94. cd html-minifier
  95. npm link .
  96. ```
  97. ## Usage
  98. Note that almost all options are disabled by default. For command line usage please see `html-minifier --help` for a list of available options. Experiment and find what works best for you and your project.
  99. * **Sample command line:** ``html-minifier --collapse-whitespace --remove-comments --remove-optional-tags --remove-redundant-attributes --remove-script-type-attributes --remove-tag-whitespace --use-short-doctype --minify-css true --minify-js true``
  100. ### Node.js
  101. ```js
  102. var minify = require('html-minifier').minify;
  103. var result = minify('<p title="blah" id="moo">foo</p>', {
  104. removeAttributeQuotes: true
  105. });
  106. result; // '<p title=blah id=moo>foo</p>'
  107. ```
  108. ## Running benchmarks
  109. Benchmarks for minified HTML:
  110. ```shell
  111. node benchmark.js
  112. ```