Как улучшить SPA для удобства пользователей и выгоды бизнеса
Разбираемся, как сделать одностраничное приложение лучше и удобнее.
 
 
Напомним, что SPA (англ. Single Page Application — одностраничное приложение) — это сайт, для работы которого не требуется обновление страницы, потому что все данные загружаются с помощью скриптов.
SPA становится всё больше, но не все из них достаточно хороши для пользователей и способны работать на благо бизнеса. У нас уже есть статья о том, как создаются одностраничные приложения. Сейчас же мы поделимся советами по улучшению таких сайтов.
Заранее подгружайте контент для ленты
Лента контента — это список статей в блоге, комментарии пользователей и изображения. В большинстве случаев она устроена так:
- Пользователь заходит на страницу и видит только часть ленты — 
 10–20 публикаций.
- Когда он доходит до конца ленты, там появляется кнопка «Загрузить ещё». При нажатии на эту кнопку загружается ещё порция контента. И так до бесконечности.
Обычно после нажатия на кнопку приложению нужно какое-то время, чтобы отправить запрос на сервер и подгрузить новый контент. Чтобы пользователь не замечал этого, лучше загружать всё заранее — в момент, когда он почти дочитал страницу до кнопки.
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, есть огромное количество нюансов. И именно знание всех деталей отличает профессионала своего дела от обычного разработчика.
 Все
                                Все
                             Истории
                                        Истории Дизайн
                                    Дизайн Код
                                    Код Геймдев
                                    Геймдев Бизнес
                                    Бизнес Маркетинг
                                    Маркетинг Управление
                                    Управление Кино
                                    Кино Музыка
                                    Музыка Проектная фотография
                                    Проектная фотография Развитие
                                    Развитие Здоровье
                                    Здоровье Деньги
                                    Деньги Образование
                                    Образование EdTech
                                    EdTech Корп. обучение
                                    Корп. обучение Блог Skillbox
                                    Блог Skillbox Глоссарий
                                        Глоссарий Спецпроекты
                                        Спецпроекты Профориентация
                                        Профориентация 
                                     
			 
                     
     
                                     
                                     
                                     
                                    