跳转到主要内容

minify-html的更快版本

项目描述

minify-html

一个针对速度和效率精心优化的Rust HTML压缩器,具有其他语言的绑定。

  • 高级压缩策略在速度上超越其他压缩器。
  • 使用SIMD搜索、直接尝试和查找表。
  • 处理无效HTML,经过广泛测试和模糊测试
  • 使用minify-jslightningcss进行超级快速的JS和CSS压缩。

查看变更日志以查看最新更新。

性能

html-minifierminimize的比较,在顶级网页上运行。在此处查看分解。

Chart showing speed of HTML minifiersChart showing compression of HTML minifiers

onepass变体在速度上进行了更多优化。查看其README以获取更多信息。

兼容性和使用

命令行界面(CLI)

命令行界面名为 minhtml。预编译的二进制文件适用于 Linux(ARM64 和 x64)、macOS(ARM64 和 x64)和 Windows(x64)。您可以在 GitHub 发布版中下载它们。

如果您已安装 Cargo,也可以从源代码构建和安装:cargo install minhtml

使用

使用 --help 参数获取更多详细信息。

minhtml --output /path/to/output.min.html --keep-closing-tags --minify-css /path/to/src.html

快速并行处理一批文件

minhtml --keep-closing-tags --minify-css /path/to/**/*.html
Rust

获取

[dependencies]
minify-html = "0.15.0"

使用

查看 API 和使用示例的 文档

Deno

使用

import init, {minify} from "https://wilsonl.in/minify-html/deno/0.15.0/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 }));

所有 Cfg 字段 都作为对象提供的第二个参数上的 snake_case 属性可用;如果未设置任何,则默认为 false

Node.js
  • 包: @minify-html/node
  • 绑定: Neon
  • 平台:Linux(ARM64 和 x64)、macOS(ARM64 和 x64)、Windows(x64);Node.js 8.6.0 及更高版本

获取

使用 npm

npm i @minify-html/node

使用 Yarn

yarn add @minify-html/node

使用

提供了 TypeScript 定义。

import { Buffer } from "node:buffer";
import 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 });

所有 Cfg 字段 都作为对象提供的第二个参数上的 snake_case 属性可用;如果未设置任何,则默认为 false

Java
  • 包: in.wilsonl.minifyhtml
  • 绑定: JNI
  • 平台:Linux(ARM64 和 x64)、macOS(ARM64 和 x64)、Windows(x64);Java 7 及更高版本

获取

将其作为 Maven 依赖项添加

<dependency>
  <groupId>in.wilsonl.minifyhtml</groupId>
  <artifactId>minify-html</artifactId>
  <version>0.15.0</version>
</dependency>

使用

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);

所有 Cfg 字段 都作为 Builder 上的 camelCase 设置方法可用;如果未设置任何,则默认为 false

Python
  • 包: minify-html
  • 绑定: PyO3
  • 平台:Linux(ARM64 和 x64)、macOS(ARM64 和 x64)、Windows(x64);Python 3.8 到 3.12

获取

将 PyPI 项目作为依赖项添加,并使用 pippipenv 安装。

使用

import minify_html

minified = minify_html.minify("<p>  Hello, world!  </p>", minify_js=True, remove_processing_instructions=True)

所有 Cfg 字段 都作为 Python 关键字参数可用;如果省略任何,则默认为 False

Ruby
  • 包: minify_html
  • 绑定: rb-sysmagnus
  • 平台:Linux(ARM64 和 x64)、macOS(ARM64 和 x64)、Windows(x64);Ruby 2.7 到 3.2

获取

将其作为依赖项添加到 Gemfile*.gemspec

使用

require 'minify_html'

print minify_html("<p>  Hello, world!  </p>", { :keep_spaces_between_attributes => true, :minify_js => true })

所有 Cfg 字段 都可用;如果省略任何,则默认为 false

WASM

可能需要使用打包器来使用 WebAssembly 模块,有关详细信息,请参阅此处

使用

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 }));

所有 Cfg 字段 都作为对象提供的第二个参数上的 snake_case 属性可用;如果未设置任何,则默认为 false

模板语法

