Новое в Symfony 6.3 — Early Hints

Источник: «New in Symfony 6.3: Early Hints»
В Symfony 6.3 добавлена поддержка Early Hints, что позволяет браузерам загружать ресурсы, пока серверы всё ещё готовят ответ. Это значительно улучшает воспринимаемую производительность.

Symfony 6.3 выйдет в конце мая 2023 года. Это первая статья из серии, в которой рассказывается о наиболее важных новых возможностях, представленных в Symfony 6.3.

Early Hints — это один из самых последних и эффективных методов улучшения воспринимаемой производительности ваших веб-сайтов и веб-приложений. Early Hints позволяют серверам сообщать браузерам, какие ресурсы (файлы CSS и JavaScript, веб-шрифты и т.д.) следует начать загружать, пока серверы всё ещё работают над созданием ответа.

С технической точки зрения, Early Hints — это ответ HTTP с кодом состояний 103 содержащий один или несколько заголовков HTTP, в которых перечислены ресурсы для загрузки или подключения. Например:

103 Early Hints
Link: <https://fonts.google.com>; rel=preconnect
Link: </main.css>; rel=preload; as=style
Link: </app.js>; rel=preload; as=script

Эти заголовки также включаются в ответ, который серверы отправят позже, чтобы ответить на запрос пользователя. Однако отправив их как можно скорее, браузеры могут начать их загрузку или подготовку к ним, что значительно улучшит воспринимаемую производительность. В статье от Cloudflare они показывают улучшения от 10% до 20% в зависимости от типа веб-сайта.

В Symfony 6.3 мы добавили поддержку Early Hints с помощью sendEarlyHints(), определённого в AbstractController:

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\WebLink\Link;

class HomepageController extends AbstractController
{
#[Route("/", name: "homepage")]
public function index(): Response
{
$response = $this->sendEarlyHints([
new Link(rel: 'preconnect', href: 'https://fonts.google.com'),
(new Link(href: '/main.css'))->withAttribute('as', 'stylesheet'),
(new Link(href: '/app.js'))->withAttribute('as', 'script'),
]);

// prepare the contents of the response...

return $this->render('homepage/index.html.twig', response: $response);
}
}

Метод sendEarlyHints() создаёт и отправляет первый HTTP-ответ (с кодом состояния 103) и возвращает объект Response, который необходимо использовать для отправки полного ответа позже. Ресурсы определяются через класс Link предоставляемый компонентом WebLink.

Вот и всё! Обновление контроллеров для отправки ресурсов в первую очередь ускорит загрузку ваших сайтов, что приведёт к большему количеству конверсий и более довольным посетителям. Однако есть одна загвоздка. Немногие серверы поддерживают функцию отправки сначала заголовка ответа, а затем содержимого ответа.

По состоянию на апрель 2023 года, и для приложений PHP эту функцию поддерживает только SAPI, предоставляемый PHP-сервером Franken. Надеемся, что другие веб-серверы и сервисы SaaS/PaaS вскоре добавят его поддержку.

P.S.

С 21 мая 2021 года, в репозитории php/php-src создан Pull Request на добавление функции headers_send_early_and_clear() для HTTP Early Hints в PHP. Возможно через несколько лет эта функция станет нативной в PHP…

Дополнительные материалы

Предыдущая Статья

Laravel 10: Пример CRUD с Tailwind CSS

Следующая Статья

Новое в Symfony 6.3 — Ограничение No­Suspicious­Characters