GithubHelp home page GithubHelp logo

solid-cache's Introduction

solid-cache

Cache boundaries and resource caching in SolidJS

NPM JavaScript Style GuideOpen in CodeSandbox

Install

npm i solid-cache
yarn add solid-cache
pnpm add solid-cache

Usage

<CacheBoundary>

<CacheBoundary> creates a contextual cache for all the cached resources to read/write resource results.

import { CacheBoundary } from 'solid-cache';

export default function App() {
  return (
    <CacheBoundary>
      <Main />
    </CacheBoundary>
  );
}

It's ideal to add a <CacheBoundary> at the root of your application, but you can also do it granularly such that different parts of the application don't have to share the same cache.

<>
  <CacheBoundary>
    <Navigation />
  </CacheBoundary>
  <CacheBoundary>
    <PageContent />
  </CacheBoundary>
</>

createCachedResource

A primitive similar to createResource, except createCachedResource works differently.

For createCacheResource to be "cached", it requires a <CacheBoundary> as an ancestor component, and it needs a "key" so it knows where to access or share its cached data.

createCachedResource also returns data and isFetching: data is a Resource while isFetching is a reactive boolean signal.

import { createCachedResource } from 'solid-cache';

function Profile() {
  const { data, isFetching } = createCachedResource({
    key: '/profile',
    get: () => getUserProfile(),
  });

  return (
    <div
      style={{
        opacity: isFetching() ? 0.5 : 1,
      }}
    >
      <Suspense fallback={<ProfileSkeleton />}>
        <ProfileDetails data={data()?.details} />
        <ProfileTimeline data={data()?.posts} />
      </Suspense>
    </div>
  );
}

createCachedResource can also accept a source like createResource however it won't refetch if the key remains unchanged.

const { data, isFetching } = createCachedResource({
  source: () => id(),
  key: (currentId) => `/user/${currentId}`,
  get: (currentID) => getUser(currentId),
});

If there are multiple createCachedResource instances that share the same key, only one is going to fetch and the rest will re-use the same cached value as the fetching instance.

useCacheBoundaryRefresh

useCacheBoundaryRefresh returns a function that makes all createCachedResource instances to simultaneously refresh in the same <CacheBoundary>.

function RefreshUser() {
  const refresh = useCacheBoundaryRefresh();

  return <RefreshButton onClick={() => refresh()} />
}

However, if you want to "refresh in the background" while keeping the old data, you can call refresh(true) instead, this way, the UI doesn't need to show a loading UI.

fetch

A wrapper for createCachedResource and the native fetch API.

import { fetch } from 'solid-cache';

function DogImage() {
  const { data, isFetching } = fetch('https://dog.ceo/api/breed/shiba/images/random').json();

  return (
    <Suspense>
      <img
        src={data()?.message}
        style={{ opacity: isFetching() ? 0.5 : 1 }}
      />
    </Suspense>
  );
}

Sponsors

Sponsors

License

MIT © lxsmnsyc

solid-cache's People

Contributors

lxsmnsyc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.