Как улучшить SPA для удобства пользователей и выгоды бизнеса

Разбираемся, как сделать одностраничное приложение лучше и удобнее.

Напомним, что SPA (англ. Single Page Application одностраничное приложение) — это сайт, для работы которого не требуется обновление страницы, потому что все данные загружаются с помощью скриптов.

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

Евгений Кучерявый

Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.


Заранее подгружайте контент для ленты

Лента контента — это список статей в блоге, комментарии пользователей и изображения. В большинстве случаев она устроена так:

  1. Пользователь заходит на страницу и видит только часть ленты —
    10–20 публикаций.
  2. Когда он доходит до конца ленты, там появляется кнопка «Загрузить ещё». При нажатии на эту кнопку загружается ещё порция контента. И так до бесконечности.

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

const loadBtn = document.getElementById("load-btn");

//Расстояние от кнопки, когда начинается подгрузка
const preloadArea = 500;

//Каждый раз, когда пользователь скроллит страницу, проверяем, как далеко он от кнопки
window.addEventListener("scroll", function (e) { CheckPosition(); });

function CheckPosition()
{
    //Если пользователь долистал до определённого расстояния от кнопки, загружаем контент
    if(window.scrollY > loadBtn.offsetTop - preloadArea)
    {
   	 PreloadContent();
    }
}

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

Заранее загружайте страницы, которые могут быть открыты

Проанализируйте, какие страницы чаще всего открывают ваши пользователи. Например, после прочтения статьи A они всегда переходят на статью B или после просмотра главной страницы всегда открывают раздел с контактами.

Чтобы ускорить переход по ссылкам, можно загружать связанные страницы:

function Init(page)
{
    //Загружаем текущую страницу
    var loaded = Load(page);

    //Если страница загрузилась успешно, загружаем связанные страницы
    if(loaded)
    {
   	 PreloadRelatedPages();
    }
}

Ещё одна идея — загружать страницу, когда пользователь наводит курсор на ссылку или кнопку, дочитывает до определённой части материала и так далее. Это тоже дополнительно ускорит работу сайта.

Не скачивайте все медиафайлы

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

Подгружайте только текст или код страниц, а для всех медиафайлов пользуйтесь ленивой загрузкой. Подробнее о ней — в статье «Как заставить сайт грузиться быстрее».

Открывайте страницу целиком

Многие одностраничные приложения состоят из HTML-файла, в котором нет ничего, кроме вёрстки и стилей со скриптами. Перейдя на такой сайт, пользователь сначала увидит пустую страницу. Контент появится только после того, как JavaScript обменяется данными с сервером.

Чтобы такого не происходило, стоит показывать пользователю страницу с уже готовым контентом.

<!DOCTYPE html>
<html>
    <head>
   	 <title>SPA</title>
   	 <link rel="stylesheet" type="text/css" href="app.css">
    </head>
    <body>
   	 <main>
   		 <?
   		 //Выводим контент страницы
   		 echo $pageContent;
   		 ?>
   	 </main>
   	 <script type="text/javascript" src="app.js"></script>
    </body>
</html>

Исключение составляют приложения, которые слишком большие, чтобы их загружать без задержек. Например: редакторы, игры, видеохостинги и так далее. Для таких сайтов стоит выводить сообщение в духе «Loading».

Ещё один вариант — выводить только ту часть страницы, которая будет видна пользователю, а остальное тут же подгружать скриптом.

Показывайте актуальные данные

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

Для ленты, например, можно написать вот такой скрипт:

//Указываем, что нужно раз в полсекунды проверять обновления
setInterval(Update, 500);

function Update()
{
    //Проверяем ID новейшей публикации
    let newId = GetNewestId();

    //Если он не совпадает с ID последней загруженной публикации, то нужно обновить страницу
    if(newId != lastId)
    {
   	 //Загружаем новый контент
   	 let data = Load(newId);
   	 lastId = newId;

   	 //Обновляем страницу
   	 pageContent.innerHTML = data.html + pageContent.innerHTML;
    }
}

Этот пример сильно упрощён, потому что он учитывает только одну новую публикацию; вам же нужно быть уверенным в загрузке всего, что успело появиться на сайте.

Заключение

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

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

Курс

Я — Веб-разработчик PRO


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

Хочешь получать крутые статьи по программированию?
Подпишись на рассылку Skillbox