brocode/module-image-optimizer

用于在 Magento2 中搜索特定图像文件并将其转换为其他格式的模块

1.0.0 2024-06-29 14:13 UTC

This package is auto-updated.

Last update: 2024-08-29 14:39:53 UTC


README

此模块应简化向 Magento 2 店铺添加新图像格式的过程,而无需修改任何模板或标记。

此模块的目标

  • 基础扫描器,用于扫描可能需要以现代格式(例如 /pub/media)提供的图像文件夹
  • 添加各种不同转换器的框架,以便可扩展到任何新的未来图像格式

"Buy Me A Coffee"

安装

composer require brocode/module-image-optimizer
bin/magento module:enable BroCode_ImageOptimizer
bin/magento setup:upgrade

在 Magento 2 店铺(或任何其他系统)中交付优化图像的想法

与通过任何直接通过 web 服务器可提供的文件的简单文件传输相比,当 PHP 进程涉及任何事物交付时,Magento 2 慢。这可以用来分离优化图像的转换和提供。

  1. 转换在 Magento2 环境中(或任何其他环境)进行,以确定哪些文件需要转换以及应将其转换为哪些文件。

  2. Web 服务器使用内部重写和文件检查,根据用户代理(浏览器 Accept-Header)的请求确定需要提供哪个文件。

以下 .htaccess 片段可以用于为某些目录提供 WEBP 图像(如果存在),同时提供原始图像

 ############################################
 ## if client accepts webp, rewrite image urls to use webp version
AddType image/webp .webp
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{REQUEST_FILENAME} (.*)\.(png|gif|jpe?g)$
RewriteCond %{REQUEST_FILENAME}\.webp -f
RewriteRule ^ %{REQUEST_FILENAME}\.webp [L,T=image/webp]

此 .htaccess 条目的背景信息

  • 为 webp 图像添加新的 MIME 类型
  • 检查浏览器是否接受 webp 图像
  • 检查请求的文件是否是 png、gif 或 jpeg 文件
  • 检查请求的文件是否存在 webp 文件
  • 将请求重写到 webp 文件

可以使用相同的方法对任何其他图像格式(例如,对于 AVIF,请使用 MIME 类型 image/avif)进行操作。

功能

图像文件夹扫描的 Cron 作业

扫描所有配置的图像文件夹,可以通过配置禁用。

配置

可以在 Stores -> Configuration -> Services -> BroCodeI ImageOptimizer 下禁用 cron 作业,默认情况下启用。

图像路径

cron 作业通过依赖注入接收 BroCode\ImageOptimizer\Api\Data\ImagePathProviderInterface ,它可以提供任何要扫描的目录。

<type name="\BroCode\ImageOptimizer\Cron\ImageScannerConverterCron">
    <arguments>
        <argument name="imagePathProviders" xsi:type="array">
            <item name="xmlConfigurable" xsi:type="object">BroCode\ImageOptimizer\Model\Data\XmlConfigurableImagePathProvider</item>
        </argument>
    </arguments>
</type>

已实现一个默认路径提供程序,它通过 di.xml 接收参数。当前设置是 pub/media 文件夹,自动将 Magento 基础文件夹添加到每个条目

<type name="BroCode\ImageOptimizer\Model\Data\XmlConfigurableImagePathProvider">
    <arguments>
        <argument name="paths" xsi:type="array">
            <item name="media" xsi:type="string">pub/media</item>
        </argument>
    </arguments>
</type>

转换挂钩

此模块为每个需要转换的图像提供事件挂钩。这是通过默认的 Magento 2 事件实现的,可以通过监听事件 brocode_convert_image 的观察器来使用。该事件存储以下数据,可以用于

$this->eventManager->dispatch(
    'brocode_convert_image',
    [
        'image_path' => $file->getPathname(),
        'converter_id' => $imageConvertValidator->getConverterId()
    ]
);

转换验证器

转换验证器检查在任何配置的路径中找到的给定图像是否需要转换以及可能用于它的转换器。每个验证器都必须实现 BroCode\ImageOptimizer\Api\Data\ImageConvertValidationInterface 。在抽象类 BroCode\ImageOptimizer\Model\Converter\AbstractImageConverter 中实现了用于文件检查的基本实现。

这些转换验证器需要通过 di.xml 贡献给 \BroCode\ImageOptimizer\Model\ImageConverterService

<type name="BroCode\ImageOptimizer\Model\ImageConverterService">
    <arguments>
        ...
        <argument name="imageValidator" xsi:type="array">
            <item name="avif" xsi:type="object">BroCode\ImageAvifOptimizer\Model\Converter\AvifImageConverter</item>
        </argument>
    </arguments>
</type>

图像转换

此模块中尚未实现图像转换,这是通过以下两个基本模块完成的

  • brocode/module-image-optimizer-avif(用于生成 AVIF)
  • brocode/module-image-optimizer-webp(用于生成 WEBP)

尽管存在默认的 BroCode\ImageOptimizer\Observer\InstantConvertImageObserver,它可以捕获转换事件并尝试使用任何贡献给 \BroCode\ImageOptimizer\Model\ImageConverterService 的转换器进行图像转换。

<type name="BroCode\ImageOptimizer\Model\ImageConverterService">
    <arguments>
        <argument name="imageConverter" xsi:type="array">
            <item name="avif" xsi:type="object">BroCode\ImageAvifOptimizer\Model\Converter\AvifImageConverter</item>
        </argument>
        ...
    </arguments>
</type>

这是同步执行的,会减慢相应的cron执行速度,特别是如果有很多图像时。

考虑使用扩展以使用 Magento 2 队列系统异步处理图像转换

  • brocode/module-image-optimizer-queue(默认 MySQL 队列,适用于没有激活 RabbitMQ 安装的商店)
  • brocode/module-image-optimizer-amqp(队列模块的扩展,用于配置 RabbitMQ 服务)