Новый подход к решению старых проблем


Отзывчивый веб-дизайн

Поскольку прошло уже несколько лет с тех пор, как отзывчивый веб-дизайн был на слуху, вспомним, что это такое.

Отзывчивый веб-дизайн (RWD) — это установка, в которой сервер всегда посылает один и тот же HTML-код на все устройства, а CSS используется для изменения отображения страницы на устройстве.

Отзывчивый дизайн предоставляет один и тот же код для всех устройств, который адаптируется под размеры экрана.
— Google — Отзывчивый веб-дизайн

За что мы его любим

Рассмотрим причины популярности отзывчивого веб-дизайна:

  • С его помощью пользователи могут с легкостью обмениваться и связываться с содержимым, используя один URL-адрес.
  • С его помощью алгоритмы Google назначают свойства индексации для страницы без необходимости сигнализировать о наличии соответствующих компьютерных/мобильных страниц.
  • Требует меньше времени на поддержку нескольких страниц для одного и того же содержимого.
  • Уменьшает возможность возникновения распространенных ошибок, влияющих на мобильные сайты.
  • Не требует перенаправления пользователей для получения оптимизированного для устройства представления, что сокращает время загрузки. Помимо этого, перенаправление, основанное на пользовательском агенте, подвержено возникновению ошибок и может ухудшить работу сайта.
  • Сохраняет ресурсы при сканировании сайта с помощью Googlebot. Для страниц с отзывчивым веб-дизайном один пользовательский агент сканирует страницу один раз. Нет необходимости сканировать страницу несколько раз с различными пользовательскими агентами Googlebot для получения всех версий содержимого. Благодаря улучшению эффективности сканирования Google может индексировать большую часть содержимого сайта, а также сохранять его свежим.

Для веб-сайтов, ориентированных на содержимое, значительно преобладают аргументы “за” отзывчивый веб-дизайн, поскольку он решает множество проблем.

Также благодаря тому, что отзывчивый веб-дизайн требует меньше времени для технического обслуживания, он идеально подходит для веб-приложений, ориентированных на рабочий поток.

Но в чем же проблема?

Долгое время я считал, что отзывчивый веб-дизайн — это идеальный подход для всех веб-сайтов и веб-приложений, пока не столкнулся с проблемой дизайна.

Автозаполнение окна ввода сочетает в себе выбор и автозаполнение поиска. В качестве примера можно привести выбор отправления и назначения для полетов в Google Flights на компьютере:

На iOS (iPhone) это выглядит следующим образом:

Примечания:

  • В этом веб-приложении решения дизайна для компьютерной и мобильной версий значительно отличаются: на рабочем столе используется выпадающий список, а на мобильном устройстве — полностью новый экран
  • При наличии экранной клавиатуры на мобильном устройстве практически невозможно использовать выпадающее окно из-за ограничений высоты экрана. По сути, окно выбора автоматически отображается в качестве выпадающего окна на компьютерном экране и в качестве модального на мобильном устройстве (как на iOS, так и на Android)
  • Из-за существенной разницы между двумя решениями дизайна возникают трудности при их реализации в качестве единого технического решения
  • Этот пример немного ироничен, поскольку Google Flights — это продукт от Google

Новые решения

Узнав о возможности создания абсолютно разных решений дизайна для компьютерной и мобильной версий, я начал встречать все больше подобных примеров. Например, во многих приложениях на iOS есть панель вкладок (Tab Bar), что является примером мобильного дизайна.

Примеры Design-фреймворков

Design-фреймворк от Google, Material Design, руководствуется принципами отзывчивого веб-дизайна.

Material Design поддерживает один и тот же пользовательский интерфейс на различных платформах, который использует общие компоненты для Android, iOS, Flutter и сети.

Интересный факт: время от времени в Material Design встречаются исключения в использовании этого подхода. К примеру, была установлена панель приложения (App Bar) только для мобильных устройств.

Также относительно новый фреймворк Ant Design предоставляет два абсолютно разных решения для компьютерной и мобильной версий.

  • Ant Design: флагманское предложение от Ant Design для компьютерных устройств
  • Ant Design Mobile: менее известное и более грубое решение для мобильных устройств

Трудности, связанные с двумя решениями дизайна

Предположим, что мы применяем два абсолютно разных решения для компьютерной и мобильной версий и используем библиотеки Ant Design. В таком случае существует два подхода.

Можно создать два разных приложения: для мобильных устройств и для компьютера. В таком случае можно столкнуться со следующими трудностями:

  • Направление пользователя к верному приложению
  • Избежание дупликации кода между, например, данными и бизнес-логикой

Также можно создать одно приложение и поменять местами компоненты между компьютерной и мобильной версией с помощью программы. В этом случае могут возникнуть такие проблемы, как слабая производительность и раздутость приложения. Например, при переносе кода на компьютер или на мобильное устройство.

Преимущества обоих подходов

Одна из особенностей современной веб-разработки — это разделение кода (code splitting).

  • По мере роста приложения bundle также продолжает расти, особенно при использовании больших сторонних библиотек. Следует внимательно следить за кодом, который вы добавляете в bundle, чтобы избежать перегрузки приложения и увеличения времени загрузки.
  • Во избежание большого bundle стоит начать “разделять” его. Функция разделения кода поддерживается такими бандлерами, как Webpack и Browserify (через factor-bundle), с помощью которых можно создать несколько bundles, автоматически загружающихся во время выполнения.

— React — Code-Splitting

Благодаря разделению кода можно с легкостью загрузить различные компоненты в зависимости от окружения (компьютерная или мобильная версии) и совместно использовать общий код без снижения производительности из-за больших размеров bundle.

Рабочий пример разделения кода с двумя Design-библиотеками

Для демонстрации этого подхода с Ant Design и Ant Design Mobile, я создал простой пример, использующий компонент Ant Design Button при работе на компьютере:

И Ant Design Mobile Button на мобильном устройстве:

Проверив bundles, получаем следующее:

Общие Bundles между мобильной и компьютерной версиями:

  • runtime~main.96bfae96.js (3.12 KB): Приложение
  • main.fb445a75.chunk.js (1.5 KB): Приложение
  • 5.3ddca9df.chunk.js (114.75 KB): Библиотеки Vendor, например, React
  • 0.f0876085.chunk.js (18.53 KB): Babel Core

Дополнительные Bundles для компьютерной версии:

  • 2.fb734486.chunk.js (273 B): Приложение
  • 4.9dd7575f.chunk.js (516.21 KB): Библиотеки Vendor, например, Ant Design

Дополнительные Bundles для мобильной версии:

  • static/js/3.5a0b0e9a.chunk.js (275 B): Приложение
  • static/js/6.6b8e79a9.chunk.js (15.65 KB): Библиотеки Vendor, например, Ant Design Mobile

Примечания:

  • В текущем релизе Ant Design существует такаяпроблема, как включение всех SVG-иконок в bundle
  • В этой реализации приложение загружает только один из дополнительных компьютерных или мобильных bundles
  • В этом примере для разделения кода используется библиотека react-loadable
  • Вместо использования react-app-rewired, как советуют в документации Ant Design, в этом примере используется реализация пользовательского Create React App с поддержкой Ant Design и мобильной версии Ant Design

Заключение

С помощью разделения кода можно эффективно дополнить подход отзывчивого веб-дизайна и создать приложение, полностью оптимизированное как для компьютерной, так и для мобильной версии.


Перевод статьи John Tucker: The Challenges of Responsive Web Design

Предыдущая статьяШаблоны функционального программирования. Рецепты
Следующая статьяНавигация в приложениях Flutter