Skip to main content

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.
  • Natively binds to esbuild for super fast JS and CSS minification.

Performance

Comparison with html-minfier 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.

Usage

CLI

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

Get

Linux x86-64 | Linux ARM | macOS | Windows

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.6.2", features = ["js-esbuild"] }

Building with the js-esbuild feature requires the Go compiler to be installed as well, to build the JS and CSS minifier.

If the js-esbuild feature is not enabled, cfg.minify_js and cfg.minify_css will have no effect.

Use

Check out the docs for API and usage examples.

Node.js
  • Package: @minify-html/js
  • Binding: N-API
  • Platforms: Linux (ARM64 and x86-64), macOS (x86-64), Windows (x86-64); Node.js 8.6.0 and higher

Get

Using npm:

npm i @minify-html/js

Using Yarn:

yarn add @minify-html/js

Use

const minifyHtml = require("@minify-html/js");

// Refer to TypeScript definitions for details.
const cfg = minifyHtml.createConfiguration({ keep_closing_tags: true, remove_bangs: false });
const minified = minifyHtml.minify("<p>  Hello, world!  </p>", cfg);

minify-html is also available for TypeScript:

import * as minifyHtml from "@minify-html/js";
import * as fs from "fs";

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

Get

Add as a Maven dependency:

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

Use

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

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

String minified = MinifyHtml.minify("<p>  Hello, world!  </p>", cfg);
Python
  • Package: minify-html
  • Binding: PyO3
  • Platforms: Linux, macOS, Windows; Python 3.7 and higher

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)
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 })

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. These can be turned off via the Cfg object.

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 recognises elements based on one of a few ways it assumes they are used. By making these assumptions, it can apply optimal whitespace minification strategies.

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.

Metadata

Release files for minify-html 0.6.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for minify-html 0.6.2
File Actions
minify_html-0.6.2-cp39-none-win_amd64.whl CPython 3.9 none Windows x86-64 Details for minify_html-0.6.2-cp39-none-win_amd64.whl
minify_html-0.6.2-cp39-cp39-manylinux2010_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.12+ x86-64 Details for minify_html-0.6.2-cp39-cp39-manylinux2010_x86_64.whl
minify_html-0.6.2-cp39-cp39-macosx_10_7_x86_64.whl CPython 3.9 CPython 3.9 macOS 10.7+ x86-64 Details for minify_html-0.6.2-cp39-cp39-macosx_10_7_x86_64.whl
minify_html-0.6.2-cp38-none-win_amd64.whl CPython 3.8 none Windows x86-64 Details for minify_html-0.6.2-cp38-none-win_amd64.whl
minify_html-0.6.2-cp38-cp38-manylinux2010_x86_64.whl CPython 3.8 CPython 3.8 Linux glibc 2.12+ x86-64 Details for minify_html-0.6.2-cp38-cp38-manylinux2010_x86_64.whl
minify_html-0.6.2-cp38-cp38-macosx_10_7_x86_64.whl CPython 3.8 CPython 3.8 macOS 10.7+ x86-64 Details for minify_html-0.6.2-cp38-cp38-macosx_10_7_x86_64.whl
minify_html-0.6.2-cp37-none-win_amd64.whl CPython 3.7 none Windows x86-64 Details for minify_html-0.6.2-cp37-none-win_amd64.whl
minify_html-0.6.2-cp37-cp37m-manylinux2010_x86_64.whl CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.12+ x86-64 Details for minify_html-0.6.2-cp37-cp37m-manylinux2010_x86_64.whl
minify_html-0.6.2-cp37-cp37m-macosx_10_7_x86_64.whl CPython 3.7 CPython 3.7 pymalloc macOS 10.7+ x86-64 Details for minify_html-0.6.2-cp37-cp37m-macosx_10_7_x86_64.whl

Total release size: 30.1 MB

Release files / minify_html-0.6.2-cp39-none-win_amd64.whl

Download URL minify_html-0.6.2-cp39-none-win_amd64.whl
Size 4.3 MB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
f8a904702991228d73d0c3ffabc29c70b818eadf32abe27fece9546ca2888bce
BLAKE2b-256 checksum
How to use checksums
cd63b46f27aa0a98269c2eaf218eb68b9ad5ca2f9d0d506a98cbd54d771d3cd3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

Release files / minify_html-0.6.2-cp39-cp39-manylinux2010_x86_64.whl

