超快且智能的HTML + JS + CSS压缩器
项目描述
minify-html
一个针对速度和效率精心优化的Rust HTML压缩器,具有其他语言的绑定。
- 先进的压缩策略在速度上超越其他压缩器。
- 使用SIMD搜索、直接查找和查找表。
- 处理无效的HTML,经过广泛的测试和模糊测试。
- 使用minify-js和lightningcss进行超快的JS和CSS压缩。
查看变更日志以查看最新更新。
性能
与html-minifier和minimize的比较,在顶级网页上运行。在这里查看细分。
onepass变体在速度上进行了更多优化。查看其README以获取更多详细信息。
兼容性和用法
CLI
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
Deno
- 包: https://wilsonl.in/minify-html/deno/0.15.0/index.js
- 绑定: WASM
- 平台:所有
使用
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 项目作为依赖项添加,并使用 pip
或 pipenv
安装。
使用
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-sys 和 magnus
- 平台: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
- 包: @minify-html/wasm
- 绑定: WASM
- 平台:所有
可能需要 bundler 来使用 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 具有高级上下文感知空白符压缩功能,例如
- 在
pre
和code
等空白符敏感的元素中保留空白符不变。 - 在内容标签中修剪和合并空白符,因为空白符在渲染时总是会合并。
- 在布局标签中删除空白符,这允许使用内联布局同时保持格式化代码。
方法
存在三种空白符压缩方法。当处理文本内容时,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 源文件或关闭空白符压缩。
分组 | 元素 | 期望的子元素 |
---|---|---|
格式化 | a 、strong 、等 |
格式化元素,文本。 |
内容 | h1 、p 、等 |
格式化元素,文本。 |
布局 | div 、ul 、等 |
布局元素,内容元素。 |
内容优先 | label 、li 、等 |
类似于内容,但可能只有一个子元素作为布局。 |
格式化元素
空白符被压缩。
格式化元素通常是内联元素,它们围绕内容元素中的某些文本,因此其空白符不会被修剪,因为它们可能是内容的一部分。
内容元素
空白符被修剪和压缩。
内容元素通常代表连续的完整内容单元,如段落。因此,空白符很重要,但它们的序列很可能是由格式引起的。
之前
<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>
标签
移除可选的开启和关闭标签。
属性
解码属性值中的任何实体,然后计算并使用值的最短表示形式。
- 使用双引号,并编码任何
"
。 - 使用单引号,并编码任何
'
。 - 未使用引号,如果适用,编码
"
/'
的第一个字符,任何>
和任何空白字符。
属性在解码后(如果可能)修剪和合并空白。
布尔属性 的值被移除。如果值在处理后为空或默认值,则完全移除一些其他属性(即不保留 =
)。
具有等于 JavaScript MIME 类型 的值的 script
标签上的 type
属性被移除。
如果属性值在处理后为空,则除了名称之外的所有内容都将被完全移除(即没有 =
),因为空属性隐式地与空字符串值的属性相同。
如果可能,移除属性之间的空格。
实体
如果有效并且解码后的长度较短或相等,则解码实体。对具有较短实体表示的 UTF-8 序列进行编码。
不指向有效 Unicode 标量值 的数字实体被替换为 替换字符。
尽可能避免编码;例如,只有在后面跟随有效的标签名称字符时,才会编码 <
。如果需要,选择最短的实体表示形式。
注释
移除注释。
忽略
感叹号、处理指令 和空元素不会被移除,因为这假设它们的声明有特殊原因。
解析
minify-html 可以处理任何 HTML,优雅地处理所有可能的语法(包括无效的语法),就像浏览器一样。有关更多详细信息,请参阅 Parsing.md。
问题和贡献
欢迎 Pull 请求和任何贡献!
如果 minify-html 做了意想不到的事情,误解了一些语法,或者错误地保留/删除了一些代码,请 提出问题 并提供一些相关的代码,以便可以重现和调查问题。
项目详情
minify_html-0.15.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | cf4c36b6f9af3b0901bd2a0a29db3b09c0cdf0c38d3dde28e6835bce0f605d37 |
|
MD5 | 7d4729b9639bf8d946474f138b6fd64f |
|
BLAKE2b-256 | 0b8ac921cd4b3e364c871be418c1694b315e5fa823eb8180d89f99d9a61aa8fe |
minify_html-0.15.0-cp312-none-win_amd64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 01ea40dc5ae073c47024f02758d5e18e55d853265eb9c099040a6c00ab0abb99 |
|
MD5 | a95ece1bea63f7d8c72b26a288241ab2 |
|
BLAKE2b-256 | 90f023ea4cbaff3f83c4f8802bfda2aebbdd02fb84595567aeb86be84f6aa055 |
哈希值 for minify_html-0.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ea315ad6ac33d7463fac3f313bba8c8d9a55f4811971c203eed931203047e5c8 |
|
MD5 | 5a1764ea6ad86f2fde8a16ed231ea273 |
|
BLAKE2b-256 | a0ae786cd6775d8891fe2a4b5774753a00c95fd6ec3013086c92c2970c4371dc |
哈希值 for minify_html-0.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1056819ea46e9080db6fed678d03511c7e94c2a615e72df82190ea898dc82609 |
|
MD5 | 9401a8827df53ea5c92aecc2da323563 |
|
BLAKE2b-256 | 0f5a9b53f0215237f1693242cd6fbafe73dd88050454f2715b6d5123ca444da0 |
哈希值 for minify_html-0.15.0-cp312-cp312-macosx_11_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 70251bd7174b62c91333110301b27000b547aa2cc06d4fe6ba6c3f11612eecc9 |
|
MD5 | 96d374f345902a222191d778c715a2f6 |
|
BLAKE2b-256 | 09dfd011e38521551ddab4d31d389691aa5d3eaf19cfbab993a9d366032a6608 |
哈希值 for minify_html-0.15.0-cp312-cp312-macosx_10_12_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2a9aef71b24c3d38c6bece2db3bf707443894958b01f1c27d3a6459ba4200e59 |
|
MD5 | 8db6a12d82a73901e003d7c97da1e03a |
|
BLAKE2b-256 | 30a7b0a1c3a3c10c00b28732b1d8e54fbe2e0d7f586397592d35952ca7ec156c |
哈希值 for minify_html-0.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d4c4ae3909e2896c865ebaa3a96939191f904dd337a87d7594130f3dfca55510 |
|
MD5 | a282d8705aace0355dab913adc5a1819 |
|
BLAKE2b-256 | a0e2ed7e62f62a54774c411a0e28ef67a7d1ccb84ab1a933f6b59362c83d78c1 |
哈希值 for minify_html-0.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7b2aadba6987e6c15a916a4627b94b1db3cbac65e6ae3613b61b3ab0d2bb4c96 |
|
MD5 | e41856c5bde2f9d1bfa0027abf3c24cc |
|
BLAKE2b-256 | f36ac22b18ca570c33c3edf895ecf8661501d9e17e9d50c3a2d3ea956f16cd90 |
哈希值 for minify_html-0.15.0-cp311-cp311-macosx_11_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 597c86f9792437eee0698118fb38dff42b5b4be6d437b6d577453c2f91524ccc |
|
MD5 | c04e1f1ef13f6fba022da2cc5136d417 |
|
BLAKE2b-256 | 3ffde159a09eda87b6c932b2a4508f54b2198f3622c2ae2715db8912f885d088 |
哈希值 for minify_html-0.15.0-cp311-cp311-macosx_10_12_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a23a8055e65fa01175ddd7d18d101c05e267410fa5956c65597dcc332c7f91dd |
|
MD5 | d845332920658049acf9fbe655d98a32 |
|
BLAKE2b-256 | d197c58b0d768d5aeea3aceb3312c45a56adc8fca61a08e9a293a63e4ebb5327 |
哈希值 for minify_html-0.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e47197849a1c09a95892d32df3c9e15f6d0902c9ae215e73249b9f5bca9aeb97 |
|
MD5 | 962294791ac62a1807ab80c01cee893e |
|
BLAKE2b-256 | 65cb2c07378be27fb06f8e4ff9c45713f93ba278c59654121dfbd05217fc2b7a |
哈希值 for minify_html-0.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7e6d4f97cebb725bc1075f225bdfcd824e0f5c20a37d9ea798d900f96e1b80c0 |
|
MD5 | f83674b0bbc2e5a9d3ccdaf8d007b8b6 |
|
BLAKE2b-256 | 804a68bb3628661022a98d047fa036c334c6783bad28eed424d3be9934b4f117 |
哈希值 用于 minify_html-0.15.0-cp310-cp310-macosx_11_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | f37ce536305500914fd4ee2bbaa4dd05a039f39eeceae45560c39767d99aede0 |
|
MD5 | be0574dd1952e030e2736ece1bc8c507 |
|
BLAKE2b-256 | 161a42c5710df7272819f200680bbc32a60b9d8c1fe6f93fcae74f15ed333baf |
哈希值 用于 minify_html-0.15.0-cp310-cp310-macosx_10_12_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | afd76ca2dc9afa53b66973a3a66eff9a64692811ead44102aa8044a37872e6e2 |
|
MD5 | bedce3a9a01490e9175ed2995b78cf00 |
|
BLAKE2b-256 | cba93aaf8fbf5f673892eb9bc8ddedf0f1fc41f9ac0a2178d9b402f96241359d |
哈希值 用于 minify_html-0.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7b071ded7aacbb140a7e751d49e246052f204b896d69663a4a5c3a27203d27f6 |
|
MD5 | 1069553965a1dbd7f2dcc88afbf71613 |
|
BLAKE2b-256 | 20cd5d786a1364c4eb8b6c8d934b2d9afc60d0abaf0c3f5bd1b121eb1ad343af |
哈希值 用于 minify_html-0.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | cda674cc68ec3b9ebf61f2986f3ef62de60ce837a58860c6f16b011862b5d533 |
|
MD5 | 5b1bfa00beba3e44f0e9c401e21a4b22 |
|
BLAKE2b-256 | 71946019e2e8054c4c8ad6200ab067445b09b22946360b544ed10699016cba55 |
哈希值 用于 minify_html-0.15.0-cp39-cp39-macosx_11_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 92375f0cb3b4074e45005e1b4708b5b4c0781b335659d52918671c083c19c71e |
|
MD5 | 9cb86104c905d258c7d3cbe312db6d14 |
|
BLAKE2b-256 | c0a40f03d1132428bc20ea289212ad42ba781530673b2096d13db200243c0317 |
哈希值 用于 minify_html-0.15.0-cp39-cp39-macosx_10_12_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7a5eb7e830277762da69498ee0f15d4a9fa6e91887a93567d388e4f5aee01ec3 |
|
MD5 | 4d29f2708b3126f61f67071b776fa782 |
|
BLAKE2b-256 | 8deebde9639cebaa02c8371634d7fc167d566eb84e6eb0ff827e987906deeae9 |
哈希值 用于 minify_html-0.15.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5f707b233b9c163a546b15ce9af433ddd456bd113f0326e5ffb382b8ee5c1a2d |
|
MD5 | cce1ae3bd8ffd4624e447205bfb2ea38 |
|
BLAKE2b-256 | 4da786255d2f1f01b2ae3da0e6835df98785ed0865c488e50fe3e999bfa469c3 |
哈希值 用于 minify_html-0.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 40f38ddfefbb63beb28df20c2c81c12e6af6838387520506b4eceec807d794a3 |
|
MD5 | c7c21ffcce96f6ab214cb861ba1bf41a |
|
BLAKE2b-256 | 776366fe3ae0428c9983d0cd89d5c5d8807c46f83e636a38f1ba5014b39ea436 |
哈希值 用于 minify_html-0.15.0-cp38-cp38-macosx_11_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b6356541799951c5e8205aabf5970dda687f4ffa736479ce8df031919861e51d |
|
MD5 | 85a7ede5bc5e6a68cf40ad58091f5154 |
|
BLAKE2b-256 | 4c8ce245a7176eb2a7ed2d89daaa0c05e25b2b427540efde6332653c43bdca67 |
哈希值 用于 minify_html-0.15.0-cp38-cp38-macosx_10_12_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3b38ea5b446cc69e691a0bf64d1160332ffc220bb5b411775983c87311cab2c7 |
|
MD5 | 6fa139d1511c798b2d7bf23b14bacbcc |
|
BLAKE2b-256 | b1dd64a579907d95c72b894aefa91503fab43960b005bf9a0d7227d4067b43a3 |