Сторінка з важкою статистикою віддається повільно: сервер не відправить відповідь, доки не порахує все. Deferred props дають змогу показати сторінку одразу, а дорогі дані довантажити окремим запитом.
return Inertia::render('Dashboard', [
'user' => $request->user()->only('id', 'name'),
'orders' => Inertia::defer(fn () => Order::recentFor($request->user())),
'stats' => Inertia::defer(fn () => Stats::heavy(), 'analytics'),
'chart' => Inertia::defer(fn () => Stats::chart(), 'analytics'),
]);
<script setup>
import { Deferred } from '@inertiajs/vue3';
defineProps({ orders: Array, stats: Object, chart: Object });
</script>
<template>
<Deferred data="orders">
<template #fallback><OrdersSkeleton /></template>
<OrdersTable :orders="orders" />
</Deferred>
<Deferred :data="['stats', 'chart']" #default="{ reloading }">
<template #fallback><div class="h-64 animate-pulse" /></template>
<Stats :class="{ 'opacity-50': reloading }" :stats="stats" :chart="chart" />
</Deferred>
</template>
Групи: за замовчуванням усі відкладені props довантажуються одним запитом після рендеру. Другий аргумент ('analytics') - назва групи: різні групи йдуть паралельними запитами, щоб повільна статистика не затримувала замовлення.
Помилки: Inertia::defer(fn () => ..., rescue: true) - виняток не ламає відповідь, prop пропускається, а помилка йде в звіт; у <Deferred> для цього слот #rescue з кнопкою повтору.
Once props - для даних, що рідко змінюються (тарифи, країни, курси валют):
'plans' => Inertia::once(fn () => Plan::all()),
'rates' => Inertia::once(fn () => ExchangeRate::all())->until(now()->addDay()),
Клієнт запам'ятовує значення, а наступні відповіді сторінок з цим prop його не обчислюють і не передають. fresh() примушує оновити, as('roles') дає спільний ключ для різних сторінок. Поєднується з відкладеними: Inertia::defer(...)->once().
Що враховувати:
- відкладене - не для SEO-важливого вмісту: у початковому HTML його немає;
- кожна група - окремий запит з повним стеком middleware;
- once props забуваються при переході на сторінку без них - і на наступній сторінці обчислюються знову;
- заглушка (
fallback) з тим самим розміром, що й вміст, - щоб сторінка не «стрибала».