Skip to main content

Extremely fast and smart HTML + JS + CSS minifier

Project description

minify-html

A Rust HTML minifier meticulously optimised for speed and effectiveness, with bindings for other languages.

  • Advanced minification strategy beats other minifiers while being much faster.
  • Uses SIMD searching, direct tries, and lookup tables.
  • Handles invalid HTML, with extensive testing and fuzzing.
  • Uses minify-js for super fast JS minification.

View the changelog to see the latest updates.

Performance

Comparison with html-minifier and minimize, run on the top web pages. See the breakdown here.

Chart showing speed of HTML minifiersChart showing compression of HTML minifiers

The onepass variant is even more optimised for speed. See its README for more details.

Compatibility and usage

CLI

Precompiled binaries are available for Linux, macOS, and Windows.

Get

Linux x64 | Linux ARM64 | macOS x64 | macOS ARM64 | Windows x64

Use

Use the --help argument for more details.

minify-html --output /path/to/output.min.html --keep-closing-tags --minify-css /path/to/src.html
Rust

Get

[dependencies]
minify-html = { version = "0.9.0" }

Use

Check out the docs for API and usage examples.

Deno

Use

import init, {minify} from "https://wilsonl.in/minify-html/deno/0.9.0/index.js";

const encoder = new TextEncoder();
const decoder = new TextDecoder();

await init();

const minified = decoder.decode(minify(encoder.encode("<p>  Hello, world!  </p>"), { keep_spaces_between_attributes: true, keep_comments: true }));

All Cfg fields are available as snake_case properties on the object provided as the second argument; if any are not set, they default to false.

Node.js
  • Package: @minify-html/node
  • Binding: Neon
  • Platforms: Linux (ARM64 and x64), macOS (ARM64 and x64), Windows (x64); Node.js 8.6.0 and higher

Get

Using npm:

npm i @minify-html/node

Using Yarn:

yarn add @minify-html/node

Use

TypeScript definitions are available.

import * as minifyHtml from "@minify-html/node";
// Or `const minifyHtml = require("@minify-html/node")` if not using TS/ESM.

const minified = minifyHtml.minify("<p>  Hello, world!  </p>", { keep_spaces_between_attributes: true, keep_comments: true });

All Cfg fields are available as snake_case properties on the object provided as the second argument; if any are not set, they default to false.

Java

Get

Add as a Maven dependency:

<dependency>
  <groupId>in.wilsonl.minifyhtml</groupId>
  <artifactId>minify-html</artifactId>
  <version>0.9.0</version>
</dependency>

Use

import in.wilsonl.minifyhtml.Configuration;
import in.wilsonl.minifyhtml.MinifyHtml;

Configuration cfg = new Configuration.Builder()
    .setKeepHtmlAndHeadOpeningTags(true)
    .setMinifyCss(true)
    .build();

String minified = MinifyHtml.minify("<p>  Hello, world!  </p>", cfg);

All Cfg fields are available as camelCase setter methods on the Builder; if any are not set, they default to false.

Python
  • Package: minify-html
  • Binding: PyO3
  • Platforms: Linux (ARM64 and x64), macOS (ARM64 and x64), Windows (x64); Python 3.8 to 3.10

Get

Add the PyPI project as a dependency and install it using pip or pipenv.

Use

import minify_html

minified = minify_html.minify("<p>  Hello, world!  </p>", minify_js=True, remove_processing_instructions=True)

All Cfg fields are available as Python keyword arguments; if any are omitted, they default to False.

Ruby
  • Package: minify_html
  • Binding: Rutie
  • Platforms: Linux, macOS; Ruby 2.5 and higher

Get

Add the library as a dependency to Gemfile or *.gemspec.

Use

require 'minify_html'

print MinifyHtml.minify("<p>  Hello, world!  </p>", { :keep_spaces_between_attributes => true, :minify_js => true })

