Introduction
tRPC permet de créer des APIs TypeScript sans avoir à écrire de définitions OpenAPI ni de contrats manuels. Le typage est partagé automatiquement entre le client et le serveur. Cette approche élimine les erreurs de runtime liées aux données et accélère le développement. En 2026, tRPC reste le choix privilégié pour les projets Next.js qui recherchent simplicité et sécurité de type maximale.
Prérequis
- Node.js 20 ou supérieur
- Next.js 15 avec App Router
- Connaissances de base en TypeScript
- npm ou pnpm installé
Initialiser le projet Next.js
npx create-next-app@latest my-trpc-app --yes
cd my-trpc-app
npm install @trpc/server @trpc/client @trpc/react-query @tanstack/react-query zodCette commande crée un projet Next.js frais et installe les packages essentiels de tRPC ainsi que Zod pour la validation.
Créer le routeur tRPC principal
import { initTRPC } from '@trpc/server';
import superjson from 'superjson';
const t = initTRPC.create({
transformer: superjson,
});
export const router = t.router;
export const publicProcedure = t.procedure;Nous initialisons tRPC avec SuperJSON pour supporter les types complexes comme Date. Les exports router et procedure seront réutilisés partout.
Définir les routes API
import { router, publicProcedure } from '../trpc';
import { z } from 'zod';
export const userRouter = router({
getById: publicProcedure
.input(z.object({ id: z.string() }))
.query(async ({ input }) => {
return { id: input.id, name: 'Alice', email: 'alice@example.com' };
}),
create: publicProcedure
.input(z.object({ name: z.string().min(2) }))
.mutation(async ({ input }) => {
return { id: 'new-id', ...input };
}),
});Chaque procédure est typée grâce à Zod. getById est une query et create une mutation. Le typage est automatique côté client.
Assembler le routeur racine
import { router } from '../trpc';
import { userRouter } from './user';
export const appRouter = router({
user: userRouter,
});
export type AppRouter = typeof appRouter;Le routeur principal regroupe tous les sous-routeurs. Le type AppRouter est exporté pour le client.
Créer le handler API Next.js
import { fetchRequestHandler } from '@trpc/server/adapters/fetch';
import { appRouter } from '@/server/routers/_app';
const handler = (req: Request) =>
fetchRequestHandler({
endpoint: '/api/trpc',
req,
router: appRouter,
createContext: () => ({}),
});
export { handler as GET, handler as POST };Ce fichier expose toutes les procédures tRPC via l'App Router de Next.js. Aucune configuration supplémentaire n'est requise.
Configurer le provider React
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { httpBatchLink } from '@trpc/client';
import { createTRPCReact } from '@trpc/react-query';
import { AppRouter } from '@/server/routers/_app';
import { useState } from 'react';
export const trpc = createTRPCReact<AppRouter>();
export function TRPCProvider({ children }: { children: React.ReactNode }) {
const [queryClient] = useState(() => new QueryClient());
const [trpcClient] = useState(() =>
trpc.createClient({
links: [httpBatchLink({ url: '/api/trpc' })],
})
);
return (
<trpc.Provider client={trpcClient} queryClient={queryClient}>
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
</trpc.Provider>
);
}Le provider connecte React Query et tRPC. Placez-le dans le layout racine pour que tous les composants y aient accès.
Bonnes pratiques
- Utilisez toujours Zod pour valider les entrées
- Séparez les routeurs par domaine métier
- Activez SuperJSON dès le début pour supporter les Dates et Maps
- Nommez clairement vos procédures (get, create, update, delete)
- Écrivez des tests d'intégration sur les procédures critiques
Erreurs courantes à éviter
- Oublier d'exporter le type AppRouter côté serveur
- Ne pas placer le TRPCProvider dans le layout racine
- Utiliser des procédures sans input alors que des données sont attendues
- Ignorer les erreurs de validation Zod qui remontent mal côté client
Pour aller plus loin
Découvrez nos formations complètes sur tRPC et Next.js sur Learni Group.