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 | 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.10.1"

Use

Check out the docs for API and usage examples.

Deno

Use

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

Get

Add as a Maven dependency:

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


Release history Release notifications | RSS feed

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.10.1-cp310-none-win_amd64.whl (555.4 kB view details)

Uploaded CPython 3.10Windows x86-64

minify_html-0.10.1-cp310-cp310-manylinux_2_28_aarch64.whl (638.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

minify_html-0.10.1-cp310-cp310-manylinux_2_27_x86_64.whl (704.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64

minify_html-0.10.1-cp310-cp310-macosx_10_7_x86_64.whl (593.9 kB view details)

Uploaded CPython 3.10macOS 10.7+ x86-64

minify_html-0.10.1-cp39-none-win_amd64.whl (555.4 kB view details)

Uploaded CPython 3.9Windows x86-64

minify_html-0.10.1-cp39-cp39-manylinux_2_28_aarch64.whl (638.3 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ ARM64

minify_html-0.10.1-cp39-cp39-manylinux_2_27_x86_64.whl (704.9 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64

minify_html-0.10.1-cp39-cp39-macosx_10_7_x86_64.whl (593.9 kB view details)

Uploaded CPython 3.9macOS 10.7+ x86-64

minify_html-0.10.1-cp38-none-win_amd64.whl (555.6 kB view details)

Uploaded CPython 3.8Windows x86-64

minify_html-0.10.1-cp38-cp38-manylinux_2_28_aarch64.whl (638.8 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.28+ ARM64

minify_html-0.10.1-cp38-cp38-manylinux_2_27_x86_64.whl (705.2 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.27+ x86-64

minify_html-0.10.1-cp38-cp38-macosx_10_7_x86_64.whl (594.1 kB view details)

Uploaded CPython 3.8macOS 10.7+ x86-64

File details

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

File metadata

File hashes

Hashes for minify_html-0.10.1-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 82b089119140b4899ad8634d5cf914a1c79bd719735697bb8a3e9a8d7cfce8cb
MD5 a3cff82c47195eb87ab6c0794a26e83f
BLAKE2b-256 026f042a6aacd87494301294de98ac84f21595e95c9681db4458a01caaabfd7e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.10.1-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3f76bbf9702f0f0981d8e5497f3495f1423c3a27695c80c11f23c655f9e6cd9f
MD5 b759d23913b241ca1bfc985045922b63
BLAKE2b-256 6154cfaaed51ebe111fe5ac2bfc5ad7ba2e44e7915c311bd68ea2e4e4344939b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.10.1-cp310-cp310-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 45b3a0c4dde24f49fdb604a6dc23d63a24b2da97b969b021a0d537a759eca6f7
MD5 1de61ea8aa1e5290ac6b72921f9b731a
BLAKE2b-256 ccb962ba42310a2c409647b577de435e59f84af0841dd62f9cd54b1d897edc47

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.10.1-cp310-cp310-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 c5e6e566b7c1078e5977ac79c4638935b5f9a090c8187a72ec4910e692007cf0
MD5 9b66bb3a1f223c42fd9f44fd87e9cc45
BLAKE2b-256 94a587ed8ab825c1b2caf6fa4ce742687c0ef81fe523b2276d932eec4f44b952

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.10.1-cp39-none-win_amd64.whl
  • Upload date:
  • Size: 555.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.10.1-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 4cf17ca7711b98ceb775a8021a67d5c7c1dd2b774db837fa5d12b34d9e7654a3
MD5 8c3f610826df76507ff61d93c9e66bbc
BLAKE2b-256 0d0fdfbfe0d9771e7f03ffb68361ac08bedeceafd47afef10afc05361d40b4dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.10.1-cp39-cp39-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a04bbd8756ca08b30e28e79901ad3fd2e71269d1db9308fc32da2c1f3942ed0c
MD5 a5b282fb8abcf1aa3ee45f027af0e383
BLAKE2b-256 967158670e29121f7747354eb70f4d3bc07e3a9e3a6fbc69ab3d1d603be7807c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.10.1-cp39-cp39-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 7f80d158b74b90695e8ca5d46aca989f65b32512d8b4dc20c3aed57987284530
MD5 4caf891ed9015856fab92e6c39dbe7ac
BLAKE2b-256 57f1c560f8d2b88e6530c09d0f6706a561610ca85e685736d963b26bbbe75625

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.10.1-cp39-cp39-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 4069f1392eff7958c5cb9a416d5c82e8d09daeaa91bcfbc2aff14adfb63404d9
MD5 6b6155e97b3f89b7415f7826ad634b40
BLAKE2b-256 70e5c985d6a819c3c533c0fcbb3b6361618b9d3dd101db6b80c32744160084c8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minify_html-0.10.1-cp38-none-win_amd64.whl
  • Upload date:
  • Size: 555.6 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.10.1-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 dc4232b3eb18d776e78278c31b2c04dd66b81d96b38c84424c7133e4994ae603
MD5 25b909a38cdc376212d6eecfc10b3c9f
BLAKE2b-256 973ce22a80ea11cdf38cd8a070683cda1ac980d731f07062d8e2268abf6bc42d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.10.1-cp38-cp38-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 dcbc326df036ce6726fd85c9da695fd8a555187554790b9db7bb44e9c63d9ff0
MD5 5fefdd9e142c96e0628c4e10d3a81b44
BLAKE2b-256 f49398b25c30ecebf229671c599980cc2c17824399d388a7f2449e3a438ac65d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.10.1-cp38-cp38-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 e031b1570728230825af24fecbd986e22abf5ca17cb2c0af8581b4a56791ee4c
MD5 a20a917ffcadef949cd0d2fe268ec53d
BLAKE2b-256 294308310c3213d0c6a121a3728f7e143d8e6c4f91d3036a3dec7e9d9bd7760b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minify_html-0.10.1-cp38-cp38-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 41811bcf1a0059e7d3bb6f1c8aea3356ac28db9c15953f7eb308a5d3787c93b9
MD5 7f3bb81ba848e064cfe3e3c9ac37ec52
BLAKE2b-256 72e3f7f4bdb0d66e410d5fdd22c8ed6d96d2ad89b053fd9b6e00d511a0a3b2af

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