All Cfg fields are available; if any are omitted, they default to false.

WASM

A bundler may be required to use the WebAssembly module, see this for more details.

Use

import init, {minify} from "@minify-html/wasm";

const encoder = new TextEncoder();
const decoder = new TextDecoder();

await init();

const minified = decoder.decode(minify(encoder.encode("<p>  Hello, world!  </p>"), { keep_spaces_between_attributes: true, keep_comments: true }));

All Cfg fields are available as snake_case properties on the object provided as the second argument; if any are not set, they default to false.

Minification

Note that some of the minification done can result in HTML that will not pass validation, but remain interpreted and rendered correctly by the browser; essentially, the laxness of the browser is taken advantage of for better minification. To prevent this, refer to these configuration options:

  • do_not_minify_doctype
  • ensure_spec_compliant_unquoted_attribute_values
  • keep_spaces_between_attributes

Whitespace

minify-html has advanced context-aware whitespace minification that does things such as:

  • Leave whitespace untouched in pre and code, which are whitespace sensitive.
  • Trim and collapse whitespace in content tags, as whitespace is collapsed anyway when rendered.
  • Remove whitespace in layout tags, which allows the use of inline layouts while keeping formatted code.

Methods

There are three whitespace minification methods. When processing text content, minify-html chooses which ones to use depending on the containing element.

Collapse whitespace

Applies to: any element except whitespace sensitive elements.

Reduce a sequence of whitespace characters in text nodes to a single space (U+0020).

BeforeAfter
<p>↵
··The·quick·brown·fox↵
··jumps·over·the·lazy↵
··dog.↵
</p>
<p>·The·quick·brown·fox·jumps·over·the·lazy·dog.·</p>
Destroy whole whitespace

Applies to: any element except whitespace sensitive, content, content-first, and formatting elements.

Remove any text nodes between tags that only consist of whitespace characters.

BeforeAfter
<ul>↵
··<li>A</li>↵
··<li>B</li>↵
··<li>C</li></ul>
<ul>↵
··<li>A</li><li>B</li><li>C</li></ul>
Trim whitespace

Applies to: any element except whitespace sensitive and formatting elements.

Remove any leading/trailing whitespace from any leading/trailing text nodes of a tag.

BeforeAfter
<p>↵
··Hey,·I·<em>just</em>·found↵
··out·about·this·<strong>cool</strong>·website!↵
··<sup>[1]</sup></p>
<p>Hey,·I·<em>just</em>·found↵
··out·about·this·<strong>cool</strong>·website!↵
··<sup>[1]</sup></p>

Element types

minify-html assumes HTML and SVG elements are used in specific ways, based on standards and best practices. By making these assumptions, it can apply optimal whitespace minification strategies. If these assumptions do not hold, consider adjusting the HTML source or turning off whitespace minification.

Group Elements Expected children
Formatting a, strong, and others Formatting elements, text.
Content h1, p, and others Formatting elements, text.
Layout div, ul, and others Layout elements, content elements.
Content-first label, li, and others Like content but could be layout with only one child.
Formatting elements

Whitespace is collapsed.

Formatting elements are usually inline elements that wrap around part of some text in a content element, so its whitespace isn't trimmed as they're probably part of the content.

Content elements

Whitespace is trimmed and collapsed.

Content elements usually represent a contiguous and complete unit of content such as a paragraph. As such, whitespace is significant but sequences of them are most likely due to formatting.

Before
<p>↵
··Hey,·I·<em>just</em>·found↵
··out·about·this·<strong>cool</strong>·website!↵
··<sup>[1]</sup></p>
After
<p>Hey,·I·<em>just</em>·found·out·about·this·<strong>cool</strong>·website!·<sup>[1]</sup></p>
Layout elements

Whitespace is trimmed and collapsed. Whole whitespace is removed.

These elements should only contain other elements and no text. This makes it possible to remove whole whitespace, which is useful when using display: inline-block so that whitespace between elements (e.g. indentation) does not alter layout and styling.

