Як використовувати стратегію користувацьких версій для ресурсів
Дата оновлення перекладу 2024-05-29
Як використовувати стратегію користувацьких версій для ресурсів
Версіонування ресурсів - це техніка, яка покращує продуктивність веб-додатків, додаючи ідентифікатор версії до URL статичних ресурсів (CSS, JavaScript, зображення та ін.). Коли змість ресурсу змінюється, його ідентифікатор також змінюється, щоб змусити браузер завантажити його наново, замість повторного використання кешованого ресурсу.
Якщо вашому додатку необхідно просунуте версіонування, на кшталт генерування версії динамісно, засновуючись на деякій зовнішній інформації, ви можете створити власну стратегію версій.
Note
Symfony надає різні реалізації, що відключають кешування, за допомогою опцій конфігурації version , version_format , і json_manifest_path .
Створення власної стратегії версій
Наступний приклад демонструє, як створити стратегію версій, сумісну з
gulp-buster. Цей інструмент визначає файл конфігурації під назвою
busters.json
, який зʼєднує кожний файл ресурсу з його хешем змісту:
1 2 3 4
{
"js/script.js": "f9c7afd05729f10f55b689f36bb20172",
"css/style.css": "91cd067f79a5839536b46c494c4272d8"
}
Реалізація VersionStrategyInterface
Стратегії версій ресурсів - це PHP-класи, які реалізують VersionStrategyInterface. У цьому прикладі, конструктор класу бере в якості аргументів шлях до файлу маніфесту, згенерованого gulp-buster і формат згенерованого рядку версії:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
// src/Asset/VersionStrategy/GulpBusterVersionStrategy.php
namespace App\Asset\VersionStrategy;
use Symfony\Component\Asset\VersionStrategy\VersionStrategyInterface;
// src/Asset/VersionStrategy/GulpBusterVersionStrategy.php
namespace App\Asset\VersionStrategy;
use Symfony\Component\Asset\VersionStrategy\VersionStrategyInterface;
class GulpBusterVersionStrategy implements VersionStrategyInterface
{
private string $format;
/**
* @var string[]
*/
private array $hashes;
public function __construct(
private string $manifestPath,
?string $format = null,
) {
$this->format = $format ?: '%s?%s';
}
public function getVersion(string $path): string
{
if (!is_array($this->hashes)) {
$this->hashes = $this->loadManifest();
}
return $this->hashes[$path] ?? '';
}
public function applyVersion(string $path): string
{
$version = $this->getVersion($path);
if ('' === $version) {
return $path;
}
return sprintf($this->format, $path, $version);
}
private function loadManifest(): array
{
return json_decode(file_get_contents($this->manifestPath), true);
}
}
Реєстрація сервісу стратегії
Після створення стратегії PHP-класу, зареєструйте його в якості сервісу Symfony.
1 2 3 4 5 6
# config/services.yaml
services:
App\Asset\VersionStrategy\GulpBusterVersionStrategy:
arguments:
- "%kernel.project_dir%/busters.json"
- "%%s?version=%%s"
Нарешті, підключіть нове версіонування ресурсів для всіх ресурсів додатку або лише для деяких пакетів ресурсів , завдяки опції version_strategy :
1 2 3 4 5
# config/packages/framework.yaml
framework:
# ...
assets:
version_strategy: 'App\Asset\VersionStrategy\GulpBusterVersionStrategy'