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.
  • 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.

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.6.2-cp39-none-win_amd64.whl (4.3 MB view details)

Uploaded CPython 3.9Windows x86-64

minify_html-0.6.2-cp39-cp39-manylinux2010_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64

minify_html-0.6.2-cp39-cp39-macosx_10_7_x86_64.whl (2.7 MB view details)

Uploaded CPython 3.9macOS 10.7+ x86-64

minify_html-0.6.2-cp38-none-win_amd64.whl (4.3 MB view details)

Uploaded CPython 3.8Windows x86-64

minify_html-0.6.2-cp38-cp38-manylinux2010_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

minify_html-0.6.2-cp38-cp38-macosx_10_7_x86_64.whl (2.7 MB view details)

Uploaded CPython 3.8macOS 10.7+ x86-64

minify_html-0.6.2-cp37-none-win_amd64.whl (4.3 MB view details)

Uploaded CPython 3.7Windows x86-64

minify_html-0.6.2-cp37-cp37m-manylinux2010_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

minify_html-0.6.2-cp37-cp37m-macosx_10_7_x86_64.whl (2.7 MB view details)

Uploaded CPython 3.7mmacOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: minify_html-0.6.2-cp39-none-win_amd64.whl
  • Upload date:
  • Size: 4.3 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using 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

File hashes

Hashes for minify_html-0.6.2-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 f8a904702991228d73d0c3ffabc29c70b818eadf32abe27fece9546ca2888bce
MD5 156dddd47cb5477a333393b38109cf9c
BLAKE2b-256 cd63b46f27aa0a98269c2eaf218eb68b9ad5ca2f9d0d506a98cbd54d771d3cd3

See more details on using hashes here.

File details

Details for the file minify_html-0.6.2-cp39-cp39-manylinux2010_x86_64.whl.

File metadata

  • Download URL: minify_html-0.6.2-cp39-cp39-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.9, manylinux: glibc 2.12+ x86-64
  • Uploaded using 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

File hashes

Hashes for minify_html-0.6.2-cp39-cp39-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 084379773d01f24f588fd9cf451b12561bf9dab2a2bd9ddd75d547de4c39ff97
MD5 bb990c7f77534aa2ed00d31579f7d235
BLAKE2b-256 c7660561b038341a7772f7c11f91ddda5eaefa699fb1c31d3743b2af99820a39

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.6.2-cp39-cp39-macosx_10_7_x86_64.whl
  • Upload date:
  • Size: 2.7 MB
  • Tags: CPython 3.9, macOS 10.7+ x86-64
  • Uploaded using 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

File hashes

Hashes for minify_html-0.6.2-cp39-cp39-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 f78e20ee73c5c90a108d63c6783317bbe416cd4d683bdb2a6646df09ddc86085
MD5 8157b1c638ba631f236aa4e009893309
BLAKE2b-256 09fc03a7c97a8fb3060bf33ccc28b28bba8697397ae52a69c2e1734e9053a98f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.6.2-cp38-none-win_amd64.whl
  • Upload date:
  • Size: 4.3 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using 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

File hashes

Hashes for minify_html-0.6.2-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 0f73f40560ca28c6a50d6d8ba296aeb915ee5902136fddc26a0d19456c44b817
MD5 916cc3acba566a2eab95a451c5f66ae6
BLAKE2b-256 e805980286cff24eeb6fd2362f3831f943763d7f8627f5448b4c6cda0c84c710

See more details on using hashes here.

File details

Details for the file minify_html-0.6.2-cp38-cp38-manylinux2010_x86_64.whl.

File metadata

  • Download URL: minify_html-0.6.2-cp38-cp38-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.8, manylinux: glibc 2.12+ x86-64
  • Uploaded using 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

File hashes

Hashes for minify_html-0.6.2-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 2e3b4226a41213bd27304a622d34da6c8839f8c1fa13f7ec9d807b3af3105ab7
MD5 16d2b581c888aa6ae4c168dd1c27f4fe
BLAKE2b-256 ca98761a4712e3139e41a93080eca19d90a7b7a7a92889c4a0578b6508c5066b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.6.2-cp38-cp38-macosx_10_7_x86_64.whl
  • Upload date:
  • Size: 2.7 MB
  • Tags: CPython 3.8, macOS 10.7+ x86-64
  • Uploaded using 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

File hashes

Hashes for minify_html-0.6.2-cp38-cp38-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 77b6f4d13c090e0b98edd8ae6f55f7f46f429426d39ea53bb079bb738bc6fcc1
MD5 00d415fe3a79e78b1929a4e45a434154
BLAKE2b-256 affb71067086fb398c112f2d29bbff74637bd4bc4e90f0fd08d26d463ad04a45

See more details on using hashes here.

File details

Details for the file minify_html-0.6.2-cp37-none-win_amd64.whl.

File metadata

  • Download URL: minify_html-0.6.2-cp37-none-win_amd64.whl
  • Upload date:
  • Size: 4.3 MB
  • Tags: CPython 3.7, Windows x86-64
  • Uploaded using 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

File hashes

Hashes for minify_html-0.6.2-cp37-none-win_amd64.whl
Algorithm Hash digest
SHA256 a7f2a2912abfa6228107acbc81754cb909a122507165e526db25284b88aeb89c
MD5 81583f234d45cfe741b45e18f631e1f1
BLAKE2b-256 659d602b310744163e4ae0ad5ee8b78d136ea583c89be84305fd2f57fa9bd92d

See more details on using hashes here.

File details

Details for the file minify_html-0.6.2-cp37-cp37m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: minify_html-0.6.2-cp37-cp37m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.7m, manylinux: glibc 2.12+ x86-64
  • Uploaded using 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

File hashes

Hashes for minify_html-0.6.2-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 2af3586dd5f20ead6e4f6e49cd7e975b2609bd6a1768aab91bdeec902b472a33
MD5 7d4a2df93d4d2df037c0dd8366e30689
BLAKE2b-256 64edaaa045f83d1e085ceaedc281c9ca8303ec0c7a499ad71341b27862bb50cc

See more details on using hashes here.

File details

Details for the file minify_html-0.6.2-cp37-cp37m-macosx_10_7_x86_64.whl.

File metadata

  • Download URL: minify_html-0.6.2-cp37-cp37m-macosx_10_7_x86_64.whl
  • Upload date:
  • Size: 2.7 MB
  • Tags: CPython 3.7m, macOS 10.7+ x86-64
  • Uploaded using 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

File hashes

Hashes for minify_html-0.6.2-cp37-cp37m-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 81107feddceac26092ed5920552a207036977bda02353218ad145a4f498bb767
MD5 e03c5f0346e60686e130acd0aa743d82
BLAKE2b-256 9e03b2eaf312b8331fdd2a576c149f8150551cc0ac85d430cf2c80dace28153b

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