Before
<ul>↵
··<li>A</li>↵
··<li>B</li>↵
··<li>C</li></ul>
After
<ul><li>A</li><li>B</li><li>C</li></ul>
Content-first elements

Whitespace is trimmed and collapsed.

These elements are usually like content elements but are occasionally used like a layout element with one child. Whole whitespace is not removed as it might contain content, but this is OK for using as layout as there is only one child and whitespace is trimmed.

Before
<li>↵
··<article>↵
····<section></section>↵
····<section></section>↵
··</article></li>
After
<li><article><section></section><section></section></article></li>

Tags

Optional opening and closing tags are removed.

Attributes

Any entities in attribute values are decoded, and then the shortest representation of the value is calculated and used:

  • Double quoted, with any " encoded.
  • Single quoted, with any ' encoded.
  • Unquoted, with "/' first character (if applicable), any >, and any whitespace encoded.

Attributes have their whitespace (after any decoding) trimmed and collapsed when possible.

Boolean attribute values are removed. Some other attributes are completely removed if their value is empty or the default value after any processing.

type attributes on script tags with a value equaling a JavaScript MIME type are removed.

If an attribute value is empty after any processing, everything but the name is completely removed (i.e. no =), as an empty attribute is implicitly the same as an attribute with an empty string value.

Spaces are removed between attributes when possible.

Entities

Entities are decoded if they're valid and shorter or equal in length when decoded. UTF-8 sequences that have a shorter entity representation are encoded.

Numeric entities that do not refer to a valid Unicode Scalar Value are replaced with the replacement character.

Encoding is avoided when possible; for example, < are only encoded in content if they are followed by a valid tag name character. If necessary, the shortest entity representation is chosen.

Comments

Comments are removed.

Ignored

Bangs, processing instructions, and empty elements are not removed as it is assumed there is a special reason for their declaration.

Parsing

minify-html can process any HTML, handling all possible syntax (including invalid ones) gracefully like browsers. See Parsing.md for more details.

Issues and contributions

Pull requests and any contributions welcome!

If minify-html did something unexpected, misunderstood some syntax, or incorrectly kept/removed some code, raise an issue with some relevant code that can be used to reproduce and investigate the issue.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

minify_html-0.9.0-cp310-none-win_amd64.whl (545.4 kB view details)

Uploaded CPython 3.10Windows x86-64

