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-compressed
is meant to be used on top of apollo3-cache-persist
, make sure to install both!
npm install --save apollo3-cache-persist apollo3-cache-persist-compressed
or
yarn add apollo3-cache-persist apollo3-cache-persist-compressed
Finally, 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 name
config!
[!IMPORTANT]
Ensure the serialize
option on persistCache
isn't turned off, as the compression expects to receive a serialized version of the cache to compress it as a string. serialize
defaults to true
.
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
apollo-cache-persist-compressed is MIT licensed.