В чем разница между SPA и мультистраничным приложением
Что проверяют
Понимаете ли вы, где на самом деле проходит граница: кто собирает HTML и что происходит при переходе по ссылке. Следом почти всегда спрашивают про SEO и про то, куда в эту схему попадают Next.js и Nuxt.
Как отвечать
Начните с механики, а не с плюсов и минусов:
- MPA: каждый переход это новый запрос документа, сервер отдаёт готовый HTML, браузер выбрасывает старую страницу вместе с её состоянием и JS-контекстом;
- SPA: сервер отдаёт оболочку и бандл, дальше роутер перехватывает клики, меняет адрес через History API (
pushState) и дорисовывает экран из данных, пришедших поfetch.
Из механики выводятся последствия. SPA платит первой загрузкой: пока бандл не скачан и не выполнен, пользователь видит пустой экран, и это бьёт по LCP. Зато повторные переходы дешёвые, а состояние (плеер, черновик формы, открытый чат) переживает навигацию. MPA быстро показывает первую страницу и хорошо индексируется, но на каждом переходе заново грузит и исполняет общий код.
Дальше то, что в SPA приходится делать руками: восстановление скролла, перенос фокуса и объявление смены экрана для скринридеров, отправку просмотров в аналитику, правильные коды ответа. Сервер SPA на любой адрес отвечает 200, и несуществующая страница превращается в soft 404.
Закончите тем, что чистых вариантов сейчас мало. Next.js и Nuxt рендерят каждую страницу на сервере, а после гидратации навигация идёт как в SPA. Astro строит MPA с интерактивными островами. Обычный MPA сглаживают предзагрузкой через Speculation Rules и анимацией переходов между документами через View Transitions.
Где спотыкаются
Говорят, что SPA всегда быстрее. Быстрее только повторная навигация, и то если данные уже в кэше: запрос к API никуда не делся.
Путают SPA с React. React спокойно живёт в MPA как набор виджетов, а SPA можно написать вовсе без фреймворка.
Утверждают, что поисковики не видят SPA совсем, или наоборот, что Google давно всё рендерит и проблемы нет. Рендеринг JS у краулеров отложенный и у разных поисковиков разный, поэтому для публичных страниц серверный HTML надёжнее.