minify_html-0.9.0-cp310-cp310-manylinux_2_28_aarch64.whl (625.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

minify_html-0.9.0-cp310-cp310-manylinux_2_27_x86_64.whl (693.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64

minify_html-0.9.0-cp310-cp310-macosx_11_0_arm64.whl (529.5 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

minify_html-0.9.0-cp310-cp310-macosx_10_7_x86_64.whl (582.7 kB view details)

Uploaded CPython 3.10macOS 10.7+ x86-64

minify_html-0.9.0-cp39-none-win_amd64.whl (545.4 kB view details)

Uploaded CPython 3.9Windows x86-64

minify_html-0.9.0-cp39-cp39-manylinux_2_28_aarch64.whl (625.2 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ ARM64

minify_html-0.9.0-cp39-cp39-manylinux_2_27_x86_64.whl (693.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64

minify_html-0.9.0-cp39-cp39-macosx_11_0_arm64.whl (529.5 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

minify_html-0.9.0-cp39-cp39-macosx_10_7_x86_64.whl (582.7 kB view details)

Uploaded CPython 3.9macOS 10.7+ x86-64

minify_html-0.9.0-cp38-none-win_amd64.whl (545.1 kB view details)

Uploaded CPython 3.8Windows x86-64

minify_html-0.9.0-cp38-cp38-manylinux_2_28_aarch64.whl (625.0 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.28+ ARM64

minify_html-0.9.0-cp38-cp38-manylinux_2_27_x86_64.whl (693.5 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.27+ x86-64

minify_html-0.9.0-cp38-cp38-macosx_11_0_arm64.whl (529.5 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

minify_html-0.9.0-cp38-cp38-macosx_10_7_x86_64.whl (582.5 kB view details)

Uploaded CPython 3.8macOS 10.7+ x86-64

File details

Details for the file minify_html-0.9.0-cp310-none-win_amd64.whl.

File metadata

  • Download URL: minify_html-0.9.0-cp310-none-win_amd64.whl
  • Upload date:
  • Size: 545.4 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.5

File hashes

Hashes for minify_html-0.9.0-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 c6a8ea6802ce694ec8d40b6db651302cb97ebd71eb32e639faa9ce6e36ec8ab0
MD5 324a3489429bc5ac4fb059f1a5759a13
BLAKE2b-256 3a3fd6705a965e22d6ae4ca38856ae386857fc2e4b490165fe83c43d6debe612

See more details on using hashes here.

File details

Details for the file minify_html-0.9.0-cp310-cp310-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for minify_html-0.9.0-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9ff709319983cc36d7382c2d2c94019b4b8affbc3d37142c0f3ecd1b98a57a67
MD5 d66f0b929d028d24427d47f8264d71ae
BLAKE2b-256 828b7d4d8f072ea1e2cc1cd93abdad98a91fb630d9b60ec8294b62f6951409ed

See more details on using hashes here.

File details

Details for the file minify_html-0.9.0-cp310-cp310-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for minify_html-0.9.0-cp310-cp310-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 75a1ddd7de0b1e03afca3b7ba2cc751a85563ba1f902e6ad7b3ea0651cd2f8e8
MD5 37437188b51bbf779099ec0a92f19e9b
BLAKE2b-256 b63d76692537e58ed92d49b4f593d61d8ec4ff851a9fd97cd40eb1e90e91c27f

See more details on using hashes here.

File details

Details for the file minify_html-0.9.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for minify_html-0.9.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8ba9a03a98d8ca4150703012e865adb21002327f6eb436a8de8d5b931a5bb5b3
MD5 abd42562838af70a091accd07baa5dbf
BLAKE2b-256 9b67216155f547beedcda42cbd20039cce7956f60355dc30357563b10ea0d50c

See more details on using hashes here.

File details

Details for the file minify_html-0.9.0-cp310-cp310-macosx_10_7_x86_64.whl.

File metadata

File hashes

Hashes for minify_html-0.9.0-cp310-cp310-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 eb981a69dc88330056b02aac74e606b7e189038e45dad34a5cd6de2acc821b63
MD5 aa02034f11da8e1fd206b7f87ed44ae1
BLAKE2b-256 b8f2abb10b8ea8dc99a1215a0e3f1730538b5bec114f7c27c5f11eeb641e3d55

See more details on using hashes here.

File details

Details for the file minify_html-0.9.0-cp39-none-win_amd64.whl.

File metadata

  • Download URL: minify_html-0.9.0-cp39-none-win_amd64.whl
  • Upload date:
  • Size: 545.4 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for minify_html-0.9.0-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 5c00d5894d5b406a3ca46e89ba4f35dc252621948f3adb7a7856d2e318bee265
MD5 fea6afb8e3a89a5c02a1e6f234311993
BLAKE2b-256 e742ac96a52f2744c5373f13c04d7798b121aa1a65165408b0d82b9c26b346b2

See more details on using hashes here.

File details

Details for the file minify_html-0.9.0-cp39-cp39-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for minify_html-0.9.0-cp39-cp39-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7bd517d64a31fd02957c05604b787ef85ec28a5a87643527fcbee836fd1daef8
MD5 a95430b142f3908565e3008dfb7b7b3a
BLAKE2b-256 55a0c5115d8de601a285384899801b46a8881b5b1fe9f98c628737dce4f3b57f

See more details on using hashes here.

File details

Details for the file minify_html-0.9.0-cp39-cp39-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for minify_html-0.9.0-cp39-cp39-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 f94feed721cd8cc0a4669120a94f05c6a4c9b615f7dcd8498414335ee3fc470d
MD5 3786ebbbfea71725a800ad5738cc228e
BLAKE2b-256 667412c30bd7baa229c33e27723f1cdb55c41d85bf8ed2bb53c540dee7b869ea

See more details on using hashes here.

File details

Details for the file minify_html-0.9.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for minify_html-0.9.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3a03c587a3540f09df1444b5c87931c7230c3bcc507f0fe691a601e250c1b481
MD5 fa42b61e2551124e4cf7b6b410881c5b
BLAKE2b-256 01fda1ee6a38a2581100c66546130cce9b48ed6ea94610b5335a7759889399e1

See more details on using hashes here.

File details

Details for the file minify_html-0.9.0-cp39-cp39-macosx_10_7_x86_64.whl.

File metadata

File hashes

Hashes for minify_html-0.9.0-cp39-cp39-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 71e3526ddf3f1e3085f9b56408b77e5900bf76ddd503fe24f0e3becc483d6baf
MD5 0f0127231b3c46dc6a554e05ba6883fd
BLAKE2b-256 1ae014d56ea0e2b1f19e4aff96b2ae233a78c07097da27105a686dcac79c55db

See more details on using hashes here.

File details

Details for the file minify_html-0.9.0-cp38-none-win_amd64.whl.

File metadata

  • Download URL: minify_html-0.9.0-cp38-none-win_amd64.whl
  • Upload date:
  • Size: 545.1 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.10

File hashes

Hashes for minify_html-0.9.0-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 4dc279d8c6a7e80d6659f3df9f4f424d0e2c4bbf85897ef51f9c0f6ca015a298
MD5 3823c06b4c621826dfec14433f25d851
BLAKE2b-256 cc1a4bc850092a9f8332eaf55990ec02fe00a9c36ffe09d62a0a16c94e114993

See more details on using hashes here.

File details

Details for the file minify_html-0.9.0-cp38-cp38-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for minify_html-0.9.0-cp38-cp38-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 8445baac7de72c34f8b06a73d39e25c939cc4241ea50cd567c11eeffd809a833
MD5 929e5048e50490b03e3df4d5fce6d3f1
BLAKE2b-256 5270f55e4d128f3e7632cd392456fdf2f33dee7df27db3315efb005996ec5b85

See more details on using hashes here.

File details

Details for the file minify_html-0.9.0-cp38-cp38-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for minify_html-0.9.0-cp38-cp38-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 1a26e855a68a6fc21977021eaed763f6aee683111ca437745824c90b13892c6f
MD5 c70c8dfcb06122e58367b39bc87c9517
BLAKE2b-256 3e102cc888782ff3aea6ece502d2ef06e13a694b8be6fce1958b9f01d5818cac

See more details on using hashes here.

File details

Details for the file minify_html-0.9.0-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for minify_html-0.9.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0c3d3f638e369fd4ca99edcf517aecc7c4a1af168cb1645317646c2f88c1be57
MD5 15f53f05a12133bb03bd8526c1054e11
BLAKE2b-256 bbd133a11956cf100f75d07c5909901477a10d85a3778f66762b150d6c561b68

See more details on using hashes here.

File details

Details for the file minify_html-0.9.0-cp38-cp38-macosx_10_7_x86_64.whl.

File metadata

File hashes

Hashes for minify_html-0.9.0-cp38-cp38-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 343d35880c3752a6b7cf7ac34d0e80ccd819a3d704611063472737bc562e75e8
MD5 c9bc4e28e2ef263965ca56399c7a5584
BLAKE2b-256 a1b028f12420ae99b06b0244ffa16eed04dc2c29a4c99ef9a1b5eff7bf174521

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page