Sanity Client for Next.js Apps with App Dir Support
- Per-request Caching ⭐️
 - Full Typescript Support
 - Edge Runtime Support
 
yarn add next-sanity-clientnpm i next-sanity-clientimport SanityClient from 'next-sanity-client';
const client = new SanityClient({
  projectId: 'YOUR_PROJECT_ID',
  dataset: 'YOUR_DATASET',
  useCdn: process.env.NODE_ENV === 'production',
});
client.fetch({
  query: `[_type == 'post']`,
  config: {
    cache: 'force-cache',
    next: { revalidate: 60 }
  }
});The client support passing a queries object to get autocomplete when creating your api utilities functions
const client = new SanityClient({
  ...config,
  queries: {
    getTodosQuery: ``
  }
})This is useful when you have a file with your queries, you can simply pass it to the client
// lib/queries.ts
export const getTodosQuery = groq`[_type == 'todo']`;
// lib/sanity.ts
import * as queries from './queries';
const client = new SanityClient({
  ...config,
  queries
});And you can create a function to fetch that query using it name, full typed
// lib/api.ts
export const getTodos = client.createApiUtil<Todo[]>('getTodosQuery');
// here also you can set the default caching strategy
export const getTodo = client.createApiUtil<Todo, { id: string }>(
  'getTodoQuery',
  {
    cache: 'no-cache'
  }
);
// or use your own query
export const getProducts = client.createApiUtil<Product[]>(queries.getProducts, {
  cache: 'no-cache'
});Next in your Server Components:
// app/todos/page.tsx
const todos = await getTodos({ cache: 'no-cache' });
// app/todos/[id]/page.tsx
const todo = await getTodo({ id: 'uid', next: { revalidate: 10 } });
// components/ProductList.tsx
const products = await getProducts({ cache: 'force-cache' });👤 Fedeya hello@fedeminaya.com
- Website: fedeminaya.com
 - Twitter: @fedeminaya
 - Github: @Fedeya
 - LinkedIn: @federico-minaya
 
Contributions, issues and feature requests are welcome!
Feel free to check issues page.
Give a ⭐️ if this project helped you!