Skip to main content

Fast and smart HTML + JS minifier

Project description

minify-html

An HTML minifier meticulously optimised for both speed and effectiveness, available for Rust, Node.js, Python, Java, and Ruby.

  • Advanced minification strategy beats other minifiers with only one pass.
  • Uses zero memory allocations, SIMD searching, direct tries, and lookup tables.
  • Well tested with a large test suite and extensive fuzzing.
  • Natively binds to esbuild for super fast JS minification.

Performance

Comparison with html-minfier and minimize, run on the top web pages. See the breakdown here.

Chart showing speed of HTML minifiers Chart showing effectiveness of HTML minifiers

Usage

CLI

Precompiled binaries are available for x86-64 Linux, macOS, and Windows.

Get

Linux | macOS | Windows

Use

Use the --help argument for more details.

minify-html --src /path/to/src.html --out /path/to/output.min.html

API

Rust
Get
[dependencies]
minify-html = { version = "0.3.8", features = ["js-esbuild"] }

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

If the js-esbuild feature is not enabled, cfg.minify_js 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, macOS, Windows; 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");

const cfg = minifyHtml.createConfiguration({ minifyJs: false });
const minified = minifyHtml.minify("<p>  Hello, world!  </p>", cfg);

// Alternatively, minify in place to avoid copying.
const source = Buffer.from("<p>  Hello, world!  </p>");
// This is a Buffer representing a slice of `source`, not newly allocated memory.
const minified = minifyHtml.minifyInPlace(source, cfg);

minify-html is also available for TypeScript:

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

const cfg = minifyHtml.createConfiguration({ minifyJs: false });
const minified = minifyHtml.minify("<p>  Hello, world!  </p>", cfg);
// Or alternatively:
const minified = minifyHtml.minifyInPlace(fs.readFileSync("source.html"), cfg);
Java
Get

Add as a Maven dependency:

<dependency>
  <groupId>in.wilsonl.minifyhtml</groupId>
  <artifactId>minify-html</artifactId>
  <version>0.3.8</version>
</dependency>
Use
import in.wilsonl.minifyhtml.Configuration;
import in.wilsonl.minifyhtml.MinifyHtml;
import in.wilsonl.minifyhtml.SyntaxException;

Configuration cfg = new Configuration.Builder()
    .setMinifyJs(false)
    .build();

try {
    String minified = MinifyHtml.minify("<p>  Hello, world!  </p>", cfg);
} catch (SyntaxException e) {
    System.err.println(e.getMessage());
}

// Alternatively, minify in place:
assert source instanceof ByteBuffer && source.isDirect();
MinifyHtml.minifyInPlace(source, cfg);
Python
  • Package: minify-html
  • Binding: PyO3
  • Platforms: Linux, macOS, Windows; Python 3.5 and higher
Get

Add the PyPI project as a dependency and install it using pip or pipenv.

Use
import minify_html

try:
    minified = minify_html.minify("<p>  Hello, world!  </p>", minify_js=False)
except SyntaxError as e:
    print(e)
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>", { :minify_js => false })

Minification

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 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), > last character (if applicable), and any whitespace encoded.

class and d attributes have their whitespace (after any decoding) trimmed and collapsed.

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 if possible.

Entities

Entities are decoded if they're valid and shorter or equal in length when decoded.

Numeric entities that do not refer to a valid Unicode Scalar Value are replaced with the replacement character.

If an entity is unintentionally formed after decoding, the leading ampersand is encoded, e.g. &&#97;&#109;&#112;; becomes &ampamp;. This is done as &amp is equal to or shorter than all other entity representations of characters part of an entity ([&#a-zA-Z0-9;]), and there is no other conflicting entity name that starts with amp.

It's possible to get an unintentional entity after removing comments, e.g. &am<!-- -->p.

Left chevrons after any decoding in text are encoded to &LT if possible or &LT; otherwise.

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

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.3.8-cp38-none-win_amd64.whl (3.4 MB view details)

Uploaded CPython 3.8Windows x86-64

minify_html-0.3.8-cp38-cp38-manylinux1_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.8

minify_html-0.3.8-cp38-cp38-macosx_10_7_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.8macOS 10.7+ x86-64

