Rendu côté serveur
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 →
Pour activer le SSR, définissez simplement ssr: true dans le callback de configuration de votre createTRPCNext.
Lorsque vous activez le SSR, tRPC utilise getInitialProps pour précharger toutes les requêtes côté serveur. Cela engendre des problèmes comme celui-ci lorsque vous utilisez getServerSideProps, et la résolution dépasse notre contrôle.
Alternativement, vous pouvez laisser le SSR désactivé (par défaut) et utiliser les Server-Side Helpers pour précharger les requêtes dans getStaticProps ou getServerSideProps.
Pour exécuter correctement les requêtes durant l'étape de rendu côté serveur, nous devons ajouter une logique supplémentaire dans notre config :
Envisagez également Response Caching.
utils/trpc.tstsximport { httpBatchLink } from '@trpc/client';import { createTRPCNext } from '@trpc/next';import { ssrPrepass } from '@trpc/next/ssrPrepass';import superjson from 'superjson';import type { AppRouter } from './api/trpc/[trpc]';export const trpc = createTRPCNext<AppRouter>({ssr: true,ssrPrepass,config(config) {const { ctx } = opts;if (typeof window !== 'undefined') {// during client requestsreturn {links: [httpBatchLink({url: '/api/trpc',}),],};}return {links: [httpBatchLink({// The server needs to know your app's full urlurl: `${getBaseUrl()}/api/trpc`,/*** Set custom request headers on every request from tRPC* @see https://trpc.io/docs/v10/header*/headers() {if (!ctx?.req?.headers) {return {};}// To use SSR properly, you need to forward client headers to the server// This is so you can pass through things like cookies when we're server-side renderingreturn {cookie: ctx.req.headers.cookie,};},}),],};},});
utils/trpc.tstsximport { httpBatchLink } from '@trpc/client';import { createTRPCNext } from '@trpc/next';import { ssrPrepass } from '@trpc/next/ssrPrepass';import superjson from 'superjson';import type { AppRouter } from './api/trpc/[trpc]';export const trpc = createTRPCNext<AppRouter>({ssr: true,ssrPrepass,config(config) {const { ctx } = opts;if (typeof window !== 'undefined') {// during client requestsreturn {links: [httpBatchLink({url: '/api/trpc',}),],};}return {links: [httpBatchLink({// The server needs to know your app's full urlurl: `${getBaseUrl()}/api/trpc`,/*** Set custom request headers on every request from tRPC* @see https://trpc.io/docs/v10/header*/headers() {if (!ctx?.req?.headers) {return {};}// To use SSR properly, you need to forward client headers to the server// This is so you can pass through things like cookies when we're server-side renderingreturn {cookie: ctx.req.headers.cookie,};},}),],};},});
ou, si vous souhaitez conditionner le SSR à une requête spécifique, vous pouvez passer un callback à ssr. Ce callback peut renvoyer un booléen, ou une Promesse résolvant en booléen :
utils/trpc.tstsximport { httpBatchLink } from '@trpc/client';import { createTRPCNext } from '@trpc/next';import superjson from 'superjson';import type { AppRouter } from './api/trpc/[trpc]';export const trpc = createTRPCNext<AppRouter>({config(config) {const { ctx } = opts;if (typeof window !== 'undefined') {// during client requestsreturn {links: [httpBatchLink({url: '/api/trpc',}),],};}return {links: [httpBatchLink({// The server needs to know your app's full urlurl: `${getBaseUrl()}/api/trpc`,/*** Set custom request headers on every request from tRPC* @see https://trpc.io/docs/v10/header*/headers() {if (!ctx?.req?.headers) {return {};}// To use SSR properly, you need to forward client headers to the server// This is so you can pass through things like cookies when we're server-side renderingreturn {cookie: ctx.req.headers.cookie,};},}),],};},ssr(opts) {// only SSR if the request is coming from a botreturn opts.ctx?.req?.headers['user-agent']?.includes('bot');},});
utils/trpc.tstsximport { httpBatchLink } from '@trpc/client';import { createTRPCNext } from '@trpc/next';import superjson from 'superjson';import type { AppRouter } from './api/trpc/[trpc]';export const trpc = createTRPCNext<AppRouter>({config(config) {const { ctx } = opts;if (typeof window !== 'undefined') {// during client requestsreturn {links: [httpBatchLink({url: '/api/trpc',}),],};}return {links: [httpBatchLink({// The server needs to know your app's full urlurl: `${getBaseUrl()}/api/trpc`,/*** Set custom request headers on every request from tRPC* @see https://trpc.io/docs/v10/header*/headers() {if (!ctx?.req?.headers) {return {};}// To use SSR properly, you need to forward client headers to the server// This is so you can pass through things like cookies when we're server-side renderingreturn {cookie: ctx.req.headers.cookie,};},}),],};},ssr(opts) {// only SSR if the request is coming from a botreturn opts.ctx?.req?.headers['user-agent']?.includes('bot');},});
pages/_app.tsxtsximport { trpc } from '~/utils/trpc';import type { AppProps } from 'next/app';import React from 'react';const MyApp: AppType = ({ Component, pageProps }: AppProps) => {return <Component {...pageProps} />;};export default trpc.withTRPC(MyApp);
pages/_app.tsxtsximport { trpc } from '~/utils/trpc';import type { AppProps } from 'next/app';import React from 'react';const MyApp: AppType = ({ Component, pageProps }: AppProps) => {return <Component {...pageProps} />;};export default trpc.withTRPC(MyApp);
FAQ
Q : Pourquoi dois-je transférer manuellement les en-têtes du client vers le serveur ? Pourquoi tRPC ne le fait-il pas automatiquement ?
Bien qu'il soit rare de ne pas vouloir transférer les en-têtes du client lors du SSR, vous pourriez vouloir y ajouter des éléments dynamiquement. tRPC ne souhaite donc pas assumer la responsabilité des collisions de clés d'en-têtes, etc.
Q : Pourquoi dois-je supprimer l'en-tête connection lors de l'utilisation du SSR avec Node 18 ?
Si vous ne supprimez pas l'en-tête connection, la récupération des données échouera avec TRPCClientError: fetch failed car connection est un nom d'en-tête interdit.
Q : Pourquoi vois-je encore des requêtes réseau dans l'onglet Réseau ?
Par défaut, @tanstack/react-query (que nous utilisons pour les hooks de récupération de données) réactualise les données au montage et au refocus de la fenêtre, même si des données initiales ont été fournies via SSR. Cela garantit des données toujours à jour. Consultez la page sur le SSG si vous souhaitez désactiver ce comportement.