10 个版本
使用旧的 Rust 2015
0.3.3 | 2022年1月19日 |
---|---|
0.3.2 | 2017年8月16日 |
0.3.1 | 2017年7月24日 |
0.2.2 | 2017年7月21日 |
0.1.2 | 2017年7月20日 |
#458 in 压缩
每月下载 37 次
32KB
510 代码行
static-compress
static-compress
是一个命令行工具,可用于生成指定目录子树的静态预压缩副本,这对于通过Web服务器(如nginx或apache)提供静态预压缩内容非常有用。
static-compress
目前支持创建符合给定glob(表达式)的文件的gzip和brotli格式的静态压缩副本。可以使用标准的 miniz
库或较慢但压缩率更高的 zopfli
算法(由Google最近开发)生成gzip压缩文件。从版本0.3开始,static-compress
还支持 webp 图像压缩。
安装
static-compress
可通过所有支持平台的 cargo 软件包管理器使用,并可以通过简单地执行以下命令进行安装:
cargo install static-compress
可以在静态压缩主页 https://neosmart.net/static-compress/ 上找到为选定平台预构建的签名二进制文件。
使用方法
用法
static-compress [OPTIONS] <FILTER>...
static-compress
的用法简单。可以使用要预压缩的文件列表或表达式(如 *.rs
,匹配当前目录中所有扩展名为 .rs
的文件)或 **/*.png
(匹配所有子目录中的 .png
文件)来调用它。
不需要选项,但提供可选的命令行开关来影响 static-compress
的行为。
-c, --compressor <[brotli|gzip| The compressor to use, defaulting to gzip
webp|zopfli]>
-e, --extension <.EXT> The extension to use for compressed files. Supplied
automatically if not provided.
-j, --threads <COUNT> The number of simultaneous conversions
-q, --quality <QUALITY> The algorithm-specific quality parameter to be used.
Automatically set if not provided.
可以使用 -j
开关(类似于 make
)实现多线程,并可以用于指定多线程同时压缩的文件数。默认情况下,static-compress
只使用一个线程。
可以使用特定于算法的 --quality
开关来设置所选压缩器的质量参数(如果支持)
压缩器 | --quality 范围 |
---|---|
gzip | 0 - 10 |
brotli | 0 - 11 |
webp | 0 - 100 |
zopfli | 不支持 |
支持的匹配模式/表达式
支持的过滤器/表达式包括 *
用于匹配任何文件名模式,**
用于递归匹配所有子目录,以及 ?
用于替换任意单个字符。包含多个字符的方括号将匹配方括号内的任意一个字符(例如,[abc]
将匹配 a
或 b
但不匹配 aa
),并且花括号可以用于匹配以逗号分隔的内容(例如,{abc,def}
)。
static-compress
支持以下过滤器表达式,它们都会匹配相同的文件 foo.bar
./relative/path/to/foo.bar
/absolute/path/to/foo.bar
相对路径/*/*/foo.ba?
**/foo.bar
**/foo.ba[rz]
**/{foo|something}.bar
重要提示:请确保将表达式放在双引号中,以防止您的shell将表达式进行通配符匹配! 例如,使用 static-compress "*.html"
而不是 static-compress *.html
。后者可能导致参数溢出,并且不会使用 static-compress
的智能通配符匹配,而是依赖于您的shell来展开通配符!
支持的压缩方法
目前,static-compress
支持通用压缩算法 gzip
和 brotli
,用于压缩网页内容。几乎所有目前使用的Web服务器和Web浏览器都完全支持 gzip
。 brotli
是由 Google 开发的一种较新的网络压缩格式 Brotli,它可以实现比 gzip
更高的压缩级别,尽管压缩对服务器的性能影响更大。因此,能够预先压缩给定的目录树,而不是每次请求时(重新)压缩文件,是非常有吸引力的。
static-compress
还支持 zopfli,它类似于 gzip -11
(《我们只是在开玩笑!》)。唯一的问题是 zopfli 非常慢,绝对不打算用于动态压缩。同样,这也是另一个预压缩是最佳选择的地方,而 static-compress
使准备目录树以提供 zopfli 压缩版本的其内容变得容易。与 brotli 不同,zopfli 与 gzip 兼容,这意味着任何支持 gzip 解压缩的浏览器也支持 zopfli - 但 zopfli 在压缩速度上更慢,并且通常无法实现 brotli 当前所实现的相同压缩率。(考虑到与 90 年代的浏览器良好兼容性的要求,它在所做的事情上做得很好。)
从版本 0.3 开始,static-compress
还增加了对图像压缩的 webp 支持。在我们的测试中,我们使用大约 15,000 张 PNG 和 JPG 格式的图像对 NeoSmart 网站的语料库进行了测试,以 90(static-compress
中 webp 的默认 --quality
参数)作为质量参数的 webp 压缩将文件大小减少了 65%,而没有明显增加损坏。
操作模式
static-compress
是一个用于日常网页部署和系统管理任务的智能压缩工具。使用 static-compress
的全部意义在于与那些非常脆弱且过于复杂的批处理脚本(如使用 find
与 mtime
,gzip|brotli
,parallel
,touch
等操作)相比,目的是使生活更加便捷,结果更加便携和确定。可以安全地在任何目录树上运行 static-compress
,默认情况下它
- 仅压缩以前未静态压缩的文件(它将文件的静态压缩副本的修改日期设置为与原始文件匹配,只有当它们不匹配时才重新压缩),
- 不会压缩已压缩的文件(即不会将预压缩的
.gz
文件重新压缩为.gz.br
), - 可以根据需要配置使用尽可能多的或尽可能少的线程进行同时压缩,
- 可以用来压缩整个目录树(
static-compress "**"
)或仅匹配特定扩展名的文件(static-compress "**/*.html"
)或仅匹配特定前缀或子路径(static-compress "**/tocompress/*"
)
Web 服务器配置
给定一个子目录 optimized
,其内容已通过 static-compress optimized/**
和 static-compress optimized/** -c brotli
以 gzip
和 brotli
格式预压缩,配置您的 Web 服务器以使用原始文件的静态预压缩版本的说明如下
nginx
要服务 gzip
压缩文件,nginx 必须在构建时使用 ngx_http_gzip_static_module
模块(默认分发版中包含)通过指定 --with-http_gzip_static_module
。之后,可以使用以下配置
location optimized {
gzip_static on;
}
要服务 brotli
压缩文件,nginx 必须在构建时使用 ngx_brotli
模块(可单独获取)通过指定 --add-module ../ngx_brotli
。之后,可以使用以下配置
location optimized {
brotli_static on;
}
如果已安装 ngx_brotli
和 ngx_http_gzip_static_module
模块,则可以在同一个 location
块中安全地使用这两个指令
location optimized {
brotli_static on;
gzip_static on;
}
请注意,这两个模块(brotli_types
和 gzip_types
)的文件类型选项不适用于静态选项;所有文件,即使这些选项没有指定用于动态压缩,也可以以这些格式提供服务,如果同一目录中存在具有相同名称的 .br
或 .gz
文件。
致谢、作者、许可和版权
static-compress
在MIT许可协议下免费向公众提供。 static-compress
是开源的,没有 flate2
和 zopfli
库的作者,以及 brotli
、gzip
和 zopfli
算法的原始创建者的贡献,这项工作将不会实现。
static-compress
由 Mahmoud Al-Qudsi 编写 <[email protected]>,在 NeoSmart Technologies 的管理下。名称 static-compress
和 MIT 许可证未授予的所有其他权利均由 NeoSmart Technologies 保留,版权所有,2017。
依赖关系
~12–22MB
~285K SLoC