Перейти к содержимому

Remix: Обзор

Remix — это full-stack веб-фреймворк, построенный на веб-стандартах. Он развивает идеи React Router и предоставляет мощный инструментарий для создания быстрых, доступных и надёжных веб-приложений.

Remix — это фреймворк, который берёт лучшее из двух миров: классические многостраничные приложения (MPA) с их надёжностью и простотой, и современные SPA с богатым пользовательским интерфейсом. Результат — приложения, которые работают даже без JavaScript в браузере.

Веб-стандарты + React = Remix
─────────────────────────────
fetch API → loader/action
FormData → Form component
Response/Request → route handlers
URL → file-based routing

Каждый файл в папке app/routes/ автоматически становится маршрутом. Никаких конфигурационных файлов.

app/routes/
index.tsx → /
about.tsx → /about
blog.$id.tsx → /blog/:id
user.profile.tsx → /user/profile (layout)

loader — серверная функция, которая выполняется перед рендерингом страницы. Данные передаются в компонент через useLoaderData.

export async function loader({ params }) {
const user = await db.user.findUnique({ where: { id: params.id } });
return json(user);
}
export default function UserPage() {
const user = useLoaderData<typeof loader>();
return <h1>{user.name}</h1>;
}

action — серверная функция для обработки форм и мутаций. Работает с обычными HTML-формами через <Form>.

export async function action({ request }) {
const formData = await request.formData();
const name = formData.get('name');
await db.user.create({ data: { name } });
return redirect('/users');
}

Remix поддерживает вложенные layouts с <Outlet>. Каждый сегмент URL может иметь свой layout, данные и обработку ошибок.

Формы работают без JavaScript. Когда JS загружается — они становятся SPA-переходами. Это называется Progressive Enhancement.

Браузер Сервер
│ │
│ GET /dashboard │
│ ──────────────────────────▶│
│ │── loader() выполняется
│ │── данные загружаются
│ HTML + данные │
│ ◀──────────────────────────│
│ │
│ Form submit POST │
│ ──────────────────────────▶│
│ │── action() выполняется
│ │── redirect()
│ GET /dashboard (новые данные)
│ ◀──────────────────────────│
КритерийRemixNext.jsSvelteKit
Данныеloader/actiongetServerSideProps/Server Actionsload/form actions
МаршрутизацияВложеннаяФайловаяФайловая
МутацииForm + actionServer ActionsForm actions
Стримингdefer/AwaitSuspense
Без JS✅ Работает⚠️ Частично
Web Standards✅✅⚠️
  1. Производительность — parallel data loading, streaming, кэширование на уровне HTTP
  2. Надёжность — работает без JS, graceful degradation
  3. DX — понятная модель данных, TypeScript из коробки
  4. Web Standards — знание fetch, FormData, Response переносится напрямую