Атрибут Isolate⚓︎
Атрибут #[Isolate] предотвращает объединение (группировку) запросов компонента с обновлениями других компонентов, позволяя ему выполняться параллельно.
Почему группировка важна⚓︎
Каждое обновление компонента в Livewire инициирует сетевой запрос. По умолчанию, когда несколько компонентов инициируют обновления одновременно, они объединяются в один запрос.
Это приводит к меньшему количеству сетевых подключений к серверу и может значительно снизить нагрузку на сервер. Помимо повышения производительности, это также открывает внутренние возможности, требующие взаимодействия между несколькими компонентами (Реактивные свойства, Связывание данных с помощью wire:model и т. д.).
Однако иногда желательно отключить эту группировку по соображениям производительности. Именно здесь на помощь приходит #[Isolate].
Базовое использование⚓︎
Примените атрибут #[Isolate] к любому компоненту, который должен отправлять изолированные запросы:
<?php
use Livewire\Attributes\Isolate;
use Livewire\Component;
use App\Models\Post;
new #[Isolate] class extends Component {
public Post $post;
public function refreshStats()
{
// Ресурсозатратная операция...
$this->post->recalculateStatistics();
}
};
С #[Isolate] запросы этого компонента больше не будут объединяться с обновлениями других компонентов, что позволит им выполняться параллельно.
Когда группировка помогает, а когда мешает
Группировка хороша для большинства сценариев, но если компонент выполняет ресурсозатратные операции, группировка может замедлить весь запрос. Изоляция такого компонента позволяет ему выполняться параллельно с другими обновлениями.
Когда использовать⚓︎
Используйте #[Isolate], когда:
- Компонент выполняет ресурсозатратные операции (сложные запросы, вызовы API, тяжелые вычисления).
- Несколько компонентов используют
wire:poll, и вы хотите иметь независимые интервалы опроса. - Компоненты прослушивают события, и вы не хотите, чтобы один медленный компонент блокировал остальные.
- Компоненту не нужно координировать свои действия с другими компонентами на странице.
Пример: Опрос компонентов⚓︎
Вот практический пример с несколькими опрашиваемыми компонентами:
<?php
use Livewire\Attributes\Isolate;
use Livewire\Component;
new #[Isolate] class extends Component {
public function checkStatus()
{
// Медленный вызов внешнего API...
return ExternalService::getStatus();
}
};
Без #[Isolate] медленный вызов API в этом компоненте задерживал бы другие компоненты на странице. С ним компонент выполняет опрос независимо, не блокируя остальные.
Ленивые компоненты изолированы по умолчанию⚓︎
При использовании атрибута #[Lazy] компоненты автоматически изолируются для параллельной загрузки. При необходимости вы можете отключить это поведение:
<?php
use Livewire\Attributes\Lazy;
use Livewire\Component;
new #[Lazy(isolate: false)] class extends Component {
// ...
};
Теперь несколько компонентов revenue будут объединять свои запросы ленивой загрузки в один сетевой запрос.
Плюсы и минусы⚓︎
Преимущества:
- Предотвращает блокировку обновлений других компонентов медленными компонентами.
- Обеспечивает истинно параллельное выполнение ресурсозатратных операций.
- Независимый опрос и обработка событий.
Недостатки:
- Больше сетевых запросов к серверу.
- Невозможность координации с другими компонентами в рамках одного запроса.
- Немного более высокие накладные расходы на сервере из-за нескольких подключений.