PNG可以通过为给定的图像选择更好的压缩算法进行无损优化,以减少其文件大小。 节省的费用可能很可观,比如50%(特别是对于macOS屏幕截图)。 这是一个让网站加载更快的简单方法。
在很长一段时间里,我使用pngcrush,它工作得很好,但它的CLI有点笨重,而且它不支持像并行处理这样的好功能。
我最近发现oxipng是一个现代的、基于Rust的替代品。 它非常棒!我发现它可以进一步缩小PNG,而且由于它使用了线程,速度更快。
我想在pre-commit下运行oxipng,这样,每次我把PNG添加到我的仓库时,它都会在提交前被优化。 为了创建pre-commit钩,我采取了三种不同的配置方式。
(如果你只想设置oxipng,请跳到第三层。)
第一层:本地版本库钩子
最初我把 oxipng 和 cargo 一起安装,并使用预提交系统钩子。
repos:
- repo: local
hooks:
- id: oxipng
name: oxipng
entry: oxipng
language: system
types: [png]
这对个人使用很有效,但对团队来说并不理想。 每个开发者都要自己安装和更新oxipng,而且不同的开发者可能使用不同的版本。 另外,整个钩子的定义需要复制到每个版本库。
所以最好是在一个单独的仓库中使用配置,这样可以预先提交来处理孤立的安装和更新。 这就是我接下来的做法。
第二层:镜像版本库
我在我的账户上建立了一个 "镜像 "仓库,adamchainz/pre-commit-oxipng。 其中包含一个 .pre-commit-hooks.yaml文件,告诉pre-commit在一个单独的环境中安装oxipng ,以及如何运行钩子。 然后项目库可以像这样使用它。
- repo: https://github.com/adamchainz/pre-commit-oxipng
rev: v5.0.1
hooks:
- id: oxipng
我用pre-commit-mirror-maker制作了这个仓库。 这是一个小工具,可以创建钩子配置,并在底层工具的新版本发布时更新它。 它用于 "官方 "镜像仓库,如mirrors-mypy。
我的oxipng镜像工作得很好,但很遗憾,它需要一个独立的版本库,每天运行镜像制作者来拉入新的版本。 如果上游工具库能够维护配置,那就更容易了...
第三层:上游收录
我在官方的oxipng软件库上开了一个问题,问它是否可以包括 .pre-commit-hooks.yaml创建者Josh Holmer回答说可以,于是我就向Rust项目提出了我的第一个拉动请求。
所以现在你可以像这样在pre-commit下使用oxipng。
- repo: https://github.com/shssoichiro/oxipng
rev: acdd66b4c5a5fda8b08281ad9b3216327b6847b4
hooks:
- id: oxipng
这需要Rust--安装它的标准方法是用rustup。
上面的rev 是添加了钩子配置的提交SHA。当有新的oxipng 版本时。 pre-commit autoupdate会将SHA更新为新的标签。
需要注意的是:优化版本库中的所有 PNG 是很昂贵的,而且在它们被优化后也相当无意义。 你可能想在你的 CI 系统中跳过 oxipng,只在提交时运行它。 在pre-commit.ci上像这样声明它被跳过。
ci:
skip:
- oxipng
在其他 CI 系统上,或在本地运行时,使用 pre-commit 的SKIP 环境变量。
$ SKIP=oxipng pre-commit run --all-files