Skip to content

Super-configurable, well-tested, JavaScript-based HTML minifier (enhanced successor of HTML Minifier)

License

Notifications You must be signed in to change notification settings

j9t/html-minifier-next

Repository files navigation

HTML Minifier Next

npm version Build status Socket

HTML Minifier Next (HMN) is a super-configurable, well-tested, JavaScript-based HTML minifier.

The project was based on HTML Minifier Terser, which in turn had been based on Juriy “kangax” Zaytsev’s HTML Minifier. HMN offers additional features, but is backwards-compatible with both. The project was set up because as of 2025, both HTML Minifier Terser and HTML Minifier had been unmaintained for a few years. As the project seems maintainable [to me, Jens, an HTML optimizer]—even more so with community support—, it’s being updated, extended, and documented further in this place.

Installation

From npm for use as a command line app:

npm i -g html-minifier-next

Directly with npx (no installation required):

npx html-minifier-next --help

From npm for programmatic use:

npm i html-minifier-next

General usage

CLI

Use html-minifier-next --help to check all available options:

Option Description Example
--input-dir <dir> Specify an input directory (best restricted with --file-ext) --input-dir=src
--ignore-dir <patterns> Exclude directories—relative to input directory—from processing (comma-separated, overrides config file setting) --ignore-dir=libs, --ignore-dir=libs,vendor,node_modules
--output-dir <dir> Specify an output directory --output-dir=dist
--file-ext <extensions> Specify file extension(s) to process (comma-separated, overrides config file setting) --file-ext=html, --file-ext=html,htm,php, --file-ext="html, htm, php"
-o <file>, --output <file> Specify output file (reads from file arguments or STDIN) File to file: html-minifier-next input.html -o output.html
Pipe to file: cat input.html | html-minifier-next -o output.html
File to STDOUT: html-minifier-next input.html
-c <file>, --config-file <file> Use a configuration file --config-file=html-minifier.json
--preset <name> Use a preset configuration (conservative or comprehensive) --preset=conservative
-v, --verbose Show detailed processing information (active options, file statistics) html-minifier-next --input-dir=src --output-dir=dist --verbose --collapse-whitespace
-d, --dry Dry run: Process and report statistics without writing output html-minifier-next input.html --dry --collapse-whitespace
-V, --version Output the version number html-minifier-next --version

Configuration file

You can also use a configuration file to specify options. The file can be either JSON format or a JavaScript module that exports the configuration object:

JSON configuration example:

{
  "collapseWhitespace": true,
  "removeComments": true,
  "fileExt": "html,htm",
  "ignoreDir": "libs,vendor"
}

JavaScript module configuration example:

module.exports = {
  collapseWhitespace: true,
  removeComments: true,
  fileExt: "html,htm",
  ignoreDir: ["libs", "vendor"]
};

Using a configuration file:

# Specify config file
html-minifier-next --config-file=html-minifier.json --input-dir=src --output-dir=dist

# CLI arguments override config file settings
html-minifier-next --config-file=html-minifier.json --file-ext=xml --input-dir=src --output-dir=dist

Node.js

ESM with Node.js ≥16.14:

import { minify } from 'html-minifier-next';

const result = await minify('<p title="blah" id="moo">foo</p>', {
  removeAttributeQuotes: true,
});
console.log(result); // “<p title=blah id=moo>foo</p>”

CommonJS:

const { minify } = require('html-minifier-next');

(async () => {
  const result = await minify('<p title="blah" id="moo">foo</p>', {
    removeAttributeQuotes: true,
  });
  console.log(result);
})();

See the original blog post for details of how it works, description of each option, testing results, and conclusions.

For lint-like capabilities, take a look at HTMLLint.

Presets

HTML Minifier Next provides presets for common use cases. Presets are pre-configured option sets that can be used as a starting point:

  • conservative: Safe minification suitable for most projects. Includes whitespace collapsing, comment removal, and doctype normalization.
  • comprehensive: Aggressive minification for maximum file size reduction. Includes relevant conservative options plus attribute quote removal, optional tag removal, and more.

To review the specific options set, presets.js lists them in an accessible manner.

Using presets:

# Via CLI flag
html-minifier-next --preset conservative input.html

# Via config file
html-minifier-next --config-file=html-minifier.json input.html
# where html-minifier.json contains: { "preset": "conservative" }

# Override preset options
html-minifier-next --preset conservative --remove-empty-attributes input.html

Priority order: Presets are applied first, then config file options, then CLI flags. This allows you to start with a preset and customize as needed.

