О HTTP / 2

HTTP / 2 или H2 - это основная версия протокола HTTP, используемого во всемирной паутине. Он основан на экспериментальном протоколе SPDY, разработанном Google, и направлен на ускорение интернет-обмена между клиентами и серверами.
Все основные браузеры поддерживают HTTP / 2 уже несколько лет, как вы можете видеть в разделе Могу ли я использовать . В 2019 году большинство современных стартапов SAAS GAFA / NATU уже использовали его для своих продуктов и услуг (по состоянию на сентябрь 2019 года 41,0% из 10 миллионов веб-сайтов поддерживали HTTP / 2).

Google и IETF даже уже работают над протоколом на основе UDP под названием QUIC, недавно переименованным в HTTP / 3 или H3. Chrome и Mozilla Firefox уже поддерживает его, но пока давайте сосредоточимся на H2.

Преимущества HTTP / 2

В большинстве случаев HTTP / 2 значительно быстрее HTTP / 1.1 и настоятельно рекомендуется Google для повышения производительности и оптимизации SEM, как вы можете видеть в Lighthouse. Причины тому:

  • HTTP / 2 - это двоичный протокол поверх TCP, поэтому передача данных более компактна и менее подвержена ошибкам, чем текстовые протоколы (например, HTTP / 1.1).
  • HTTP / 2 мультиплексирован, что означает, что он поддерживает несколько запросов в одном соединении и, таким образом, сокращает количество операций установления связи между сервером и клиентом. HTTP / 1.1 ограничен одним запросом на соединение.
  • HTTP / 2 использует сжатие заголовков defacto, используя HPACK в качестве формата сжатия для эффективного представления заголовков HTTP.
  • HTTP / 2 представил HTTP / 2-Push, который позволяет серверу автоматически помещать в кэш клиента ресурсы, которые потребуются странице, без дополнительных запросов со стороны клиента.

А как насчет Next.js и Express?

Node.js представил встроенную поддержку HTTP / 2 через http2 встроенный пакет в своей версии 8 июля 2017 года в качестве экспериментальной функции и в качестве стабильной функции в Node.js 10 LTS.

Next.js - это известный фреймворк для рендеринга на стороне сервера, использующий Node.js и React для создания быстрых, предварительно обработанных и оптимизированных веб-сайтов или веб-приложений на основе React. К сожалению, начиная с версии 9 Next.js еще не поддерживает HTTP / 2.

Наше решение для HTTP / 2 будет использовать возможность Next.js, чтобы мы могли определить собственное серверное приложение:

  • использование express для создания гибкой структуры маршрутизации
  • в сочетании с spdy для создания сервера HTTP / 2

Помимо имени, пакет spdy обеспечивает поддержку как HTTP / 2 (H2), так и spdy (2,3,3.1), совместим с Express и предоставляет естественный интерфейс http module и резерв для обычного https.

Давайте углубимся в реализацию

Вот шаги, которые мы собираемся предпринять:

  • 1. Настройте проект и создайте интерфейс с двумя простыми страницами.
  • 2. Создайте сертификат SSL для локальной разработки.
  • 3. Создайте собственный сервер с помощью next.js + express + spdy.
  1. Настройте проект и интерфейс
    Начните с инициализации пакета npm и создания приложения next.js с двумя основными статическими страницами:
mkdir next-express-h2-app
cd next-express-h2-app
npm init
npm install next react react-dom express spdy compression --save
npm install cross-env --save-dev

Создайте папку pages и два файла внутри, index.js и about.js

2. Создание локального SSL-сертификата для разработки
Поскольку ни один из основных браузеров не поддерживает HTTP / 2 без шифрования, вам понадобится генерировать локальные SSL-сертификаты даже для разработки. С OpenSSL это сделать довольно просто.

Перейдите в корень вашего проекта и используйте эту команду для создания двух файлов, которые мы будем использовать для запуска сервера в разработке:

openssl req -x509 -newkey rsa:2048 -nodes -sha256 -keyout privateKey.key -out certificate.crt

3. Создайте собственный сервер
. Теперь создайте server.js файл в корне вашего проекта и начните с создания классического приложения Next.js:

Затем настройте свой закрытый ключ и сертификат, которые мы скоро настроим в spdy:

Теперь мы воспользуемся пакетом compression для настройки сжатия тела запроса. HTTP / 2 обеспечивает встроенную поддержку сжатия заголовков HTTP, но, как правило, рекомендуется также сжимать тело запросов, поскольку оно часто состоит из текста или сжимаемых данных:

Затем мы воспользуемся API Next.js, чтобы подготовить приложение и настроить с ним express и spdy:

app.prepare().then(() => {
  // express setup
  // spdy setup
}

Для конфигурации express мы собираемся использовать довольно простую стратегию маршрутизации в этом примере, но суть использования express в том, что вы, очевидно, можете использовать более продвинутые стратегии экспресс-маршрутизации и экспресс-функции в зависимости от ваших потребностей:

И наконец, настраиваем spdy сервер:

Заключение

Теперь вы можете запускать свое приложение, используя сценарии npm:

  • сначала создайте его с npm run build
  • и начните с npm run dev

Если вы хотите протестировать его с помощью оптимизированной для производства сборки, просто сделайте то же самое с

  • npm run release
  • npm run start

Открыв консоль разработчика Chrome на https://localhost:3000, вы увидите, что протокол, используемый для обслуживания содержимого, теперь обозначен как h2:

Полный код можно найти здесь:



Благодарим @chabou и @ Жюля Маркуэля за обзор этой истории.