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

To quickly parallel process a batch of files in place:

minify-html --keep-closing-tags --minify-css /path/to/**/*.html
Rust

Get

[dependencies]
minify-html = "0.9.2"

Use

Check out the docs for API and usage examples.

Deno

Use

import init, {minify} from "https://wilsonl.in/minify-html/deno/0.9.2/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.2</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


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

minify_html-0.9.2-cp310-none-win_amd64.whl (546.3 kB view details)

Uploaded CPython 3.10Windows x86-64

minify_html-0.9.2-cp310-cp310-manylinux_2_28_aarch64.whl (625.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

minify_html-0.9.2-cp310-cp310-manylinux_2_27_x86_64.whl (694.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64

minify_html-0.9.2-cp310-cp310-macosx_11_0_arm64.whl (530.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

minify_html-0.9.2-cp310-cp310-macosx_10_7_x86_64.whl (584.2 kB view details)

Uploaded CPython 3.10macOS 10.7+ x86-64

minify_html-0.9.2-cp39-none-win_amd64.whl (546.4 kB view details)

Uploaded CPython 3.9Windows x86-64

minify_html-0.9.2-cp39-cp39-manylinux_2_28_aarch64.whl (625.8 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ ARM64

minify_html-0.9.2-cp39-cp39-manylinux_2_27_x86_64.whl (694.8 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64

minify_html-0.9.2-cp39-cp39-macosx_11_0_arm64.whl (530.6 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

minify_html-0.9.2-cp39-cp39-macosx_10_7_x86_64.whl (584.2 kB view details)

Uploaded CPython 3.9macOS 10.7+ x86-64

minify_html-0.9.2-cp38-none-win_amd64.whl (546.2 kB view details)

Uploaded CPython 3.8Windows x86-64

minify_html-0.9.2-cp38-cp38-manylinux_2_28_aarch64.whl (625.9 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.28+ ARM64

minify_html-0.9.2-cp38-cp38-manylinux_2_27_x86_64.whl (694.7 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.27+ x86-64

minify_html-0.9.2-cp38-cp38-macosx_11_0_arm64.whl (530.5 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

minify_html-0.9.2-cp38-cp38-macosx_10_7_x86_64.whl (584.1 kB view details)

Uploaded CPython 3.8macOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: minify_html-0.9.2-cp310-none-win_amd64.whl
  • Upload date:
  • Size: 546.3 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.2-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 481936dd4ef083afd5e4672fb8727d00a2cb945db22d0a60a397e7791276d710
MD5 8c6648de136eb5fb9c1cbd5a19774f5b
BLAKE2b-256 6030648fba178dcbf1c12c1748d5963692400c637c34d440ec2a7b8e6c6f99fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.9.2-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9ce703f6d9a18b8618457ac5791ef91635211e4fe253540a6a17e38e69922802
MD5 1a9d23e14d8f1e01dd1432b03a72dadb
BLAKE2b-256 35358cab0d0176e49dfd50667e4a0b13e2384144884e6a54ced763e0cde01561

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.9.2-cp310-cp310-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 95edae199f951b3ccc3d4b2e1727982a694c7464631a61c21b0a49ccd53338ac
MD5 16b3715ff984dc5f7de7fac5b67ab20e
BLAKE2b-256 09c38707ee274de2b379d5a4398897b1b6aeb714c9158d8710f0ebac14ccb9f7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.9.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 69bf111a39062db5d773da0d4b1c39e829668327e2d744d273fc6b930185d395
MD5 2f064fad92150e3009a9c9034e9b518b
BLAKE2b-256 1e24fb914d2ce45127a881865b4c3d0de66bca5391577d147031135a9d40dd60

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.9.2-cp310-cp310-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 fb0ec0ce8c3f9494152979678003ec843ebd2d0f0499362db2fa198e49113fe0
MD5 ede81b0e26b2ac29759bbcfdad8aed50
BLAKE2b-256 42b2dfe750ed361cc91397f05a77bfc5621d40ffd96fc6e34bdd6a0348255d73

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.9.2-cp39-none-win_amd64.whl
  • Upload date:
  • Size: 546.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.2-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 087d84e60443e4a11455a60e31db78313d2e08c63b90b5aa9a3c2055383f9dbb
MD5 64731e03f35a435c97d2e0d89eff0497
BLAKE2b-256 359ba05c2079fc5c118104aecf8cf7a356f69483e46774988c4a389a5133b2f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.9.2-cp39-cp39-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 cf65be62e2e8f77ee7cd8b3346ef46088882ee06451ffc041f4e84bb5007617d
MD5 e1f783decef3b679307162f8760d5546
BLAKE2b-256 7108e8ee8c2e19f6f119c949e9da793c94db8f1ea4c89e3096094b73fe677ee2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.9.2-cp39-cp39-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 031a5ec031d56b815402193b69c9db6b04990f6db08e5c78cd9d7d4379891ba4
MD5 a3196cbc1c584c463a6b197c0363ba93
BLAKE2b-256 3ebc9e158acfe766e28ae9a9940fafd1266302d62215d7e001dc158646c68767

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.9.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4944cf1f10805e20f68bcb67304a4a692d7bb28b9212f6825abe0dbad4d76647
MD5 7130e6d123b14da2239fcb27e7a53ff6
BLAKE2b-256 02b08a6aa9256f646b179e16a8b60a176d0d5505662be380ba34826a715c5956

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.9.2-cp39-cp39-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 cfe6e5e5e6c75e64bdb2a8753241432242aa8ac1b94443a649c3b393f07f8481
MD5 3e292f2cd0df012e62e2f3d692d301cb
BLAKE2b-256 48eeb443ee0ca5279b3b1c417762d8624c4ef58712703d2dbfb109b27747aaa2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.9.2-cp38-none-win_amd64.whl
  • Upload date:
  • Size: 546.2 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.2-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 6dff2d565f94fe7c5e9fe5254b75262271fc76277065af156dec5ca856d21fb0
MD5 0c2523a90547006ea4f7806fb8ed9d17
BLAKE2b-256 6f2a7b3cc58c6e3fe3013c8db2b5156bf2150442e69c2ecddd18ad20ce6f4ee6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.9.2-cp38-cp38-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a66eaa7af27826f908adb85f9854db7bef23a9e4c237475196fdb3b3386c94fe
MD5 38d66303d31f8a4a8888eef110586d95
BLAKE2b-256 5ca70e45119d8bcf85954d88eec7854989e7e0562c443025c6af03cb313cedb2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.9.2-cp38-cp38-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 b001dadd29ace73dc12c8f73e4ef203248f807866a31d6e9578a3c52c2b2a27b
MD5 84874db66636a85a82321e30074cf9ea
BLAKE2b-256 9035713249ce4cd87f99f764f40419693e498afa6a00cd49e3d11527162c8374

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.9.2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 96e11bc0bf86066317396e15f872033c5a67a25c2138790fe60602387a6fd163
MD5 f5ec947cbe87adcee4a88adfcc737131
BLAKE2b-256 7b0a924e143e281b96d6ca1aafc0134bb87a28a568c7545c20e7a4d6d03e45ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.9.2-cp38-cp38-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 2a2f0c1588ff7ae77b55c6bfcfbe21f1682afa6586deee71e638b69635d43d18
MD5 f01624ae9be9b2fdeab0953612be386d
BLAKE2b-256 0abf930667c69f7f1b74780b04a0410d0df685c3cefbacb6298cd39f847a77d8

See more details on using hashes here.

Supported by

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