data-client
data-client copied to clipboard
Async State Management without the Management
Asynchronous dynamic data at scale. Performance, data integrity, and typing for REST, proto, GraphQL, websockets and more.
๐ Website
๐Read The Docs ย |ย ๐Getting Started ย |ย ๐ฎTodo Demo ย |ย ๐ฎGithub Demo
Simple TypeScript definition
class ArticleResource extends Resource {
readonly id: string = '';
readonly title: string = '';
readonly body: string = '';
pk() {
return this.id;
}
static urlRoot = '/articles/';
}
One line data hookup
const article = useSuspense(ArticleResource.detail(), { id });
return (
<>
<h2>{article.title}</h2>
<p>{article.body}</p>
</>
);
Mutation
const { fetch } = useController();
return (
<ArticleForm
onSubmit={data => fetch(ArticleResource.update(), { id }, data)}
/>
);
And subscriptions
const price = useSuspense(PriceResource.detail(), { symbol });
useSubscription(PriceResource.detail(), { symbol });
return price.value;
...all typed ...fast ...and consistent
For the small price of 8kb gziped. ย ย ๐Get started now
Features
- [x]
Strong Typescript types
- [x] ๐ React Suspense support
- [x] ๐งต React 18 Concurrent mode compatible
- [x] ๐ฃ Declarative API
- [x] ๐ Composition over configuration
- [x] ๐ฐ Normalized caching
- [x] ๐ฅ Tiny bundle footprint
- [x] ๐ Automatic overfetching elimination
- [x] โจ Optimistic updates
- [x] ๐ง Flexible to fit any API design (one size fits all)
- [x] ๐ง Debugging and inspection via browser extension
- [x] ๐ณ Tree-shakable (only use what you need)
- [x] ๐ Subscriptions
- [x] โป๏ธ Optional redux integration
- [x] ๐ Storybook mocking
- [x] ๐ฑ React Native support
- [x] ๐ฏ Declarative cache lifetime policy
Principals of Rest Hooks
Integrity
- Strong inferred types
- Global referential equality guarantees
- Normalized store creates a single source of truth
- Strong invariants robust against race conditions
- Validation
Performance
- Stale While Revalidate configurable cache
- Only re-render
Composition over configuration
- 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
Incremental Adoption
- Simple case is simple
- Scale as your app scales
Special thanks
Thanks to @0xcaff, @melissafzhang and @alexiswolfish for their valuable feedback.