Одностраничные приложения и подводные камни их оптимизации

Автор статьи
Анастасия Осипенко
Май 27, 2021
14 мин - время чтения

При создании сайтов и веб-приложений обычно используется несколько языков программирования и разметки: HTML — для статичного контента, CSS — для стилей и JavaScript — для интерактивных элементов. Именно благодаря JavaScript на сайты можно добавлять всплывающие диалоговые окна, динамические переключатели и т. п. Подавляющее большинство сайтов в той или иной мере использует JavaScript — сложно представить активно посещаемый ресурс без интерактивного контента.

Отдельный тренд разработки, основанный на возможностях JavaScript, — одностраничные приложения (single-page application, SPA). «Традиционные» сайты и веб-приложения запрашивают все ресурсы (HTML, CSS, JS) у сервера отдельно для каждой загрузки страницы или ее обновления в браузере. Одностраничные приложения работают по-другому: от сервера им нужна только начальная загрузка, а за все последующие загрузки и перезагрузки страниц отвечает браузер. Перенос логики на браузер приводит к улучшенным показателям скорости и пользовательского опыта, но может негативно влиять на поисковое продвижение.

В этой статье мы расскажем о специфике одностраничных приложений и методах их оптимизации.

В чем особенность одностраничных приложений

Одностраничные приложения переносят рендеринг страниц с сервера на браузер. Для создания таких приложений используют разные фреймворки JavaScript, чаще всего React, Angular или Vue. Эти фреймворки продолжают развиваться, появляются новые, их поддержка различных библиотек и API постоянно растет — потому что технология SPA очень выгодна для навигации и активного взаимодействия с веб-контентом. Неудивительно, что многие популярные сайты используют архитектуру одностраничных приложений: Twitter, Pinterest, Airbnb и другие.

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

Принцип работы одностраничных приложений (SPA)

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

В чем сложность оптимизации одностраничных приложений

До того как JavaScript стал доминировать в веб-разработке, поисковые системы сканировали только HTML-данные. Последние годы Google постоянно работает над тем, чтобы лучше понимать JS-ресурсы на веб-страницах. Возможности поисковика улучшаются, но поисковые роботы до сих пор не могут в полной мере оценивать контент одностраничных приложений.

Другие поисковики почти не предоставляют информации о том, как они сканируют одностраничные приложения. Но мы с точностью можем сказать, что любые сайты, базирующиеся на JavaScript, представляют сложность для поисковых роботов. И если Google совершенствует свои алгоритмы и предоставляет официальные руководства по оптимизации SPA, ранжирование в других поисковиках будет более проблемным. 

Эксперимент Moz 2017 года показал, что только Google и Ask способны сканировать JS-контент. Кроме Google, Bing дает рекомендации для оптимизации одностраничных приложений — включающие предварительный рендеринг на стороне сервера.

Поисковым роботам сложно сканировать сайты на JavaScript

Проблемы сканирования одностраничных приложений

Легко сканируемые поисковыми роботами HTML-файлы не содержат много информации в случае одностраничных приложений. HTML ссылается на отдельный JavaScript-файл через атрибут <script> src — и именно этот файл отвечает за весь контент и функционал SPA. Браузер считывает JS-файл и динамически загружает контент в зависимости от действий реальных пользователей — поисковой бот не может действовать так же и ему доступен только статический контент.

Google объявил о разработке функционала для понимания JavaScript еще в 2014 году. В 2018-м аналитики Google рассказали о двух волнах индексации для веб-страниц на JavaScript: Googlebot возвращается к странице, чтобы повторно ее отрендерить, когда у него есть ресурсы на это. Для рендеринга JavaScript нужны более высокие производительность и память, и это замедляет процесс индексирования. В 2019 году представители Google объясняли, что на самом деле процесс не такой и долгий — им нужно в среднем 5 секунд, чтобы веб-страница на JavaScript была просканирована и отрендерена. 

Как Googlebot обрабатывает JavaScript

