Démarrage rapide
Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →
Nous vous encourageons vivement à consulter les exemples d'applications pour découvrir tRPC et démarrer de manière fluide.
Installation
⚠️ Prérequis : tRPC nécessite TypeScript > 4.1 car il repose sur les Types littéraux de modèle.
npm install @trpc/server
Pour implémenter les endpoints et routeurs tRPC. Installez dans votre codebase serveur.
npm install @trpc/client @trpc/server
Pour effectuer des appels API typés depuis votre client. Installez dans votre codebase client (@trpc/server est une dépendance peer de @trpc/client).
npm install @trpc/react react-query@3
Pour générer des hooks React performants permettant d'interroger votre API tRPC. Propulsé par react-query.
npm install @trpc/next
Un ensemble d'utilitaires pour intégrer tRPC avec Next.js.
Extraits d'installation
npm:
bashnpm install @trpc/server @trpc/client @trpc/react react-query@3 @trpc/next
bashnpm install @trpc/server @trpc/client @trpc/react react-query@3 @trpc/next
yarn:
bashyarn add @trpc/server @trpc/client @trpc/react react-query@3 @trpc/next
bashyarn add @trpc/server @trpc/client @trpc/react react-query@3 @trpc/next
Définition d'un routeur
Parcourons les étapes de création d'une API typée avec tRPC. Pour commencer, cette API contiendra seulement deux endpoints :
tsgetUser(id: string) => { id: string; name: string; }createUser(data: {name:string}) => { id: string; name: string; }
tsgetUser(id: string) => { id: string; name: string; }createUser(data: {name:string}) => { id: string; name: string; }
Créer une instance de routeur
Nous définissons d'abord un routeur dans notre codebase serveur :
server.tstsimport * as trpc from '@trpc/server';const appRouter = trpc.router();// only export *type signature* of router!// to avoid accidentally importing your API// into client-side codeexport type AppRouter = typeof appRouter;
server.tstsimport * as trpc from '@trpc/server';const appRouter = trpc.router();// only export *type signature* of router!// to avoid accidentally importing your API// into client-side codeexport type AppRouter = typeof appRouter;
Ajouter un endpoint de requête
Utilisez la méthode .query() pour ajouter un endpoint de requête au routeur. Arguments :
.query(name: string, params: QueryParams)
-
name: string: Le nom de cet endpoint -
params.input: Optionnel. Doit être une fonction qui valide/transforme l'input de cet endpoint et retourne une valeur fortement typée (si valide) ou lance une erreur (si invalide). Vous pouvez aussi passer un schéma Zod, Superstruct ou Yup. -
params.resolve: Implémentation réelle de l'endpoint. Fonction prenant un unique argumentreq. L'input validé est disponible dansreq.inputet le contexte dansreq.ctx(plus d'infos sur le contexte plus tard !).
server.tstsimport * as trpc from '@trpc/server';const appRouter = trpc.router().query('getUser', {input: (val: unknown) => {if (typeof val === 'string') return val;throw new Error(`Invalid input: ${typeof val}`);},async resolve(req) {req.input; // stringreturn { id: req.input, name: 'Bilbo' };},});export type AppRouter = typeof appRouter;
server.tstsimport * as trpc from '@trpc/server';const appRouter = trpc.router().query('getUser', {input: (val: unknown) => {if (typeof val === 'string') return val;throw new Error(`Invalid input: ${typeof val}`);},async resolve(req) {req.input; // stringreturn { id: req.input, name: 'Bilbo' };},});export type AppRouter = typeof appRouter;
Ajouter un endpoint de mutation
Comme avec GraphQL, tRPC distingue les endpoints de requête et de mutation. Ajoutons une mutation createUser :
tscreateUser(payload: {name: string}) => {id: string; name: string};
tscreateUser(payload: {name: string}) => {id: string; name: string};
server.tstsimport * as trpc from '@trpc/server';import { z } from 'zod';const appRouter = trpc.router().query('getUser', {input: (val: unknown) => {if (typeof val === 'string') return val;throw new Error(`Invalid input: ${typeof val}`);},async resolve(req) {req.input; // stringreturn { id: req.input, name: 'Bilbo' };},}).mutation('createUser', {// validate input with Zodinput: z.object({ name: z.string().min(5) }),async resolve(req) {// use your ORM of choicereturn await UserModel.create({data: req.input,});},});export type AppRouter = typeof appRouter;
server.tstsimport * as trpc from '@trpc/server';import { z } from 'zod';const appRouter = trpc.router().query('getUser', {input: (val: unknown) => {if (typeof val === 'string') return val;throw new Error(`Invalid input: ${typeof val}`);},async resolve(req) {req.input; // stringreturn { id: req.input, name: 'Bilbo' };},}).mutation('createUser', {// validate input with Zodinput: z.object({ name: z.string().min(5) }),async resolve(req) {// use your ORM of choicereturn await UserModel.create({data: req.input,});},});export type AppRouter = typeof appRouter;
Prochaines étapes
tRPC inclut des outils client plus sophistiqués conçus pour React en général et Next.js en particulier. Consultez ensuite le guide approprié :