minify_html-0.3.8-cp37-none-win_amd64.whl (3.4 MB view details)

Uploaded CPython 3.7Windows x86-64

minify_html-0.3.8-cp37-cp37m-manylinux1_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.7m

minify_html-0.3.8-cp37-cp37m-macosx_10_7_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.7mmacOS 10.7+ x86-64

minify_html-0.3.8-cp36-none-win_amd64.whl (3.4 MB view details)

Uploaded CPython 3.6Windows x86-64

minify_html-0.3.8-cp36-cp36m-manylinux1_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.6m

minify_html-0.3.8-cp36-cp36m-macosx_10_7_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.6mmacOS 10.7+ x86-64

minify_html-0.3.8-cp35-none-win_amd64.whl (3.4 MB view details)

Uploaded CPython 3.5Windows x86-64

minify_html-0.3.8-cp35-cp35m-manylinux1_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.5m

minify_html-0.3.8-cp35-cp35m-macosx_10_7_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.5mmacOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: minify_html-0.3.8-cp38-none-win_amd64.whl
  • Upload date:
  • Size: 3.4 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.0.3 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

File hashes

Hashes for minify_html-0.3.8-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 a1a58d3952f26a435b301a8a65fbcf7882e51c0a12fe9a7e99497f9655ec17c6
MD5 05f42e8bcbffb2b537a0845b7f078fc1
BLAKE2b-256 be1b541cc7064f03f01232b5bb7a4a30a279315e9b09356a4003214e035b8499

See more details on using hashes here.

File details

Details for the file minify_html-0.3.8-cp38-cp38-manylinux1_x86_64.whl.

File metadata

  • Download URL: minify_html-0.3.8-cp38-cp38-manylinux1_x86_64.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.0.3 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

File hashes

Hashes for minify_html-0.3.8-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 4e37b10fa56aba3e8be49de0458949650ad7828e30cab4fb5accbb7958ea8b34
MD5 1d83fef606c8c2575bb103a5c8e92fee
BLAKE2b-256 fa67679f48d206c11dcc2d7d8a86bf0bed08fcfe69fcb234c8f80dbb18efaaf8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.3.8-cp38-cp38-macosx_10_7_x86_64.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.8, macOS 10.7+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.0.3 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

File hashes

Hashes for minify_html-0.3.8-cp38-cp38-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 a225c9f78127a8b7c5e1d12e3e8d7ace1b5dd0d09787175fe94f86e05a258b98
MD5 a4ad097bf80b0c4da2b75062bc74f204
BLAKE2b-256 759f6abeecfdf198a24bf15622acea3eea8005ce901bc84c405ff1ff168723ea

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.3.8-cp37-none-win_amd64.whl
  • Upload date:
  • Size: 3.4 MB
  • Tags: CPython 3.7, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.0.3 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.7.9

File hashes

Hashes for minify_html-0.3.8-cp37-none-win_amd64.whl
Algorithm Hash digest
SHA256 d3f747051fddd4f5bdb1a75d036ba10524890558ab1c3ac4ac34699cd6f2b53b
MD5 8826bd3e341f35dfb76ef76876e250c1
BLAKE2b-256 106fbc1e708e50f7f2349b753077b317da8df6e97ad7681ac7a6c25e7ec95bf3

See more details on using hashes here.

File details

Details for the file minify_html-0.3.8-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

  • Download URL: minify_html-0.3.8-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.0.3 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.7.9

File hashes

Hashes for minify_html-0.3.8-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c2a4323433f4452d1178482cfd7fe228c59b2dde241f798e68e4157faf3406d9
MD5 596b6656b06c37fe3de4233f5c2ef772
BLAKE2b-256 784d013dcefaf09b918d8e980c44f6cb8370b4b16b9b45b5bf4f5f87fdd4bfa3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.3.8-cp37-cp37m-macosx_10_7_x86_64.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.7m, macOS 10.7+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.0.3 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.7.9

File hashes

Hashes for minify_html-0.3.8-cp37-cp37m-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 4fc14185a7b25a627b4c911b15b638e0f7d9add187a9f6226d1ef77e24b5b5d2
MD5 6871bf1616548ce2e1c3f45d97f18620
BLAKE2b-256 8430e1754eaced4ec82a402a002ef8c30e7d6beaefce9f547bec637ecbd1890f