Хоть в 2020-м Мартин Сплитт объявил, что говорить о «двух волнах индексации» не совсем корректно (потому что механика работы Googlebot «более сложная»), понимание JS-ресурсов до сих пор является проблемой для поисковика. Даже сейчас контент, загружаемый через JavaScript-файл на стороне клиента (браузера), может быть просканированным и проиндексированным не полностью. А если поисковая система увидит не весь контент страницы, она не сможет определить, какого он качества и насколько соответствует поисковым интентам.

Проблемы с 404 ошибкой

В одностраничных приложениях не работает стандартная логика страниц с разными ответами кода сервера, отличными от 200, в частности 404. Сервер возвращает 200 HTTP-статус на каждый запрос, так как рендеринг происходит на стороне браузера и сервер не может определить любой другой ответ. Получается, что каждый запрос является открытым к индексированию — даже ошибочный.

Трудности отслеживания аналитики

Google Analytics и другие инструменты сбора аналитики беспроблемно работают с «традиционными» сайтами и веб-приложениями: специальный код запускается при каждой загрузке страницы, засчитывая таким образом каждый просмотр. Из-за того что в одностраничных приложениях нет технического разделения на страницы и сервер не получает запрос при каждом переходе или перезагрузке страницы, код сбора аналитики не работает. Существуют инструменты решения этой проблемы (мы расскажем о них далее) — но они добавят вам хлопот.

Оптимизация одностраничных приложений

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

Карта сайта

Корректно оформленный xml-файл с картой сайта во многом облегчает работу краулеров. Это не поможет Google или другим поисковикам проиндексировать JS-ресурсы, но поможет понятьструктуру сайта.

«Аудит сайта» в SE Ranking проверяет наличие карты сайта и обнаруживает возможные ошибки ее настройки:

Ошибки карты сайта в «Анализе сайта»

Рендеринг на стороне сервера

Поисковые системы рекомендуют использовать рендеринг на стороне сервера — он подразумевает, что сервер загружает контент каждой веб-страницы и передает его браузеру. Такой подход позволяет поисковым ботам сканировать любой контент, даже основанный на JavaScript. Одностраничные приложения жертвуют таким способом рендеринга ради скорости загрузки — именно рендеринг на стороне клиента (браузера) делает SPA такими быстрыми и интерактивными, а также более простыми в разработке. Но существуют решения, которые позволяют найти баланс между сервером и браузером.

Изоморфный JavaScript

Изоморфный («универсальный») JavaScript — одно из возможных решений для одностраничных приложений. Особенность приложений, созданных с помощью изоморфного JavaScript, — способность загружаться и на стороне сервера, и на стороне браузера. Пользователи взаимодействуют с приложением так, как бы и взаимодействовали при рендеринге браузером, но при этом они используют HTML-файл, сгенерированный сервером. Благодаря тому что изоморфный JS генерирует веб-страницы на сервере, краулеры смогут считать JS-файлы без задержки и в полной мере.

Специальные фреймворки помогают в разработке изоморфных веб-приложений — например, Next.js и Gatsby для React. Next.js генерирует HTML под каждый запрос, а Gatsby — статическую HTML-версию сайта. Подобным образом работает Nuxt.js для Vue, совершая рендеринг JS в HTML на сервере и отправляя данные браузеру.

Предварительный рендеринг

Предварительный рендеринг — еще одно решение для SPA. Благодаря этой технологии можно загружать и кэшировать все HTML-элементы на сервере, чтобы предоставлять статическую HTML-версию краулерам. Например, сервисы Prerender и BromBone перехватывают запрос и загружают страницы сайта в «нормальной», основанной на JavaScript форме для реальных пользователей и в кэшированной HTML-версии для поисковых ботов. Prerender доступен бесплатно для веб-приложений с менее чем 250 страницами, а для более масштабных ресурсов — по месячной подписке от $200. Все, что нужно сделать, — загрузить файл карты сайта, — и инструмент займется предварительным рендерингом. Аналогичное решение BromBone даже не требует карты сайта и стоит от $129 в месяц.

