Netlify
Зачем нужно
Netlify — платформа для деплоя статических сайтов и JAMstack-приложений. Подключаешь GitHub → push → сайт обновлён. Бесплатный план включает 100 GB bandwidth, формы, редиректы и preview deploys. Отлично подходит для лендингов, портфолио и SPA.
Где используется
- Статические сайты — HTML/CSS/JS, Gatsby, Hugo, 11ty
- SPA — React, Vue, Angular, Svelte
- Портфолио — персональный сайт разработчика
- Документация — сайты с документацией
- RS School — деплой учебных проектов
Static Site Deployment
Подключение GitHub
- Зайди на netlify.com → Sign up with GitHub
- Add new site → Import from Git → GitHub
- Выбери репозиторий
- Настрой Build settings:
Branch to deploy: main
Build command: npm run build
Publish directory: dist
- Deploy site → готово!
Drag & Drop деплой
Для быстрого деплоя — просто перетащи папку dist/ на дашборд Netlify.
Netlify CLI
# Установка
npm i -g netlify-cli
# Логин
netlify login
# Инициализация проекта
netlify init
# Деплой preview
netlify deploy --dir=dist
# Деплой в production
netlify deploy --dir=dist --prod
# Локальная разработка
netlify dev
Forms — формы без бэкенда
Netlify автоматически обрабатывает HTML-формы.
<!-- Добавь атрибут netlify к форме -->
<form name="contact" method="POST" data-netlify="true">
<input type="hidden" name="form-name" value="contact" />
<label>Имя: <input type="text" name="name" required /></label>
<label>Email: <input type="email" name="email" required /></label>
<label>Сообщение: <textarea name="message" required></textarea></label>
<button type="submit">Отправить</button>
</form>
<!-- Для SPA (React/Vue) добавь скрытую форму в index.html -->
<form name="contact" netlify netlify-honeypot="bot-field" hidden>
<input type="text" name="name" />
<input type="email" name="email" />
<textarea name="message"></textarea>
</form>
// React-компонент формы
function ContactForm() {
const handleSubmit = (e) => {
e.preventDefault();
const formData = new FormData(e.target);
fetch('/', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams(formData).toString(),
})
.then( => alert('Отправлено!'))
.catch((error) => alert(error));
};
return (
<form name="contact" method="POST" data-netlify="true" onSubmit={handleSubmit}>
<input type="hidden" name="form-name" value="contact" />
<input type="text" name="name" required />
<input type="email" name="email" required />
<textarea name="message" required />
<button type="submit">Отправить</button>
</form>
);
}
Ответы форм: Site Dashboard → Forms → выбрать форму.
Redirects и Rewrites
Файл _redirects
# Поместить в public/ или корень publish directory
# Редирект
/old-page /new-page 301
# Rewrite (для SPA — все роуты на index.html)
/* /index.html 200
# Проксирование API
/api/* https://api.example.com/:splat 200
# Редирект по стране
/ /ru/ 302 Country=ru
Файл netlify.toml
# netlify.toml — в корне проекта
[build]
command = "npm run build"
publish = "dist"
# Редиректы
[[Роутинг]]
from = "/api/*"
to = "https://api.example.com/:splat"
status = 200
[[Роутинг]]
from = "/*"
to = "/index.html"
status = 200
# Заголовки
[[headers]]
for = "/api/*"
[headers.values()]
Access-Control-Allow-Origin = "*"
# Environment-специфичные настройки
[context.production]
environment = { NODE_ENV = "production" }
[context.deploy-preview]
environment = { NODE_ENV = "staging" }
Plugins
# netlify.toml
# Плагин для кэширования
[[Webpack plugins]]
package = "netlify-plugin-cache"
[plugins.inputs]
paths = ["node_modules"]
# Плагин для проверки ссылок
[[Webpack plugins]]
package = "@netlify/plugin-lighthouse"
Популярные плагины:
- Lighthouse — аудит производительности при каждом деплое
- Sitemap — автогенерация sitemap.xml
- Cache — кэширование между билдами
- Checklinks — проверка битых ссылок
Build Settings
Через Dashboard
Site Settings → Build & deploy:
Repository: github.com/user/project
Branch: main
Build command: npm run build
Publish dir: dist
Через netlify.toml
[build]
command = "npm run build"
publish = "dist"
[build.environment]
NODE_VERSION = "20"
NPM_VERSION = "10"
# Отдельный build для веток
[context.staging]
command = "npm run build:staging"
[context.deploy-preview]
command = "npm run build:preview"
Environment Variables
Dashboard → Site Settings → Environment Variables:
VITE_API_URL = https://api.example.com
VITE_GA_ID = G-XXXXX
NODE_VERSION = 20
Preview Deployments
Каждый PR получает уникальный URL:
PR #15: feature/about-page
→ https://deploy-preview-15--my-site.netlify.app
Netlify добавляет статус-чек и комментарий в PR.
Custom Domain
- Domain Settings → Add custom domain
- Добавь DNS-записи:
Type Host Value
A @ 75.2.60.5
CNAME www my-site.netlify.app
- Netlify автоматически выпустит SSL-сертификат (Let's Encrypt)
Частые ошибки
| Ошибка | Проблема | Решение |
|---|---|---|
| 404 на SPA-роутах | Нет rewrite правила | Добавь /* /index.html 200 в _redirects |
| Build fails | Разные версии Node | Укажи NODE_VERSION в env |
| Формы не работают | Нет атрибута data-netlify |
Добавь атрибут + hidden form для SPA |
_redirects не работает |
Файл не в publish dir | Положи в public/ или настрой копирование |
| Долгий build | Нет кэширования | Используй cache-плагин |
Практика
- Задеплой статический сайт на Netlify из GitHub
- Добавь контактную форму с
data-netlify - Настрой SPA-redirect через
_redirects - Создай
netlify.tomlс настройками сборки - Подключи кастомный домен и проверь HTTPS
Связанные темы
- Vercel — альтернативная платформа
- GitHub Pages — статический хостинг GitHub
- Автоматический деплой — стратегии деплоя
- GitHub Actions — CI/CD