See more details on using hashes here.

File details

Details for the file minify_html-0.3.8-cp36-none-win_amd64.whl.

File metadata

  • Download URL: minify_html-0.3.8-cp36-none-win_amd64.whl
  • Upload date:
  • Size: 3.4 MB
  • Tags: CPython 3.6, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.0.3 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.6.8

File hashes

Hashes for minify_html-0.3.8-cp36-none-win_amd64.whl
Algorithm Hash digest
SHA256 cb30eb6f6f71485380442d675c907fc65497f400c078e3218463d96048a22778
MD5 244696c327f1b66621a54d86407da058
BLAKE2b-256 6a8ced73f02b2fb1fd606287da4da00f6155f66f359678bfd2a02addb9f87384

See more details on using hashes here.

File details

Details for the file minify_html-0.3.8-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

  • Download URL: minify_html-0.3.8-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.0.3 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.6.12

File hashes

Hashes for minify_html-0.3.8-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 1ae2028612493b320a35e9c90614975d081638356b6812b56ad874b15c2ffbd1
MD5 e795df9a72532a77fae9a144fa4b8a8c
BLAKE2b-256 b9a9344bdeff7b0f7f9a5dcb69aac901ecda17db18be1b16cdd9f581c4cf59f4

See more details on using hashes here.

File details

Details for the file minify_html-0.3.8-cp36-cp36m-macosx_10_7_x86_64.whl.

File metadata

  • Download URL: minify_html-0.3.8-cp36-cp36m-macosx_10_7_x86_64.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.6m, macOS 10.7+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.0.3 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.6.12

File hashes

Hashes for minify_html-0.3.8-cp36-cp36m-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 84e179d85506b5451334de308959a9b21fb53a2b0bc2e14807a4b0ab243c61fd
MD5 41abb2f47cedd386d2aac80c2dfd980c
BLAKE2b-256 0c73a84419bc7e8e10051d9f33a3cc6ab266ecdd1386c29577a80ad8565917cf

See more details on using hashes here.

File details

Details for the file minify_html-0.3.8-cp35-none-win_amd64.whl.

File metadata

  • Download URL: minify_html-0.3.8-cp35-none-win_amd64.whl
  • Upload date:
  • Size: 3.4 MB
  • Tags: CPython 3.5, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.0.3 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.5.4

File hashes

Hashes for minify_html-0.3.8-cp35-none-win_amd64.whl
Algorithm Hash digest
SHA256 9de1623f695016278740eee83fe4317e1a1ed88e2f012b678341383d00984eab
MD5 4c4a68660e71f3732da1a56aa6ba69ca
BLAKE2b-256 de407a0eb52807e1d45bb7a3fed1f01595ee66c9ae0fd87352509a59989722ea

See more details on using hashes here.

File details

Details for the file minify_html-0.3.8-cp35-cp35m-manylinux1_x86_64.whl.

File metadata

  • Download URL: minify_html-0.3.8-cp35-cp35m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: CPython 3.5m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.0.3 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.5.9

File hashes

Hashes for minify_html-0.3.8-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d130996b6b3d0d70d8cc55aea163268951104029374036aed888ffcf7880ec51
MD5 51b87fc202e598f3c7268d3bde60ce6e
BLAKE2b-256 3253ba2270b33f19831fa31b4a8670680a82da7d899c459c1068ea61b6521815

See more details on using hashes here.

File details

Details for the file minify_html-0.3.8-cp35-cp35m-macosx_10_7_x86_64.whl.

File metadata

  • Download URL: minify_html-0.3.8-cp35-cp35m-macosx_10_7_x86_64.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.5m, macOS 10.7+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.0.3 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.5.9

File hashes

Hashes for minify_html-0.3.8-cp35-cp35m-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 39b8222bc4a844795ee43fd59dbc52e52c8eb8e2ca2e20a1a80f98511e5ac1de
MD5 29f336e33c5aa290744a45b61c8d7e2a
BLAKE2b-256 81cc8513a1e122cd9ea5e21fab8f651d8fb8f6dfd50b69873d494756b4f180e8

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