tower-minify-html

Crates.iotower-minify-html
lib.rstower-minify-html
version0.2.0
created_at2025-12-29 22:40:42.98408+00
updated_at2025-12-30 19:56:24.457741+00
descriptionA Tower layer for minifying HTML responses using minify-html
homepage
repositoryhttps://github.com/avsaase/tower-minify-html
max_upload_size
id2011623
size89,391
Alexander van Saase (avsaase)

documentation

README

tower-minify-html

Crates.io Docs.rs License

A Tower layer for minifying HTML responses using minify-html.

Usage

Add this to your Cargo.toml:

[dependencies]
tower-minify-html = "0.1.0"

Example

use axum::{Router, response::Html, routing::get};
use minify_html::Cfg;
use tower_minify_html::MinifyHtmlLayer;

#[tokio::main]
async fn main() {
    let mut cfg = Cfg::new();
    cfg.keep_closing_tags = true;
    cfg.keep_html_and_head_opening_tags = true;
    cfg.keep_comments = false;

    let app = Router::new()
        .route("/", get(handler))
        .layer(MinifyHtmlLayer::new(cfg));

    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

async fn handler() -> Html<&'static str> {
    Html(
        r#"
        <!DOCTYPE html>
        <html lang="en">
            <head>
                <meta charset="utf-8">
                <title>    Hello    World    </title>
            </head>
            <body>
                <h1>    Hello    World    </h1>
            </body>
        </html>
        "#,
    )
}

Features

  • standard (default): Enables the standard minify-html backend.
  • onepass: Enables the minify-html-onepass backend.

Both features can be enabled at the same time.

Backends

You can choose between the standard and onepass backends using the MinifyHtmlLayerBuilder.

Standard Backend

The standard backend uses minify-html and is the default and can be used with MinifyHtmlLayer::new or the builder.

use tower_minify_html::{MinifyHtmlLayer, Cfg};

let mut cfg = Cfg::new();
let layer = MinifyHtmlLayer::new(cfg);

Onepass Backend

The onepass backend uses minify-html-onepass and is faster but has more limitations. It requires the onepass feature.

use tower_minify_html::{MinifyHtmlLayer, Backend, OnePassCfg};

let mut cfg = OnePassCfg::new();
let layer = MinifyHtmlLayer::builder()
    .backend(Backend::Onepass)
    .onepass_config(cfg)
    .build();

Compression

When using this layer with compression (e.g., tower-http's CompressionLayer), ensure that MinifyHtmlLayer is applied before the compression layer in your code (i.e., MinifyHtmlLayer should be the inner layer). This ensures that the HTML is minified before it is compressed.

let app = Router::new()
    .route("/", get(handler))
    .layer(MinifyHtmlLayer::new(cfg))
    .layer(CompressionLayer::new());

License

MIT OR Apache-2.0

Commit count: 0

cargo fmt