Next.js · npm

Mettez Next.js en cache par étiquette, en une ligne.

@canner-ca/next-cache pose les en-têtes Cache-Control et Surrogate-Key dont Canner a besoin — correctement, à chaque fois — partout où Next.js permet de poser des en-têtes de réponse : Route Handlers, Middleware et getServerSideProps. Canner gère l'App Router : les pages de contenu sont mises en cache pour les chargements à froid et les robots, tandis que les navigations côté client atteignent toujours votre application. Aucune dépendance.

$npm install @canner-ca/next-cache

Utilisation

Route Handlers

// app/api/posts/route.ts
import { NextResponse } from 'next/server';
import { cache } from '@canner-ca/next-cache';

export async function GET() {
  const res = NextResponse.json(await getPosts());
  cache(res, { ttl: 3600, tags: ['blog-listing'] });
  return res;
}

Middleware (pages App Router)

Les composants serveur ne peuvent pas poser d'en-têtes de réponse; vous mettez donc les pages App Router en cache depuis le middleware. Étiquetez avec une clé dérivée du chemin que le webhook de votre CMS peut purger.

// middleware.ts
import { NextResponse } from 'next/server';
import { cache } from '@canner-ca/next-cache';

export function middleware(request) {
  const res = NextResponse.next();
  if (request.nextUrl.pathname.startsWith('/blog/')) {
    const slug = request.nextUrl.pathname.split('/')[2];
    cache(res, { ttl: 3600, tags: [slug, 'blog-listing'] });
  }
  return res;
}

Pages Router

Dans getServerSideProps ou une route API, passez l'objet réponse Node.

export async function getServerSideProps({ res, params }) {
  const post = await getPost(params.slug);
  cache(res, { ttl: 600, tags: [post.id] });
  return { props: { post } };
}

Comment fonctionne le cache App Router

Une URL de page sert deux choses : le document HTML (chargement à froid, robot, navigation directe — sans en-tête RSC) et une charge utile RSC (navigation/préchargement côté client — avec en-tête RSC). Canner ne met en cache que le document HTML et laisse passer toute requête RSC vers votre application. Marquer une page comme cachable est donc sûr : la navigation côté client n'est jamais périmée ni incohérente, et le cache accélère exactement les requêtes qui comptent pour le référencement et le premier rendu. Vous ne configurez rien de tout cela — c'est ainsi que Canner traite Next.js.

Options

ttlObligatoire. Secondes pendant lesquelles Canner peut servir la réponse en cache — pose s-maxage.tagsChaîne, nombre ou tableau. Pose Surrogate-Key. Les nombres sont convertis; les doublons et les étiquettes avec espaces sont écartés.browserTtlOptionnel. Secondes de cache côté navigateur (pose max-age). Omettez-le pour garder les purges instantanées.

Il ne fait qu'ajouter des en-têtes

L'utilitaire ne retire ni ne modifie jamais ce que votre application a posé. Il ne supprime pas Set-Cookie — Canner refuse déjà de mettre en cache une réponse qui pose un témoin, donc vous obtenez un avertissement en développement et votre témoin reste intact. Une durée invalide ne pose aucun en-tête et avertit; seule une valeur qui n'est ni une réponse ni des Headers lève une erreur.

Puis dirigez votre CMS vers Canner

Le côté code est terminé. L'autre moitié, ce sont deux valeurs à copier — l'URL du webhook et un en-tête Authorization — affichées préremplies dans le tableau de bord sous Réglages → Cache. Guide complet du cache.

Code source et problèmes : tools/next-cache/ dans le dépôt canner sur GitHub. Sous licence MIT. Pour Astro, voir @canner-ca/astro-cache.