Loading...
Ни один инструмент здесь не выбран, чтобы красиво звучать в предложении. Каждый решает конкретную задачу: от скорости сайта до синхронизации между веб- и мобильным приложением. Нужны технические детали? Разбираем их на discovery, до того как вы что-то подпишете.
Server Components отправляют меньше JavaScript в браузер, страницы грузятся быстрее, а Google считывает контент сразу. Для сайта, который должен приводить клиентов каждый месяц, эта скорость напрямую влияет на количество заявок.
Никаких скрытых `any`. Strict mode ловит ошибки ещё на этапе написания кода, до того как они попадут на живой сайт. Поэтому код легко менять и через год, когда кто-то добавляет новую функцию.
Tailwind даёт скорость в вёрстке, без придумывания новых названий CSS-классов под каждый проект. Radix закрывает капризные компоненты, которые должны сразу работать правильно: диалог, dropdown, меню, уже доступные с клавиатуры.
Для всего, что не является страницей: интеграции, фоновые задачи, более тяжёлая бизнес-логика. FastAPI сам проверяет входящие данные и берёт документацию API прямо из кода, по мере того как он пишется.
FastAPI описывает каждый endpoint в спецификации OpenAPI. Из неё мы автоматически генерируем TypeScript-клиент для сайта и Dart-клиент для мобильного приложения. Контракт меняется в одном месте, а всё остальное пересобирается само.
Подписанные сессии, автоматическое обновление токена, роли и права, которые понятны с одного взгляда. Сайт и мобильное приложение используют одну и ту же логику аутентификации, написанную один раз.
Один код покрывает iOS и Android. Новые функции выходят на обеих платформах одновременно, и ни одна версия незаметно не отстаёт от другой.
Каждое изменение получает свою ссылку с предпросмотром, прежде чем попасть на живой сайт. Если что-то ломается в проде, откат к предыдущей версии занимает секунды.
Одна и та же среда работает на ноутбуке, на staging и в проде, поэтому фраза «у меня работает» перестаёт быть аргументом. На каждый pull request автоматически запускаются тесты, сборка и деплой.
Скопировать список технологий может кто угодно. Важно, как они собраны вместе, а эта разница видна только через несколько недель ежедневного использования продукта.
FastAPI генерирует спецификацию OpenAPI прямо из Python-кода. Из неё мы автоматически получаем TypeScript-клиент для сайта и Dart-клиент для мобильного приложения. Меняешь поле в backend, и сборка падает именно там, где нужно исправление. Никто не узнаёт об этом через три месяца из бага, о котором сообщил клиент.
Сайт на Next.js и приложение на Flutter обращаются к одному и тому же FastAPI. Бизнес-правила живут в одном месте: добавил правило один раз, и оно сразу работает и на сайте, и в приложении. Больше не нужно вручную держать в синхроне два кодбейса.
Критичные действия, например оформление заказа, обновляются на экране оптимистично и автоматически повторяются, если сеть на секунду отвалилась. Никто не смотрит на крутящийся спиннер: интерфейс отвечает сразу, а синхронизация идёт в фоне. Особенно это важно в ресторане, где WiFi никогда не бывает стопроцентно надёжным.
# api/orders.py
from typing import Annotated
from fastapi import APIRouter, Depends, HTTPException, status
from pydantic import BaseModel, Field
router = APIRouter(prefix="/orders", tags=["orders"])
class OrderItem(BaseModel):
sku: str
quantity: int = Field(gt=0, le=99)
notes: str | None = None
class OrderCreate(BaseModel):
items: list[OrderItem] = Field(min_length=1)
table_label: str | None = None
class OrderRead(OrderCreate):
id: str
status: str
total_cents: int
@router.post("", response_model=OrderRead, status_code=status.HTTP_201_CREATED)
async def create_order(
payload: OrderCreate,
user: Annotated[CurrentUser, Depends(require_tenant)],
) -> OrderRead:
if not user.can("orders.create"):
raise HTTPException(status.HTTP_403_FORBIDDEN)
return await orders_service.create(tenant_id=user.tenant_id, payload=payload)
Всё, что описано выше, работает на вашем аккаунте, а не на нашем, поэтому вы всегда можете продолжить с кем угодно ещё, если это понадобится. Не обязательно разбираться в каждой технической детали, чтобы работать с нами: если возникнут вопросы, вы получите прямой ответ.
Смотреть демо