Dynamic data at scale. Performance, consistency, typing for REST, proto, GraphQL, websockets and more.
class ArticleResource extends Resource {
readonly id: string = '';
readonly title: string = '';
readonly body: string = '';
pk() { return this.id; }
static urlRoot = '/articles/';
}
const article = useResource(ArticleResource.detail(), { id });
return (
<>
<h2>{article.title}</h2>
<p>{article.body}</p>
</>
);
const update = useFetcher(ArticleResource.update());
return <ArticleForm onSubmit={data => update({ id }, data)} />;
const price = useResource(PriceResource.detail(), { symbol });
useSubscription(PriceResource.detail(), { symbol });
return price.value;
For the small price of 7kb gziped. 🏁Get started now
- Strong Typescript types
- 🛌 React Suspense support
- ⛓️ React Concurrent mode compatible
- 🎣 Simple declarative API
- 💰 Normalized response configurable 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
- 🚯 Pluggable garbage collection policy
Thanks to @0xcaff, @melissafzhang and @alexiswolfish for their valuable feedback.