Download URL minify_html-0.6.2-cp39-cp39-manylinux2010_x86_64.whl
Size 3.1 MB
Tags CPython 3.9 Linux glibc 2.12+ x86-64
SHA-256 checksum
How to use checksums
084379773d01f24f588fd9cf451b12561bf9dab2a2bd9ddd75d547de4c39ff97
BLAKE2b-256 checksum
How to use checksums
c7660561b038341a7772f7c11f91ddda5eaefa699fb1c31d3743b2af99820a39
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

Release files / minify_html-0.6.2-cp39-cp39-macosx_10_7_x86_64.whl

Download URL minify_html-0.6.2-cp39-cp39-macosx_10_7_x86_64.whl
Size 2.7 MB
Tags CPython 3.9 macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
f78e20ee73c5c90a108d63c6783317bbe416cd4d683bdb2a6646df09ddc86085
BLAKE2b-256 checksum
How to use checksums
09fc03a7c97a8fb3060bf33ccc28b28bba8697397ae52a69c2e1734e9053a98f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

Release files / minify_html-0.6.2-cp38-none-win_amd64.whl

Download URL minify_html-0.6.2-cp38-none-win_amd64.whl
Size 4.3 MB
Tags CPython 3.8 Windows x86-64
SHA-256 checksum
How to use checksums
0f73f40560ca28c6a50d6d8ba296aeb915ee5902136fddc26a0d19456c44b817
BLAKE2b-256 checksum
How to use checksums
e805980286cff24eeb6fd2362f3831f943763d7f8627f5448b4c6cda0c84c710
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.10

Release files / minify_html-0.6.2-cp38-cp38-manylinux2010_x86_64.whl

Download URL minify_html-0.6.2-cp38-cp38-manylinux2010_x86_64.whl
Size 3.1 MB
Tags CPython 3.8 Linux glibc 2.12+ x86-64
SHA-256 checksum
How to use checksums
2e3b4226a41213bd27304a622d34da6c8839f8c1fa13f7ec9d807b3af3105ab7
BLAKE2b-256 checksum
How to use checksums
ca98761a4712e3139e41a93080eca19d90a7b7a7a92889c4a0578b6508c5066b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.11

Release files / minify_html-0.6.2-cp38-cp38-macosx_10_7_x86_64.whl

Download URL minify_html-0.6.2-cp38-cp38-macosx_10_7_x86_64.whl
Size 2.7 MB
Tags CPython 3.8 macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
77b6f4d13c090e0b98edd8ae6f55f7f46f429426d39ea53bb079bb738bc6fcc1
BLAKE2b-256 checksum
How to use checksums
affb71067086fb398c112f2d29bbff74637bd4bc4e90f0fd08d26d463ad04a45
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.11

Release files / minify_html-0.6.2-cp37-none-win_amd64.whl

Download URL minify_html-0.6.2-cp37-none-win_amd64.whl
Size 4.3 MB
Tags CPython 3.7 Windows x86-64
SHA-256 checksum
How to use checksums
a7f2a2912abfa6228107acbc81754cb909a122507165e526db25284b88aeb89c
BLAKE2b-256 checksum
How to use checksums
659d602b310744163e4ae0ad5ee8b78d136ea583c89be84305fd2f57fa9bd92d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.7.9

Release files / minify_html-0.6.2-cp37-cp37m-manylinux2010_x86_64.whl

Download URL minify_html-0.6.2-cp37-cp37m-manylinux2010_x86_64.whl
Size 3.1 MB
Tags CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.12+ x86-64
SHA-256 checksum
How to use checksums
2af3586dd5f20ead6e4f6e49cd7e975b2609bd6a1768aab91bdeec902b472a33
BLAKE2b-256 checksum
How to use checksums
64edaaa045f83d1e085ceaedc281c9ca8303ec0c7a499ad71341b27862bb50cc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.7.11

Release files / minify_html-0.6.2-cp37-cp37m-macosx_10_7_x86_64.whl

Download URL minify_html-0.6.2-cp37-cp37m-macosx_10_7_x86_64.whl
Size 2.7 MB
Tags CPython 3.7 CPython 3.7 pymalloc macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
81107feddceac26092ed5920552a207036977bda02353218ad145a4f498bb767
BLAKE2b-256 checksum
How to use checksums
9e03b2eaf312b8331fdd2a576c149f8150551cc0ac85d430cf2c80dace28153b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.7.11

Security for minify-html 0.6.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.6.2 This release

9 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page