minify-html 可以解析并保留源代码中的 {{/{%/{#<% 语法,这使得许多为大多数引擎(如 Pebble、Mustache、Django、Go、Jinja、Twix、Nunjucks、Handlebars、Sailfish、JSP、EJS 和 ERB)编写的 HTML 模板可以压缩。查找 preserve_*_template_syntax 配置选项。

PHP 块(<?php<?=)也属于处理指令,默认情况下会保留。

请注意,在这些语法中,解析是“愚蠢”的:它将简单地查找下一个与结束定界符匹配的字符子序列。如果这些块内部有嵌套或字符串字面量,可能会出现问题,但这应该很少见。

压缩

请注意,一些压缩操作可能会导致 HTML 无法通过验证,但仍然可以被浏览器正确解析和渲染;本质上,是利用了浏览器的宽松性来实现更好的压缩。要防止这种情况,请参阅以下配置选项

  • do_not_minify_doctype
  • ensure_spec_compliant_unquoted_attribute_values
  • keep_spaces_between_attributes

空白字符

minify-html 具有高级上下文感知空白字符压缩功能,可以执行以下操作

  • 保留 precode 中的空白字符,这些元素对空白字符敏感。
  • 在内容标签中修剪和合并空白字符,因为渲染时空白字符通常会合并。
  • 在布局标签中删除空白字符,这允许使用内联布局同时保留格式化的代码。

方法

有三种空白字符压缩方法。在处理文本内容时,minify-html 会根据包含的元素选择使用哪些方法。

合并空白字符

适用于:除了空白字符敏感元素之外的所有元素。

将文本节点中的空白字符序列缩减为一个空格(U+0020)。

之前之后
<p>↵
··The·quick·brown·fox↵
··jumps·over·the·lazy↵
··dog.↵
</p>
<p>·The·quick·brown·fox·jumps·over·the·lazy·dog.·</p>
删除整个空白字符

适用于:除了空白字符敏感内容内容优先格式化元素之外的所有元素。

删除标签之间仅由空白字符组成的任何文本节点。

之前之后
<ul>↵
··<li>A</li>↵
··<li>B</li>↵
··<li>C</li></ul>
<ul>↵
··<li>A</li><li>B</li><li>C</li></ul>
修剪空白字符

适用于:除了空白字符敏感格式化元素之外的所有元素。

删除标签的任何前导/尾随空白字符。

之前之后
<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>

元素类型

minify-html 假设 HTML 和 SVG 元素根据标准和最佳实践以特定方式使用。通过做出这些假设,它可以应用最佳的空白字符压缩策略。如果不满足这些假设,请考虑调整 HTML 源代码或关闭空白字符压缩。

分组 元素 预期子元素
格式化 astrong以及其他 格式化元素,文本。
内容 h1p以及其他 格式化元素,文本。
布局 divul以及其他 布局元素,内容元素。
内容优先 labelli以及其他 与内容类似,但只有一个子元素时可以是布局。
格式化元素

空白字符会合并。

格式化元素通常是行内元素,它们围绕内容元素中的一些文本进行包装,因此其空白字符不会被删除,因为它们可能是内容的一部分。

内容元素

空白字符将被删除并合并。

内容元素通常代表一个连续且完整的单位,例如一段文本。因此,空白字符很重要,但它们的序列很可能是由于格式化引起的。

之前
<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>
布局元素

空白字符将被删除并合并。整个空白将被移除。

这些元素只能包含其他元素,不能包含文本。这使得删除整个空白成为可能,这在使用display: inline-block时非常有用,这样可以防止元素之间的空白(例如缩进)改变布局和样式。

之前
<ul>↵
··<li>A</li>↵
··<li>B</li>↵
··<li>C</li></ul>
之后
<ul><li>A</li><li>B</li><li>C</li></ul>
内容优先元素

空白字符将被删除并合并。

这些元素通常类似于内容元素,但偶尔也会像布局元素一样使用,只有一个子元素。由于可能包含内容,因此不会删除整个空白,但作为布局使用是可以的,因为只有一个子元素,并且空白字符将被删除。

之前
<li>↵
··<article>↵
····<section></section>↵
····<section></section>↵
··</article></li>
之后
<li><article><section></section><section></section></article></li>

标签

可选的起始和结束标签将被删除。

属性

在属性值中的任何实体都将被解码,然后计算并使用值的短表示形式。

  • 双引号,其中的任何"都被编码。
  • 单引号,其中的任何'都被编码。
  • 未引号,其中的"/'的第一个字符(如果适用),任何>和任何空白字符都被编码。

当可能时,属性中的空白(在解码之后)将被删除并合并。

布尔属性的值将被删除。如果某些属性的值在处理之后为空或为默认值,则完全删除这些属性。一些其他属性也会被完全删除。

如果script标签上的type属性值等于一个JavaScript MIME类型,则该属性将被删除。

如果处理后的属性值为空,则除了名称之外的所有内容都将被完全删除(即没有=),因为空属性隐含地等于具有空字符串值的属性。

当可能时,删除属性之间的空白。

实体

如果有效且解码后长度较短或相等,则将解码实体。将具有较短实体表示形式的UTF-8序列编码。

不引用有效Unicode标量值的数字实体将被替换为替换字符

尽可能避免编码;例如,只有当<后面跟随有效的标签名称字符时,才在内容中对它们进行编码。如果需要,选择最短的实体表示形式。

注释

注释将被删除。

忽略

感叹号、处理指令和空元素不会被删除,因为假定它们的声明有特殊的原因。

解析

minify-html可以处理任何HTML,优雅地处理所有可能的语法(包括无效的语法),就像浏览器一样。有关详细信息,请参阅Parsing.md

问题和贡献

欢迎提交拉取请求和任何贡献!

如果minify-html做了意想不到的事情,误解了一些语法,或者错误地保留/删除了一些代码,请提出问题,并提供一些相关的代码,以便可以用于重现和调查问题。

项目详情


下载文件

下载适用于您平台文件的文件。如果您不确定该选择哪个,请了解有关安装包的更多信息。

源分发

minify_html_onepass-0.15.0.tar.gz (85.7 kB 查看哈希值)

上传时间

构建分发

minify_html_onepass-0.15.0-cp312-none-win_amd64.whl (2.3 MB 查看哈希值)

上传时间 CPython 3.12 Windows x86-64

minify_html_onepass-0.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB 查看哈希值)

上传时间 CPython 3.12 manylinux: glibc 2.17+ x86-64

minify_html_onepass-0.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.1 MB 查看哈希值)

上传时间 CPython 3.12 manylinux: glibc 2.17+ ARM64

minify_html_onepass-0.15.0-cp312-cp312-macosx_11_0_arm64.whl (2.1 MB 查看哈希值)

上传时间 CPython 3.12 macOS 11.0+ ARM64

minify_html_onepass-0.15.0-cp312-cp312-macosx_10_12_x86_64.whl (2.2 MB 查看哈希值)

上传时间 CPython 3.12 macOS 10.12+ x86-64

minify_html_onepass-0.15.0-cp311-none-win_amd64.whl (2.3 MB 查看哈希值)

上传时间 CPython 3.11 Windows x86-64

minify_html_onepass-0.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB 查看哈希值)

上传时间 CPython 3.11 manylinux: glibc 2.17+ x86-64

minify_html_onepass-0.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.1 MB 查看哈希值)

