- Home »

Как деплоить SPA на сервер?
Если ты когда-нибудь писал одностраничные приложения (SPA) на React, Vue, Svelte или Angular, то наверняка сталкивался с вопросом: а как это всё счастье выложить на сервер, чтобы оно работало быстро, стабильно и без лишнего геморроя? В этой статье я разложу по полочкам всё, что нужно знать о деплое SPA — от выбора хостинга до самых частых граблей и лайфхаков. Без воды, по делу, с примерами и схемами. Погнали!
Почему деплой SPA — это отдельная песня?
SPA — это не просто набор HTML-файлов. Это приложение, где вся магия происходит на клиенте, а сервер чаще всего отдаёт один единственный index.html
, а всё остальное — статика: JS, CSS, картинки, шрифты. Но вот нюанс: роутинг (переходы по страницам) происходит на клиенте, а не на сервере. И тут многие новички попадают в классическую ловушку.
- На обычном хостинге сервер по умолчанию ищет файл по пути, например
/about
— ищетabout.html
, а его нет, и сервер шлёт 404. - А SPA-шка ждёт, что на любой URL сервер отдаст
index.html
, а дальше уже JS разрулит, что показать. - Если сервер не настроить — будет 404 на всех вложенных маршрутах.
Вот тут и начинается веселье: как сделать так, чтобы сервер отдавал index.html
на все запросы, кроме статики? И какой хостинг вообще выбрать, чтобы потом не рвать на себе волосы?
Виды хостинга для SPA: плюсы, минусы, подводные камни
1. Shared-хостинг (виртуальный хостинг)
- Самый дешёвый и простой вариант (например, beget, timeweb, sprinthost, reg.ru и пр.)
- Подходит, если у тебя только статика, нет серверного кода (Node.js, Python и пр.)
- На PHP-хостинге можно закинуть папку
build
илиdist
и всё будет работать… - НО: нужно настроить правильный .htaccess для Apache или web.config для IIS, чтобы любые запросы отдавались на
index.html
- Минус — ограниченные возможности, нет кастомизации, старые версии ПО, медленная поддержка.
# Пример .htaccess для React/Vue SPA
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
Кейс: Вася выложил React-приложение на обычный хостинг, но забыл про .htaccess
— на прямом заходе по /about
ловит 404. Добавил .htaccess
— всё взлетело.
2. VPS/VDS (виртуальный сервер)
- Больше контроля: сам ставишь ПО, настраиваешь nginx, Apache, Caddy и т.д.
- Можно запускать серверный JS (Next.js, Nuxt, SSR и пр.)
- Минус — нужна базовая админка: SSH, консоль, конфиги, безопасность.
- Цена выше, но для проектов с трафиком и кастомными задачами — must have.
# Пример конфига nginx для SPA
server {
listen 80;
server_name your-domain.com;
root /var/www/your-spa;
location / {
try_files $uri $uri/ /index.html;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
Кейс: Саша захотел проксировать API-запросы на другой сервер. На VPS с nginx это делается одной строкой в конфиге.
3. Специализированные сервисы для статики (Netlify, Vercel, GitHub Pages, Firebase Hosting)
- Бесплатно или почти бесплатно для небольших проектов
- Автоматический деплой из GitHub/GitLab, SSL из коробки
- Всё оптимизировано под SPA: роутинг, редиректы, кэширование
- Минус — мало кастомизации, лимиты по трафику, не всегда можно прикрутить серверную логику
Кейс: Петя за 5 минут залил Vue-приложение на Netlify, подключил свой домен, и больше не парится с инфраструктурой.
Как деплоить SPA на сервер — пошагово
1. Собери билд приложения
- Для React:
npm run build
(создаст папкуbuild
) - Для Vue:
npm run build
(папкаdist
) - Для Svelte:
npm run build
(папкаpublic
илиbuild
)
2. Залей файлы на сервер
- Shared-хостинг: через FTP/SFTP/панель управления
- VPS: через
scp
,rsync
,git pull
- Netlify/Vercel: просто пушь в git, сервис всё сделает сам
3. Настрой сервер под SPA
- Shared-хостинг: .htaccess (см. выше)
- nginx (VPS):
try_files $uri $uri/ /index.html;
- Netlify: _redirects файл с правилом
/* /index.html 200
# Netlify _redirects
/* /index.html 200
4. Проверь работу роутинга
- Открой сайт и попробуй вручную перейти по внутренним маршрутам (например,
/about
,/contacts
) - Если всё ок — сервер отдаёт
index.html
и приложение работает - Если 404 — смотри настройки сервера
5. (Бонус) Настрой кэширование и SSL
- Сделай редирект с http на https (SSL сертификат Let’s Encrypt — бесплатно)
- Включи кэширование статики (js, css, изображения) — это ускоряет загрузку
- Проверь, чтобы
index.html
не кэшировался (иначе будут баги после деплоя)
# nginx: кэш статики, но не index.html
location / {
try_files $uri $uri/ /index.html;
add_header Cache-Control "no-store";
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
Частые ошибки и мифы новичков
- Ошибка: Деплоить SPA как обычный сайт без настройки роутинга на сервере — ловишь 404 на внутренних страницах.
- Ошибка: Кэшировать
index.html
— после обновления сайта пользователи видят старую версию. - Миф: SPA нельзя выложить на обычный хостинг — можно, если правильно настроить сервер.
- Ошибка: Забыть про SSL — Chrome будет ругаться, а API не будет работать из-за CORS.
- Ошибка: Не настраивать кэширование статики — сайт грузится медленно, нагрузка на сервер.
Советы по выбору хостинга для SPA
- Для простых проектов без серверной логики — бери любой shared-хостинг с поддержкой .htaccess или web.config.
- Для продвинутых задач — VPS/VDS (DigitalOcean, Hetzner, Yandex Cloud, Selectel, Linode).
- Для быстрого старта и автодеплоя — Netlify, Vercel, Firebase Hosting, GitHub Pages.
- Проверь, поддерживает ли хостинг SSL, HTTP/2, кастомные домены, автообновление файлов.
- Почитай отзывы — у некоторых хостеров бывают проблемы с кэшированием или странные лимиты.
Похожие решения и альтернативы
- SSR (Server Side Rendering): Если нужен SEO и быстрый первый рендер — смотри в сторону Next.js, Nuxt, SvelteKit. Но это уже не чистый SPA, а гибрид.
- Cloudflare Pages: Бесплатный хостинг для статики с edge CDN — https://pages.cloudflare.com/
- GitHub Pages: Отлично подходит для open-source проектов, бесплатен, но без серверной логики — https://pages.github.com/
- Vercel: Автодеплой Next.js, React, Vue и пр. — https://vercel.com/
- Netlify: Классика для статики и SPA — https://www.netlify.com/
- Firebase Hosting: Быстро, просто, SSL, кастомные домены — https://firebase.google.com/products/hosting
Заключение — какой хостинг для SPA выбрать?
Если тебе нужен быстрый, простой и дешёвый способ выложить SPA — бери Netlify, Vercel или GitHub Pages. Там всё заточено под статику и SPA, автообновление, SSL, кастомные домены — всё в пару кликов.
Если нужен полный контроль, кастомизация, серверная логика — VPS/VDS с nginx или Apache. Но тут уже нужна минимальная админка, зато и возможностей больше.
Shared-хостинг — рабочий вариант, если не хочешь заморачиваться с сервером, но не забудь про .htaccess
и SSL.
Главное: не забывай про правильный роутинг на сервере, кэширование статики, SSL и автоматизацию деплоя. Тогда твой SPA будет летать, а ты — спать спокойно.
Надеюсь, статья помогла тебе разобраться, как деплоить SPA на сервер. Если остались вопросы — пиши в комменты или в личку, всегда рад помочь!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.