apollo-cache-persist-compressed
v1.0.0
Published
🗜️ Compressed cache persistence for Apollo Client
Readme
apollo3-cache-persist-compressed
Exposes wrappers built on top of apollo3-cache-persist, but leverages compression via GZip (powered by fflate) to reduce the size of the stored cache.
Currently, the only wrapper exposed is CompressedLocalForageWrapper, which is a drop-in replacement for LocalForageWrapper from apollo3-cache-persist, but persists the cache in a compressed format. localForage supports all sorts of JavaScript objects, including binary data (Uint8Array), so it's a good choice for persisting compressed data as binary, which saves us from having to convert the compressed binary to a base64 string.
Compressing strings, especially Apollo Client's cache is quite efficient because a cache (even a normalized one) will have a lot of repeated tokens, which can be compressed quite well. The GZip compression is powered by fflate.
Compresses a cache of 1 MB into 60 KB in 22ms 🔥 (Tested on an M1 Pro).
By default, apollo3-cache-persist only persists a stringified version of the cache up to 1,048,576 characters (1 MB), which can be quickly reached with a cache of a few hundred entities. This library allows you to compress the cache before persisting it, which can save a lot of space while ensuring you can leverage the full power of Apollo Client's cache rather than purging the cache every few interactions.
Usage
[!WARNING]
apollo3-cache-persist-compressedis meant to be used on top ofapollo3-cache-persist, make sure to install both!
npm install --save apollo3-cache-persist apollo3-cache-persist-compressedor
yarn add apollo3-cache-persist apollo3-cache-persist-compressedFinally, use CompressedLocalForageWrapper as a drop-in replacement for LocalForageWrapper:
[!CAUTION] The compressed storage doesn't support migrating from a string-based cache. Therefore, it's really important to version your localForage via the
nameconfig!
[!IMPORTANT] Ensure the
serializeoption onpersistCacheisn't turned off, as the compression expects to receive a serialized version of the cache to compress it as a string.serializedefaults totrue.
import { InMemoryCache } from '@apollo/client/core';
import { persistCache } from 'apollo3-cache-persist';
import { CompressedLocalForageWrapper } from 'apollo3-cache-persist-compressed';
import localforage from 'localforage';
const cache = new InMemoryCache({...});
localforage.config({
driver: localforage.INDEXEDDB,
name: 'apollo-cache-v2',
});
// await before instantiating ApolloClient, else queries might run before the cache is persisted
await persistCache({
cache,
storage: new CompressedLocalForageWrapper(localforage),
serialize: true,
});
// Continue setting up Apollo as usual.
const client = new ApolloClient({
cache,
...
});License
merge-drivers is MIT licensed.