Кроме использования готовых решений предварительного рендеринга можно вручную настроить код одностраничного приложения так, чтобы поисковые боты получали статическую HTML-версию. Например, с помощью Headless Chrome (браузера без графического интерфейса) и библиотеки Puppeteer можно создать иерархическое дерево из HTML-файлов, содержащее все страницы. Затем нужно будет удалить код начальной загрузки и подредактировать файл конфигурации сервера, включив туда статический HTML для краулеров.

Принцип работы предварительного рендеринга

Прогрессивное улучшение

Обнаружение функций (feature detection) — одна из главных рекомендаций Google для одностраничных приложений. Эта технология — часть прогрессивного улучшения (progressive enhancement): простая HTML-страница, доступная для поисковых ботов, функционирует как основа, а все CSS- и JS-ресурсы добавляются в эту основу и могут быть включены и отключены в зависимости от поддержки браузером.

Чтобы задействовать такой метод, нужно написать отдельный код для проверки каждой функции и ее API на предмет совместимости с разными браузерами. Библиотеки типа Modernizr могут в этом помочь.

Представления (views) как URL-адреса

Одностраничное приложение содержит один файл index.html и технически функционирует как одна-единственная страница. Но разделы сайта, подгружаемые по запросу пользователя, выглядят как разные страницы. Обычно эти разделы изменяют URL-адрес с помощью хэша (например, http://website.com/#/about, http://website.com/#/contact). По якорному идентификатору URL-адреса JavaScript указывает браузеру, какой контент загружать.

Важно, чтобы поисковые системы воспринимали разные разделы одностраничного приложения как отдельные страницы. Для этого можно использовать History API — стандартный HTML5-метод манипулирования историей браузера. Google Codelabs рекомендует использовать History API вместо изменения URL-адреса через хэш. То есть этот API помогает использовать пути вместо хэшей и показывать краулерам разделы приложения как отдельные страницы.

Аналитик Google Мартин Сплитт дает такие же рекомендации. Кроме разделения URL-адресов с помощью History API он советует маркировать ссылки атрибутом href и прописывать уникальные теги title и description для каждого представления (view). Правильная разметка ссылок на сайте в целом очень важна: включайте их в тег <a> и используйте атрибут href вместо события onclick (потому что поисковые системы не смогут просканировать последнее). 

Отдельные «страницы» ошибки

Сервер не может обрабатывать ошибки для одностраничных приложений и всегда возвращает 200 код ответа. При этом пользователи могут ввести неправильный URL-адрес, заходя в одностраничное приложение, поэтому стоит разработать механику обработки ошибок. Google рекомендует создавать отдельные представления (views) для каждого кода ответа сервера (404, 500 и т.д.) и редактировать JS-файл, чтобы он направлял браузер к соответствующему представлению (каждое из которых будет восприниматься как отдельная страница ошибки).

Структурированные данные и разметка для социальных сетей

Оптимизации шеринга в социальных сетях часто не уделяют должного внимания — например, среди самых распространенных ошибок, обнаруженных в «Аудите сайта» SE Ranking, лидирует отсутствие разметки Twitter Cards. Использование Twitter Cards и Open Graph для Facebook облегчит распространение контента сайта в популярных социальных сетях, чем поможет улучшить поисковую видимость. Если не использовать специальную разметку, пользователям, которые захотят поделиться страницей вашего приложения, не будет подтягиваться релевантная картинка в качестве предпросмотра к ссылке.

Использование структурированных данных также очень важно для облегчения процесса сканирования. Schema.org предлагает унифицированные маркировки для разных типов информации (видео, рецепты, продукты и т. д.) — с их помощью поисковым роботам будет легче понимать контент страниц и создавать соответствующие спецэлементы. Вы можете проверить, корректно ли работают структурированные данные, в инструменте Rich Results Test.

Тестирование одностраничных приложений

Раньше инструмент Google для вебмастеров (Google Webmaster Tools) включал очень полезную возможность — Fetch as Google — позволяющую просмотреть HTML-код страницы в том виде, в каком его видит поисковик. Но в 2019 году этот функционал убрали — сейчас можно увидеть базовую информацию о сканировании и индексировании ресурса в разделе «Проверка URL» в Google Search Console: 

Проверка URL в Google Search Console

Также может помочь проверка мобильной оптимизации сайта в Google (Mobile-Friendly Test) — вы увидите отрендеренный HTML и список ресурсов, которые не загрузились поисковым роботом. Кроме этого, браузер без графического интерфейса Headless Chrome — хороший способ протестировать одностраничное приложение на предмет доступности JS-ресурсов. Наконец, не забудьте протестировать SPA в разных браузерах.

Уловки для отслеживания аналитики

Как мы уже говорили, стандартный код Google Analytics не работает с одностраничными приложениями, поэтому придется использовать дополнительные инструменты, чтобы определять и отслеживать каждое отдельное взаимодействие.

Совет от Google Analytics: настроить команду set со значением новой страницы — так система сможет выявлять каждый просмотр. Кроме этого, можно использовать плагины типа Angulartics, которые мониторят просмотры страниц в соответствии с пользовательскими переходами по ресурсу. Также можно задействовать Google Tag Manager и записывать реальные взаимодействия с помощью триггеров «Изменение в истории». Среди альтернативных решений — инструменты мониторинга реальных пользователей (real user monitoring, RUM).

Не забывайте о базовой SEO

Хоть у одностраничных приложений есть свои особенности, в корне меняющие некоторые подходы к оптимизации, базовые SEO-задачи остаются актуальными. Позаботьтесь о следующих аспектах вашего приложения: 

Проверка безопасности в «Анализе сайта»
  • Контент. Мы говорили о необходимости прописывать уникальные теги title и description для каждого просмотра на SPA (как это делается для каждой страницы на «традиционном» сайте). Но прежде всего нужно, чтобы контент вашего ресурса был оптимизирован: отвечал соответствующим запросам пользователей, имел продуманную структуру и удобную верстку, содержал действительно полезную информацию. Изначально нужно собрать семантическое ядро и потом наполнять сайт контентом.
  • Линкбилдинг. Обратные ссылки сигнализируют поисковым системам об уровне доверия внешних ресурсов к сайту. Бэклинки могут быть разного качества — одни существенно повышают ваши шансы ранжироваться выше, а другие (спамные или нерелевантные) могут, наоборот, навредить. Анализируйте показатели обратных ссылок и выстраивайте ссылочный профиль, опираясь на надежные внешние ресурсы, близкие вашему по тематике. 
  • Отслеживание конкурентов. Вы наверняка уже анализировали уровень конкуренции и главных игроков в своей нише. Вне зависимости от того, на каком этапе ваше приложение — разработки, запуска или развития, — нужно регулярно мониторить конкурентные ресурсы. С помощью автоматизированных инструментов вы можете с легкостью просматривать, какие стратегии конкурентов в органическом поиске и платной рекламе уже приносят результат.

Грамотный подход к одностраничным приложениям

Чтобы сделать свое одностраничное приложение понятным для поисковых систем, нужно прежде всего сделать его доступным для сканирования. Посетители SPA точно оценят сногсшибательную скорость, динамическую загрузку и беспрепятственную навигацию. Не забудьте и о поисковых роботах и предоставьте им статическую HTML-версию. Кроме того, позаботьтесь о корректной карте сайта, используйте отдельные URL-адреса вместо хэшей и внедряйте микроразметку.

А каков ваш опыт с одностраничными приложениями? Делитесь своими историями оптимизации в комментариях!

Подпишитесь на наш блог!

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

Спасибо!
Ура! Теперь вы подписаны на наш блог!
Пожалуйста, проверьте свой email и подтвердите подписку.