Vercel logomark
Published on

The new `use cache` directive

The Next.js team is working on a simple and powerful caching model. In this article, we will cover the new `use cache` directive, caching strategies, and their use cases.

Time to read
3min read
The new `use cache` directive

Table of contents

Usage

Lorem ipsum odor amet, consectetuer adipiscing elit. Nunc libero pretium tortor nunc lacinia viverra cras ante ullamcorper. Quisque eget inceptos natoque mi mollis integer eu mi.

// next.config.js
import type { NextConfig } from 'next'
 
const nextConfig: NextConfig = {
  experimental: {
    useCache: true,
  },
}
 
export default nextConfig

Quam pulvinar nulla congue habitant fringilla sed eu sapien. Auctor gravida accumsan quis cubilia condimentum habitasse libero. Eget elementum volutpat libero habitant tortor malesuada habitant blandit.

// File level
'use cache'
 
export default async function Page() {
  // ...
}
 
// Component level
export async function MyComponent() {
  'use cache'
  return <></>
}
 
// Function level
export async function getData() {
  'use cache'
  const data = await fetch('/api/data')
  return data
}

Examples

Lorem ipsum odor amet, consectetuer adipiscing elit. Nunc libero pretium tortor nunc lacinia viverra cras ante ullamcorper. Quisque eget inceptos natoque mi mollis integer eu mi.

Quam pulvinar nulla congue habitant fringilla sed eu sapien. Auctor gravida accumsan quis cubilia condimentum habitasse libero. Eget elementum volutpat libero habitant tortor malesuada habitant blandit.

Entire routes

Lorem ipsum odor amet, consectetuer adipiscing elit. Nunc libero pretium tortor nunc lacinia viverra cras ante ullamcorper. Quisque eget inceptos natoque mi mollis integer eu mi.

// app/layout.tsx
'use cache'

import { unstable_cacheLife as cacheLife } from 'next/cache'
 
export default function Layout({ children }: { children: ReactNode }) {
  return <div>{children}</div>
}

Component output

Lorem ipsum odor amet, consectetuer adipiscing elit. Nunc libero pretium tortor nunc lacinia viverra cras ante ullamcorper. Quisque eget inceptos natoque mi mollis integer eu mi.

Quam pulvinar nulla congue habitant fringilla sed eu sapien. Auctor gravida accumsan quis cubilia condimentum habitasse libero. Eget elementum volutpat libero habitant tortor malesuada habitant blandit.

// app/components/bookings.tsx
export async function Bookings({ type = 'haircut' }: BookingsProps) {
  'use cache'
  async function getBookingsData() {
    const data = await fetch(`/api/bookings?type=${encodeURIComponent(type)}`)
    return data
  }
  return //...
}
 
interface BookingsProps {
  type: string
}

Function output

Lorem ipsum odor amet, consectetuer adipiscing elit. Nunc libero pretium tortor nunc lacinia viverra cras ante ullamcorper. Quisque eget inceptos natoque mi mollis integer eu mi.

Quam pulvinar nulla congue habitant fringilla sed eu sapien. Auctor gravida accumsan quis cubilia condimentum habitasse libero. Eget elementum volutpat libero habitant tortor malesuada habitant blandit.

// app/actions.ts
export async function getData() {
  'use cache'
 
  const data = await fetch('/api/data')
  return data
}

Conclusion

Lorem ipsum odor amet, consectetuer adipiscing elit. Nunc libero pretium tortor nunc lacinia viverra cras ante ullamcorper. Quisque eget inceptos natoque mi mollis integer eu mi.

Quam pulvinar nulla congue habitant fringilla sed eu sapien. Auctor gravida accumsan quis cubilia condimentum habitasse libero. Eget elementum volutpat libero habitant tortor malesuada habitant blandit.

Auctor venenatis diam vitae sagittis ornare neque torquent. Habitant lacus aptent a tellus, dignissim ex. Fames tempor nostra duis justo quam aliquet varius.