Skip to main content

Even faster version of minify-html

Reason this release was yanked:

Main minify-html library has been released

Project description

minify-html

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

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

The CLI is called minhtml. Precompiled binaries are available for Linux (ARM64 and x64), macOS (ARM64 and x64), and Windows (x64). You can download them in the GitHub release.

If you have Cargo installed, you can also build and install from source: cargo install minhtml.

Use

Use the --help argument for more details.

minhtml --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:

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

Get

[dependencies]
minify-html-fallback = "0.16.3"

Use

Check out the docs for API and usage examples.

Deno

Use

import init, {minify} from "https://wilsonl.in/minify-html/deno/0.15.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 { Buffer } from "node:buffer";
import minifyHtml from "@minify-html/node";
// Or `const minifyHtml = require("@minify-html/node")` if not using TS/ESM.

const minified = minifyHtml.minify(Buffer.from("<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
  • Package: in.wilsonl.minifyhtml
  • Binding: JNI
  • Platforms: Linux (ARM64 and x64), macOS (ARM64 and x64), Windows (x64); Java 7 and higher

Get

Add as a Maven dependency:

<dependency>
  <groupId>in.wilsonl.minifyhtml</groupId>
  <artifactId>minify-html</artifactId>
  <version>0.16.3</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.12

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: rb-sys and magnus
  • Platforms: Linux (ARM64 and x64), macOS (ARM64 and x64), Windows (x64); Ruby 2.7 to 3.2

Get

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

Use

require 'minify_html'

print minify_html("<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.

Templating syntax

minify-html can parse and preserve {{/{%/{# and <% syntax in the source code, which allows minification of many HTML templates written for most engines like Pebble, Mustache, Django, Go, Jinja, Twix, Nunjucks, Handlebars, Sailfish, JSP, EJS, and ERB. Look for the preserve_*_template_syntax Cfg options.

PHP blocks (<?php or <?=) also happen to be processing instructions, which are preserved by default.

Note that in all of these syntax, the parsing is "dumb": it will simply look for the next subsequence of characters that match the closing delimiter. This may cause issues if nesting or string literals appear inside these blocks, but this should be rare.

Minification

Spec compliance

WHATWG is the current HTML standard and obsoletes all previous standards. WHATWG lists suggested validators here.

To minify even further, it's possible to enable options that may output HTML that doesn't fully pass validation, but is still interpreted and rendered correctly according to the WHATWG parsing specification, which major browser engines (Firefox, Chrome, Safari) implement. Refer to these options:

  • allow_noncompliant_unquoted_attribute_values
  • allow_optimal_entities
  • allow_removing_spaces_between_attributes
  • minify_doctype

In Rust, Cfg::enable_possibly_noncompliant can enable all of these at once.

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 Distribution

minify_html_onepass_fallback-0.16.3.tar.gz (81.3 kB view details)

Uploaded Source

Built Distributions

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

minify_html_onepass_fallback-0.16.3-cp313-cp313-win_amd64.whl (2.5 MB view details)

Uploaded CPython 3.13Windows x86-64

minify_html_onepass_fallback-0.16.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

minify_html_onepass_fallback-0.16.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

minify_html_onepass_fallback-0.16.3-cp313-cp313-macosx_11_0_arm64.whl (2.2 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

minify_html_onepass_fallback-0.16.3-cp313-cp313-macosx_10_12_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

minify_html_onepass_fallback-0.16.3-cp312-cp312-win_amd64.whl (2.5 MB view details)

Uploaded CPython 3.12Windows x86-64

minify_html_onepass_fallback-0.16.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

minify_html_onepass_fallback-0.16.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

minify_html_onepass_fallback-0.16.3-cp312-cp312-macosx_11_0_arm64.whl (2.2 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

minify_html_onepass_fallback-0.16.3-cp312-cp312-macosx_10_12_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

File details

Details for the file minify_html_onepass_fallback-0.16.3.tar.gz.

File metadata

File hashes

Hashes for minify_html_onepass_fallback-0.16.3.tar.gz
Algorithm Hash digest
SHA256 da83fb0f380671cceae3e4478ced16eef467a3c9597614048cc75e523950e92a
MD5 4533ee72a63cf5d8dd272157e49637e8
BLAKE2b-256 90ca85b71d73a0fac08019d86746c385567230c29f86a4c96b294675e2a2f228

See more details on using hashes here.

File details

Details for the file minify_html_onepass_fallback-0.16.3-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for minify_html_onepass_fallback-0.16.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 229432698ae1d5a8715475cfd0ebe0bf831aded4585c4eaf3be4adb1ff35cd9d
MD5 8567b4aea170973e62d4a4d08e78ef23
BLAKE2b-256 2248a0322125d0052a200ba621cf3aa5427722a7c6f356cdd070404095ca92a0

See more details on using hashes here.

File details

Details for the file minify_html_onepass_fallback-0.16.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for minify_html_onepass_fallback-0.16.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 914a74430dd787c2e5d1120f5f357c95b6f940dabc1082394e134ed98d798a5d
MD5 58a5d32759d58c9980470fffcd1c6214
BLAKE2b-256 71113c4d0cc069b51b52006369a0cc0ef0280a0d840058c2ab5cf6c0c29717fe

See more details on using hashes here.

File details

Details for the file minify_html_onepass_fallback-0.16.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for minify_html_onepass_fallback-0.16.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9ddf0507b72b2e41b3c076acb9f3fddc8438684ccefed00ac13bff7ebaebd52f
MD5 21558c14dcac947aba27de4ecc009d42
BLAKE2b-256 e741a5ae36b4efb2346ad402d766dce718ab0e2d0883089e767fb98a33f87cfa

See more details on using hashes here.

File details

Details for the file minify_html_onepass_fallback-0.16.3-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for minify_html_onepass_fallback-0.16.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 96f358d5faa0431c8dbace5c87fb8497373cc277867b7999873cbec44b317556
MD5 110908672bae7f11b6d1d8e28629fb39
BLAKE2b-256 9e1926eda9198b143dbea32c87f226d51c4ba2d716de1c7ee6a70f3b31bddab8

See more details on using hashes here.

File details

Details for the file minify_html_onepass_fallback-0.16.3-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for minify_html_onepass_fallback-0.16.3-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 fa6cbefdb4d92853de742099a47557385e8409badb01e512a2cd929b709c7782
MD5 5ef0e3f6fe33b0edf2677ca4925d816a
BLAKE2b-256 43b796a498490ca4d2cabf23f9ba735a7885a520fd46054e7283cc0143553492

See more details on using hashes here.

File details

Details for the file minify_html_onepass_fallback-0.16.3-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for minify_html_onepass_fallback-0.16.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 390023baccee33d15dc67ac683dd61bb192f4933ee2ad9aa60cace55a0f357d7
MD5 a0ec76994c4a83fe80d4e8a4f387e65a
BLAKE2b-256 203d5ee6ca1afc0094657cfcf8e670cb9dd52f67f6c58e15613aa9427a03913f

See more details on using hashes here.

File details

Details for the file minify_html_onepass_fallback-0.16.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for minify_html_onepass_fallback-0.16.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 355f53524d73c45e3eb2cc008b05dd6b0bae38e147b1a96017618e3f2312d714
MD5 eaa38ef5ba40ae860b2af5d1e3256bb2
BLAKE2b-256 339893906d12ffc746f7a113f7d912144003d25deaae736ba2615172c0abc48b

See more details on using hashes here.

File details

Details for the file minify_html_onepass_fallback-0.16.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for minify_html_onepass_fallback-0.16.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a3b6123edb4cdda7ffb666c53014d4aee234a124ac0ca8d8471b1aad1406a9d3
MD5 1a0bac8c7ae89a0603ce9d1f0555d29b
BLAKE2b-256 86b1d02537e62ae7f99fb5a2329169cbe19e01cf1ba0b06a23dadf93ec35e57c

See more details on using hashes here.

File details

Details for the file minify_html_onepass_fallback-0.16.3-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for minify_html_onepass_fallback-0.16.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3d242d311cb38f2e5e638aff649d3506a2accd4ae4d056b1981ba20ba2dfd384
MD5 cb9cd6c9bcd9449572d90ee14614960c
BLAKE2b-256 bede8a079833c0f7aeafee74ac4cb85e77ea38f3f53eb644f168250b9da0d389

See more details on using hashes here.

File details

Details for the file minify_html_onepass_fallback-0.16.3-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for minify_html_onepass_fallback-0.16.3-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a50dd50a7b011fa6e2e7b42c85ca345013d9a9e049b7e65a895bee6d1a9b8913
MD5 f63c63d2c025bf6ac28362c4c6e60038
BLAKE2b-256 b095cdbabb4c3b54fac555be0de34f6b4dd0dd8fb29b297dab984960ec2a8a37

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