上传时间 CPython 3.11 manylinux: glibc 2.17+ ARM64

minify_html_onepass-0.15.0-cp311-cp311-macosx_11_0_arm64.whl (2.1 MB 查看哈希值)

上传时间 CPython 3.11 macOS 11.0+ ARM64

minify_html_onepass-0.15.0-cp311-cp311-macosx_10_12_x86_64.whl (2.2 MB 查看哈希值)

上传时间 CPython 3.11 macOS 10.12+ x86-64

minify_html_onepass-0.15.0-cp310-none-win_amd64.whl (2.3 MB 查看哈希值)

上传时间 CPython 3.10 Windows x86-64

minify_html_onepass-0.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB 查看哈希值)

上传时间 CPython 3.10 manylinux: glibc 2.17+ x86-64

minify_html_onepass-0.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.1 MB 查看哈希值)

上传时间 CPython 3.10 manylinux: glibc 2.17+ ARM64

minify_html_onepass-0.15.0-cp310-cp310-macosx_11_0_arm64.whl (2.1 MB 查看哈希值)

上传时间 CPython 3.10 macOS 11.0+ ARM64

minify_html_onepass-0.15.0-cp310-cp310-macosx_10_12_x86_64.whl (2.2 MB 查看哈希值)

上传时间 CPython 3.10 macOS 10.12+ x86-64

minify_html_onepass-0.15.0-cp39-none-win_amd64.whl (2.3 MB 查看哈希值)

上传时间 CPython 3.9 Windows x86-64

minify_html_onepass-0.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ x86-64

minify_html_onepass-0.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.1 MB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ ARM64

minify_html_onepass-0.15.0-cp39-cp39-macosx_11_0_arm64.whl (2.1 MB 查看哈希值)

上传于 CPython 3.9 macOS 11.0+ ARM64

minify_html_onepass-0.15.0-cp39-cp39-macosx_10_12_x86_64.whl (2.2 MB 查看哈希值)

上传于 CPython 3.9 macOS 10.12+ x86-64

minify_html_onepass-0.15.0-cp38-none-win_amd64.whl (2.3 MB 查看哈希值)

上传于 CPython 3.8 Windows x86-64

minify_html_onepass-0.15.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.17+ x86-64

minify_html_onepass-0.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.1 MB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.17+ ARM64

minify_html_onepass-0.15.0-cp38-cp38-macosx_11_0_arm64.whl (2.1 MB 查看哈希值)

上传于 CPython 3.8 macOS 11.0+ ARM64

minify_html_onepass-0.15.0-cp38-cp38-macosx_10_12_x86_64.whl (2.2 MB 查看哈希值)

上传于 CPython 3.8 macOS 10.12+ x86-64

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面