Remix — loaders, actions & data routing
Core details
Route modules: Each route file exports optional loader (read on navigation), action (mutations from <Form>/fetcher), default component, ErrorBoundary, headers/links/meta factories. Data and UI are co-located by URL segment.
Loaders:
- Run on server by default (and on navigations Remix controls). Return serialized JSON (+
deferfor streaming subsets when you choose that API shape). - Should be side-effect-light from the browser’s perspective: treat as HTTP GET semantics—avoid surprising writes.
Actions:
- Handle
<Form method="post">and fetchers—map closely to mutations. Return redirects, validation errors (json), ordatapayloads. - Progressive enhancement: forms work without JS when you lean on native methods and Remix’s primitives—good failure-mode story.
Revalidation: after an action succeeds, Remix can reload matching loaders (default strategy and opt-outs like shouldRevalidate)—articulate staleness vs extra round-trips explicitly.
Nested routes: layouts compose; each leaf contributes data—watch waterfall loaders versus parallel fetches (Promise.all in a parent loader is a deliberate choice).
Understanding
Remix pushes you toward REST-shaped thinking inside the router: loaders ≈ GET, actions ≈ POST/PUT semantics. That reduces “random hook that fetches on mount” sprawl because navigation carries data contracts. Interviewers listen for awareness of request boundaries—what hits the Edge/Node runtime, serialization limits, cookie/session pairing for auth—and for honest talk about cache headers Remix expects you to set when you expose document/loader routes as HTTP endpoints.
Senior understanding
| Lens | Speak to |
|---|---|
| Auth | Sessions in cookies (createCookieSessionStorage), CSRF-conscious patterns when mixing cross-site contexts. |
| Deploy | Adapter surface (Node, serverless)—cold start, streaming, asset pipeline; separating static vs dynamic routes. |
| DX vs perf | Over-nesting loaders causing fan-out; using defer thoughtfully; prefetch via <Link prefetch>. |
Trap answers: describing Remix as “just React Router” without the mutation + revalidation loop; forgetting HTTP semantics (GET-safe loaders); ignoring HTML document caching implications for personalization.
Diagram
See also
Last updated on
Spotted something unclear or wrong on this page?