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.5", 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.5</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


Release history Release notifications | RSS feed

This version

0.6.5

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

Uploaded CPython 3.9Windows x86-64

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

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64

minify_html-0.6.5-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.5-cp38-none-win_amd64.whl (4.3 MB view details)

Uploaded CPython 3.8Windows x86-64

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

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

minify_html-0.6.5-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.5-cp37-none-win_amd64.whl (4.3 MB view details)

Uploaded CPython 3.7Windows x86-64

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

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

minify_html-0.6.5-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.5-cp39-none-win_amd64.whl.

File metadata

  • Download URL: minify_html-0.6.5-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.5-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 a5bd94f91fde1776e8a7f341ad15639ebd2d27a1604c6901491b19f186037993
MD5 e5f79dacfc50fbf3ce6e8d5bf81903fa
BLAKE2b-256 9638ea6e2d63ed11c1c8df16073abfdf7642f25041aa3eca60bfb3633921dd20

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.6.5-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.5-cp39-cp39-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 5dfe7530d7a164e12ff69fd250970466a519feb3b73e19860dfe9eda031f01fb
MD5 43b601cf6ea1724347fd75c8cfc2352f
BLAKE2b-256 c55628edcfeb4c16ede54358870244fa2cf067528a43733b509e31f80841332b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.6.5-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.5-cp39-cp39-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 fe23bd8762fbf5837886af2936d63bc10c4588276945f161d755c75878cd752c
MD5 3502e679fbbe3b4c33a5ba1368a4f1e8
BLAKE2b-256 35d8e6356a7ee9f43dc821cac3a9411d02a1fc1be3089cdf93a8b5459c88e632

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.6.5-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.5-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 420c26667b5d1a830badaf43f23812b1119929a5c695628610d1084637161981
MD5 b07526776244a34f9a4a3252504ce2d6
BLAKE2b-256 4093fbde0f7c68f324622932dc5f471f96941b76b70507b05c97ade605786cbb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.6.5-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.5-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 2eb78d8ff1bf323df7910e2af80374b574921c7c297c6be70b2953e523b8defc
MD5 34818289a2c2794b2ac6b9c243523fe6
BLAKE2b-256 5619d1a78605b8fd8d53b8cc4f2760424f08c846b1794551bf7b0666ca447857

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.6.5-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.5-cp38-cp38-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 deedf38a45f5c799a6037a57b852e51e0b7e37e0e698e24507aebcc4fc1cf23a
MD5 fafaebf7b401cec742daecbc4990e4bd
BLAKE2b-256 80b97959a42d9ea7788063945a35471402ffc52e209d3133d1277438d668f171

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.6.5-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.5-cp37-none-win_amd64.whl
Algorithm Hash digest
SHA256 adcbb41053513f9e642c994b3b2a21dd35791fea09be7df5f9125a800336cc84
MD5 fe1f3d8b1f0d84ff9022a583a15ce1bd
BLAKE2b-256 54ae90ee9f0290bcdb06bb229b7d783a57a9a3d184ba71b582b3395dc8a798f5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.6.5-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.5-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 f3bc6a3441fd6f8457251cf394d00e095480ed58c987d3a5b68bc47d71df0326
MD5 2d534dfde729d66e9b3cf9b3b01a441f
BLAKE2b-256 8589f26a36372dcb1daeb0db817e4983361cca11186458e96d46c762e733143c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.6.5-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.5-cp37-cp37m-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 63b28fc55cb6878f23757272c8de98ec32577e49412d50a9fd3558e5af0e0b7e
MD5 011f06c73d4c856d1f8c8e69ae7f315a
BLAKE2b-256 46ce31281f97119956bab9eef831cf698b2ff2f27f8e619d1ec95be977d3ef08

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