Define your async methods. Use them synchronously in React. Instantly mutate the data and automatically update all usages.
For REST, GraphQL, Websockets+SSE and more
Simple TypeScript definition
class Article extends Entity { readonly id: string = ''; readonly title: string = ''; readonly body: string = ''; pk() { return this.id; } }
Create collection of API Endpoints
const ArticleResource = createResource({ path: '/articles/:id', schema: Article, })
One line data binding
const article = useSuspense(ArticleResource.get, { id }); return ( <> <h2>{article.title}</h2> <p>{article.body}</p> </> );
Mutation
const ctrl = useController(); return ( <ArticleForm onSubmit={data => ctrl.fetch(ArticleResource.update, { id }, data)} /> );
And subscriptions
const price = useLive(PriceResource.get, { symbol }); return price.value;
Programmatic queries
const sortedArticles = new Query( new schema.All(Article), (entries, { asc } = { asc: false }) => { const sorted = [...entries].sort((a, b) => a.title.localeCompare(b.title)); if (asc) return sorted; return sorted.reverse(); } ); const articlesUnsorted = useCache(sortedArticles); const articlesAscending = useCache(sortedArticles, { asc: true }); const articlesDescending = useCache(sortedArticles, { asc: false });
...all typed ...fast ...and consistent
For the small price of 9kb gziped. πGet started now | π₯Comparison
Features
-
Strong Typescript inference
- π React Suspense support
- π§΅ React 18 Concurrent mode compatible
- π¦ Partial Hydration Server Side Rendering
- π£ Declarative API
- π Composition over configuration
- π° Normalized caching
- π₯ Tiny bundle footprint
- π Automatic overfetching elimination
- β¨ Optimistic updates
- π§ Flexible to fit any API design (one size fits all)
- π§ Debugging and inspection via browser extension
- π³ Tree-shakable (only use what you need)
- π Subscriptions
- β»οΈ Optional redux integration
- π Storybook mocking
- π± React Native support
- βοΈ NextJS support
- π― Declarative cache lifetime policy
- π§ Composable middlewares
- π½ Global data consistency guarantees
- π Automatic race condition elimination
- π― Global referential equality guarantees
Principals of Rest Hooks
- Strong inferred types
- Global referential equality guarantees
- Normalized store creates a single source of truth
- Strong invariants robust against race conditions
- Validation
- Stale While Revalidate configurable cache
- Only re-render
- Declarative data definitions
- Decoupled API definitions from usage
- Co-located data dependencies
- Centralized orchestration
- Extensible orchestration through Managers (middleware)
- Composable hooks
- subject pattern
- Suspense + concurrent mode async orchestration
- Simple case is simple
- Scale as your app scales