Options quick reference

Most of the options are disabled by default. Experiment and find what works best for you and your project.

Options can be used in config files (camelCase) or via CLI flags (kebab-case with -- prefix). Options that default to true use --no- prefix in CLI to disable them.

Option (config/CLI) Description Default
caseSensitive
--case-sensitive
Treat attributes in case-sensitive manner (useful for custom HTML elements) false
collapseAttributeWhitespace
--collapse-attribute-whitespace
Trim and collapse whitespace characters within attribute values false
collapseBooleanAttributes
--collapse-boolean-attributes
Omit attribute values from boolean attributes false
collapseInlineTagWhitespace
--collapse-inline-tag-whitespace
Don’t leave any spaces between display: inline; elements when collapsing—use with collapseWhitespace: true false
collapseWhitespace
--collapse-whitespace
Collapse whitespace that contributes to text nodes in a document tree false
conservativeCollapse
--conservative-collapse
Always collapse to one space (never remove it entirely)—use with collapseWhitespace: true false
continueOnMinifyError
--no-continue-on-minify-error
Continue on minification errors; when false, minification errors throw and abort processing true
continueOnParseError
--continue-on-parse-error
Handle parse errors instead of aborting false
customAttrAssign
--custom-attr-assign
Arrays of regexes that allow to support custom attribute assign expressions (e.g., <div flex?="{{mode != cover}}"></div>) []
customAttrCollapse
--custom-attr-collapse
Regex that specifies custom attribute to strip newlines from (e.g., /ng-class/)
customAttrSurround
--custom-attr-surround
Arrays of regexes that allow to support custom attribute surround expressions (e.g., <input {{#if value}}checked="checked"{{/if}}>) []
customEventAttributes
--custom-event-attributes
Arrays of regexes that allow to support custom event attributes for minifyJS (e.g., ng-click) [ /^on[a-z]{3,}$/ ]
customFragmentQuantifierLimit
--custom-fragment-quantifier-limit
Set maximum quantifier limit for custom fragments to prevent ReDoS attacks 200
decodeEntities
--decode-entities
Use direct Unicode characters whenever possible false
html5
--no-html5
Parse input according to the HTML specification; when false, enforces legacy inline/block nesting rules that may restructure modern HTML true
ignoreCustomComments
--ignore-custom-comments
Array of regexes that allow to ignore certain comments, when matched [ /^!/, /^\s*#/ ]
ignoreCustomFragments
--ignore-custom-fragments
Array of regexes that allow to ignore certain fragments, when matched (e.g., <?php … ?>, {{ … }}, etc.) [ /<%[\s\S]*?%>/, /<\?[\s\S]*?\?>/ ]
includeAutoGeneratedTags
--no-include-auto-generated-tags
Insert elements generated by HTML parser; when false, omits auto-generated tags true
inlineCustomElements
--inline-custom-elements
Array of names of custom elements which are inline []
keepClosingSlash
--keep-closing-slash
Keep the trailing slash on void elements false
maxInputLength
--max-input-length
Maximum input length to prevent ReDoS attacks (disabled by default) undefined
maxLineLength
--max-line-length
Specify a maximum line length; compressed output will be split by newlines at valid HTML split-points
minifyCSS
--minify-css
Minify CSS in style elements and style attributes (uses Lightning CSS) false (could be true, Object, Function(text, type))
minifyJS
--minify-js
Minify JavaScript in script elements and event attributes (uses Terser or SWC) false (could be true, Object, Function(text, inline))
minifySVG
--minify-svg
Minify SVG elements and attributes (numeric precision, default attributes, colors) false (could be true, Object)
minifyURLs
--minify-urls
Minify URLs in various attributes (uses relateurl) false (could be String, Object, Function(text), async Function(text))
noNewlinesBeforeTagClose
--no-newlines-before-tag-close
Never add a newline before a tag that closes an element false
partialMarkup
--partial-markup
Treat input as a partial HTML fragment, preserving stray end tags (closing tags without opening tags) and preventing auto-closing of unclosed tags at end of input false
preserveLineBreaks
--preserve-line-breaks
Always collapse to one line break (never remove it entirely) when whitespace between tags includes a line break—use with collapseWhitespace: true false
preventAttributesEscaping
--prevent-attributes-escaping
Prevents the escaping of the values of attributes false
processConditionalComments
--process-conditional-comments
Process contents of conditional comments through minifier false
processScripts
--process-scripts
Array of strings corresponding to types of script elements to process through minifier (e.g., text/ng-template, text/x-handlebars-template, etc.) []
quoteCharacter
--quote-character
Type of quote to use for attribute values (' or ") Auto-detected (uses the quote requiring less escaping; defaults to " when equal)
removeAttributeQuotes
--remove-attribute-quotes
Remove quotes around attributes when possible false
removeComments
--remove-comments
Strip HTML comments false
removeEmptyAttributes
--remove-empty-attributes
Remove all attributes with whitespace-only values false (could be true, Function(attrName, tag))
removeEmptyElements
--remove-empty-elements
Remove all elements with empty contents false
removeEmptyElementsExcept
--remove-empty-elements-except
Array of elements to preserve when removeEmptyElements is enabled; accepts simple tag names (e.g., ["td"]) or HTML-like markup with attributes (e.g., ["<span aria-hidden='true'>"]); supports double quotes, single quotes, and unquoted attribute values []
removeOptionalTags
--remove-optional-tags
Remove optional tags false
removeRedundantAttributes
--remove-redundant-attributes
Remove attributes when value matches default false
removeScriptTypeAttributes
--remove-script-type-attributes
Remove type="text/javascript" from script elements; other type attribute values are left intact false
removeStyleLinkTypeAttributes
--remove-style-link-type-attributes
Remove type="text/css" from style and link elements; other type attribute values are left intact false
removeTagWhitespace
--remove-tag-whitespace
Remove space between attributes whenever possible; note that this will result in invalid HTML false
sortAttributes
--sort-attributes
Sort attributes by frequency false
sortClassName
--sort-class-name
Sort style classes by frequency false
trimCustomFragments
--trim-custom-fragments
Trim whitespace around ignoreCustomFragments false
useShortDoctype
--use-short-doctype
Replaces the doctype with the short (HTML) doctype false

Sorting attributes and style classes

Minifier options like sortAttributes and sortClassName won’t impact the plain‑text size of the output. However, using these options for more consistent ordering improves the compression ratio for gzip and Brotli used over HTTP.

CSS minification

When minifyCSS is set to true, HTML Minifier Next uses Lightning CSS to minify CSS in <style> elements and style attributes. Lightning CSS provides excellent minification by default.

You can pass Lightning CSS configuration options by providing an object:

const result = await minify(html, {
  minifyCSS: {
    targets: {
      // Browser targets for vendor prefix handling
      chrome: 95,
      firefox: 90,
      safari: 14
    },
    unusedSymbols: ['unused-class', 'old-animation']
  }
});

Available Lightning CSS options when passed as an object:

  • targets: Browser targets for vendor prefix optimization (e.g., { chrome: 95, firefox: 90 }).
  • unusedSymbols: Array of class names, IDs, keyframe names, and CSS variables to remove.
  • errorRecovery: Boolean to skip invalid rules instead of throwing errors. This is disabled by default in Lightning CSS, but enabled in HMN when the continueOnMinifyError option is set to true (the default). Explicitly setting errorRecovery in minifyCSS options will override this automatic behavior.
  • sourceMap: Boolean to generate source maps.

For advanced usage, you can also pass a function:

const result = await minify(html, {
  minifyCSS: function(text, type) {
    // `text`: CSS string to minify
    // `type`: `inline` for style attributes, `media` for media queries, `undefined` for `<style>` elements
    return yourCustomMinifier(text);
  }
});

JavaScript minification

When minifyJS is set to true, HTML Minifier Next uses Terser by default to minify JavaScript in <script> elements and event attributes.

You can choose between different JS minifiers using the engine field:

const result = await minify(html, {
  minifyJS: {
    engine: 'swc', // Use SWC for faster minification
    // SWC-specific options here
  }
});

Available engines:

  • terser (default): The standard JavaScript minifier with excellent compression
  • swc: Rust-based minifier that’s significantly faster than Terser (requires separate installation)

To use SWC, install it as a dependency:

npm i @swc/core

(Build-only users may want to install it as a dev dependency: npm i -D @swc/core.)

Important: Inline event handlers (e.g., onclick="return false") always use Terser regardless of the engine setting, as SWC doesn’t support bare return statements. This is handled automatically—you don’t need to do anything special.

You can pass engine-specific configuration options:

// Using Terser with custom options
const result = await minify(html, {
  minifyJS: {
    compress: {
      drop_console: true  // Remove console.log statements
    }
  }
});

// Using SWC for faster minification
const result = await minify(html, {
  minifyJS: {
    engine: 'swc'
  }
});

For advanced usage, you can also pass a function:

const result = await minify(html, {
  minifyJS: function(text, inline) {
    // `text`: JavaScript string to minify
    // `inline`: `true` for event handlers (e.g., `onclick`), `false` for `<script>` elements
    return yourCustomMinifier(text);
  }
});

SVG minification

When minifySVG is set to true, HTML Minifier Next applies SVG-specific optimizations to SVG elements and their attributes. These optimizations are lightweight, fast, and safe:

const result = await minify(html, {
  minifySVG: true // Enable with default settings
});

What gets optimized:

  1. Numeric precision reduction: Coordinates and path data are rounded to 3 decimal places by default

    • <path d="M 0.00000000 0.00000000"/><path d="M 0 0"/>
    • <circle cx="10.500000" cy="20.300000" r="5.000"/><circle cx="10.5" cy="20.3" r="5"/>
  2. Whitespace removal: Excess whitespace in numeric attribute values is removed

    • transform="translate( 10 , 20 )"transform="translate(10,20)"
    • points="100, 10 40, 198"points="100,10 40,198"
  3. Color minification: Hex colors are shortened and RGB values converted to hex

    • fill="#000000"fill="#000"
    • fill="rgb(255,255,255)"fill="#fff"
  4. Default attribute removal: Well-documented SVG default attributes are removed

    • fill-opacity="1" → removed
    • stroke-linecap="butt" → removed

You can customize the optimization behavior by providing an options object:

const result = await minify(html, {
  minifySVG: {
    precision: 2,           // Use 2 decimal places instead of 3
    removeDefaults: true,   // Remove default attributes (default: true)
    minifyColors: true      // Minify color values (default: true)
  }
});

Available options:

  • precision: Number of decimal places for coordinates and path data (default: 3)
  • removeDefaults: Remove attributes with default values (default: true)
  • minifyColors: Minify color values with hex shortening and RGB-to-hex conversion (default: true)

Important:

  • SVG minification only applies within <svg> elements
  • Case sensitivity and self-closing slashes are automatically preserved in SVG (regardless of global settings)
  • For maximum compression, use minifySVG together with collapseWhitespace and other options
  • This is a lightweight, built-in implementation; for more aggressive SVG optimization, consider using SVGO as a separate build step

Minification comparison

How does HTML Minifier Next compare to other minifiers? (All minification with the most aggressive settings—though without hyper-optimization—and against a wide range of pages.)

Site Original Size (KB) HTML Minifier Next (config)
npm last update
htmlnano
npm last update
@swc/html
npm last update
minify-html
npm last update
minimize
npm last update
html­com­pressor.­com
A List Apart 59 50 51 52 51 54 52
Apple 211 176 187 189 190 191 192
BBC 712 649 669 669 671 707 n/a
CERN 152 83 91 91 91 93 96
CSS-Tricks 162 119 127 143 143 148 144
ECMAScript 7250 6401 6573 6455 6578 6626 n/a
EDRi 80 59 70 70 71 75 73
EFF 54 45 49 47 48 49 49
European Alternatives 48 30 32 32 32 32 32
FAZ 1576 1466 1412 1500 1511 1522 n/a
French Tech 153 122 126 126 126 132 127
Frontend Dogma 225 217 238 223 225 244 225
Google 18 16 17 17 17 18 18
Ground News 2374 2094 2186 2211 2213 2361 n/a
HTML Living Standard 149 148 153 147 149 155 149
Igalia 50 33 36 36 36 37 37
Mastodon 37 28 32 35 35 36 36
MDN 109 62 64 65 65 68 68
Middle East Eye 223 197 203 201 201 202 203
Mistral AI 361 319 324 326 327 357 n/a
Mozilla 45 31 34 34 34 35 35
Nielsen Norman Group 86 68 55 74 75 77 76
SitePoint 482 351 422 456 460 478 n/a
Startup-Verband 42 29 30 30 30 31 30
TetraLogical 44 38 35 38 39 39 39
TPGi 174 158 159 163 165 171 171
United Nations 152 112 121 125 125 130 123
Vivaldi 92 74 n/a 79 81 83 81
W3C 51 36 39 38 38 41 39
Average processing time 96 ms (29/29) 160 ms (28/29) 52 ms (29/29) 14 ms (29/29) 282 ms (29/29) 1766 ms (23/29)

(Last updated: Dec 27, 2025)

Notes: Minimize does not minify CSS and JS. HTML Minifier Terser is currently not included due to issues around whitespace collapsing and removal of code using modern CSS features, issues which appeared to distort the data.

Examples

CLI

Sample command line:

html-minifier-next --collapse-whitespace --remove-comments --minify-js --input-dir=. --output-dir=example

Another example, using npx:

npx html-minifier-next --input-dir=test --file-ext html --preset comprehensive --output-dir example

Process specific files and directories:

# Process only HTML files
html-minifier-next --collapse-whitespace --input-dir=src --output-dir=dist --file-ext=html

# Process multiple file extensions
html-minifier-next --collapse-whitespace --input-dir=src --output-dir=dist --file-ext=html,htm,php

# Using configuration file that sets `fileExt` (e.g., `"fileExt": "html,htm"`)
html-minifier-next --config-file=html-minifier.json --input-dir=src --output-dir=dist

# Process all files (default behavior)
html-minifier-next --collapse-whitespace --input-dir=src --output-dir=dist
# When processing all files, non-HTML files will also be read as UTF‑8 and passed to the minifier
# Consider restricting with `--file-ext` to avoid touching binaries (e.g., images, archives)

Exclude directories from processing:

# Ignore a single directory
html-minifier-next --collapse-whitespace --input-dir=src --output-dir=dist --ignore-dir=libs

# Ignore multiple directories
html-minifier-next --collapse-whitespace --input-dir=src --output-dir=dist --ignore-dir=libs,vendor,node_modules

# Ignore by relative path (only ignores src/static/libs, not other “libs” directories)
html-minifier-next --collapse-whitespace --input-dir=src --output-dir=dist --ignore-dir=static/libs

Dry run mode (preview outcome without writing files):

# Preview with output file
html-minifier-next input.html -o output.html --dry --collapse-whitespace

# Preview directory processing with statistics per file and total
html-minifier-next --input-dir=src --output-dir=dist --dry --collapse-whitespace
# Output: [DRY RUN] Would process directory: src → dist
#   index.html: 1,234 → 892 bytes (-342, 27.7%)
#   about.html: 2,100 → 1,654 bytes (-446, 21.2%)
# ---
# Total: 3,334 → 2,546 bytes (-788, 23.6%)

Verbose mode (show detailed processing information):

# Show processing details while minifying
html-minifier-next --input-dir=src --output-dir=dist --verbose --collapse-whitespace
# Output: Options: collapseWhitespace, html5, includeAutoGeneratedTags
#   ✓ src/index.html: 1,234 → 892 bytes (-342, 27.7%)
#   ✓ src/about.html: 2,100 → 1,654 bytes (-446, 21.2%)
# ---
# Total: 3,334 → 2,546 bytes (-788, 23.6%)

# `--dry` automatically enables verbose output
html-minifier-next --input-dir=src --output-dir=dist --dry --collapse-whitespace

Special cases

Ignoring chunks of markup

If you have chunks of markup you would like preserved, you can wrap them with <!-- htmlmin:ignore -->.

Minifying JSON content

JSON script types are minified automatically without configuration, including application/json, application/ld+json, application/manifest+json, application/vnd.geo+json, application/problem+json, application/merge-patch+json, application/json-patch+json, importmap, and speculationrules. Malformed JSON is preserved by default (with continueOnMinifyError: true).

Note: The processScripts option is only for script types containing HTML templates (e.g., text/ng-template, text/x-handlebars-template), not for JSON.

Preserving SVG and MathML elements

SVG and MathML elements are automatically recognized as foreign elements, and when they are minified, both case-sensitivity and self-closing slashes are preserved, regardless of the minification settings used for the rest of the file. This ensures valid output for these namespaced elements.

Working with invalid or partial markup

By default, HTML Minifier Next parses markup into a complete tree structure, then modifies it (removing anything that was specified for removal, ignoring anything that was specified to be ignored, etc.), then creates markup from that tree and returns it.

Input markup (e.g., <p id="">foo) → Internal representation of markup in a form of tree (e.g., { tag: "p", attr: "id", children: ["foo"] }) → Transformation of internal representation (e.g., removal of id attribute) → Output of resulting markup (e.g., <p>foo</p>)

For partial HTML fragments (such as template includes, SSI fragments, or closing tags without opening tags), use the partialMarkup: true option. This preserves stray end tags (closing tags without corresponding opening tags) and prevents auto-closing of unclosed tags at the end of input. Note that normal HTML auto-closing rules still apply during parsing—for example, a closing parent tag will still auto-close its unclosed child elements.

To validate complete HTML markup, use the W3C validator or one of several validator packages.

Security

ReDoS protection

This minifier includes protection against regular expression denial of service (ReDoS) attacks:

  • Custom fragment quantifier limits: The customFragmentQuantifierLimit option (default: 200) prevents exponential backtracking by replacing unlimited quantifiers (*, +) with bounded ones in regular expressions.

  • Input length limits: The maxInputLength option allows you to set a maximum input size to prevent processing of excessively large inputs that could cause performance issues.

  • Enhanced pattern detection: The minifier detects and warns about various ReDoS-prone patterns including nested quantifiers, alternation with quantifiers, and multiple unlimited quantifiers.

Important: When using custom ignoreCustomFragments, ensure your regular expressions don’t contain unlimited quantifiers (*, +) without bounds, as these can lead to ReDoS vulnerabilities.

Custom fragment examples

Safe patterns (recommended):

ignoreCustomFragments: [
  /<%[\s\S]{0,1000}?%>/,         // JSP/ASP with explicit bounds
  /<\?php[\s\S]{0,5000}?\?>/,    // PHP with bounds
  /\{\{[^}]{0,500}\}\}/          // Handlebars without nested braces
]

Potentially unsafe patterns (will trigger warnings):

ignoreCustomFragments: [
  /<%[\s\S]*?%>/,                // Unlimited quantifiers
  /<!--[\s\S]*?-->/,             // Could cause issues with very long comments
  /\{\{.*?\}\}/,                 // Nested unlimited quantifiers
  /(script|style)[\s\S]*?/       // Multiple unlimited quantifiers
]

Template engine configurations:

// Handlebars/Mustache
ignoreCustomFragments: [/\{\{[\s\S]{0,1000}?\}\}/]

// Liquid (Jekyll)
ignoreCustomFragments: [/\{%[\s\S]{0,500}?%\}/, /\{\{[\s\S]{0,500}?\}\}/]

// Angular
ignoreCustomFragments: [/\{\{[\s\S]{0,500}?\}\}/]

// Vue.js
ignoreCustomFragments: [/\{\{[\s\S]{0,500}?\}\}/]

Important: When using custom ignoreCustomFragments, the minifier automatically applies bounded quantifiers to prevent ReDoS attacks, but you can also write safer patterns yourself using explicit bounds.

Escaping patterns in different contexts

The escaping requirements for ignoreCustomFragments patterns differ depending on how you’re using HMN:

Config file (JSON):

{
  "ignoreCustomFragments": ["\\{%[\\s\\S]{0,1000}?%\\}", "\\{\\{[\\s\\S]{0,500}?\\}\\}"]
}

Programmatic (JavaScript/Node.js):

ignoreCustomFragments: [/\{%[\s\S]{0,1000}?%\}/, /\{\{[\s\S]{0,500}?\}\}/]

CLI (via config file—recommended):

html-minifier-next --config-file=config.json input.html

CLI (inline—not recommended due to complex escaping):

html-minifier-next --ignore-custom-fragments '[\\\"\\\\{%[\\\\s\\\\S]{0,1000}?%\\\\}\\\"]' input.html

For CLI usage, using a config file is strongly recommended to avoid complex shell and JSON escaping.

Web demo:

\{%[\s\S]{0,1000}?%\} \{\{[\s\S]{0,500}?\}\}

Running HTML Minifier Next locally

Local server

npm run serve

Benchmarks

Benchmarks for minified HTML:

cd benchmarks;
npm i;
npm run benchmarks

(In case of dependency conflicts, run npm i with the --legacy-peer-deps flag.)

Regression tests

cd benchmarks;
npm i;
npm run backtest

The backtest tool tracks minification performance across Git history. Results are saved in benchmarks/backtest/ as CSV and JSON files.

Parameters:

  • No argument: Tests last 50 commits (default)
  • COUNT: Tests last COUNT commits (e.g., npm run backtest 100)
  • COUNT/STEP: Tests last COUNT commits, sampling every STEPth commit (e.g., npm run backtest 500/10 tests 50 commits)

Acknowledgements

With many thanks to all the previous authors of HTML Minifier, especially Juriy “kangax” Zaytsev, and to everyone who helped make this new edition better, particularly Daniel Ruf and Jonas Geiler.

About

Super-configurable, well-tested, JavaScript-based HTML minifier (enhanced successor of HTML Minifier)

Resources

License

Security policy

Stars

Watchers

Forks

Sponsor this project

  •  

Contributors 5