Aller au contenu principal
Version : 9.x

Rendu côté serveur

Traduction Bêta Non Officielle

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 →

La seule chose à faire pour activer le SSR dans votre application est de définir ssr: true dans votre _app.tsx, mais cela implique quelques considérations supplémentaires.

Pour exécuter correctement les requêtes lors de l'étape de rendu côté serveur et personnaliser le comportement du cache, nous pourrions ajouter une logique supplémentaire dans notre _app.tsx :

pages/_app.tsx
tsx
import { withTRPC } from '@trpc/next';
import { AppType } from 'next/dist/shared/lib/utils';
import React from 'react';
import superjson from 'superjson';
import type { AppRouter } from './api/trpc/[trpc]';
const MyApp: AppType = ({ Component, pageProps }) => {
return <Component {...pageProps} />;
};
export default withTRPC<AppRouter>({
config(config) {
if (typeof window !== 'undefined') {
// during client requests
return {
transformer: superjson, // optional - adds superjson serialization
url: '/api/trpc',
};
}
// during SSR below
// optional: use SSG-caching for each rendered page (see caching section for more details)
const ONE_DAY_SECONDS = 60 * 60 * 24;
ctx?.res?.setHeader(
'Cache-Control',
`s-maxage=1, stale-while-revalidate=${ONE_DAY_SECONDS}`,
);
// The server needs to know your app's full url
// On render.com you can use `http://${process.env.RENDER_INTERNAL_HOSTNAME}:${process.env.PORT}/api/trpc`
const url = process.env.VERCEL_URL
? `https://${process.env.VERCEL_URL}/api/trpc`
: 'http://localhost:3000/api/trpc';
return {
transformer: superjson, // optional - adds superjson serialization
url,
/**
* Set custom request headers on every request from tRPC
* @see http://localhost:3000/docs/v9/header
* @see http://localhost:3000/docs/v9/ssr
*/
headers() {
if (ctx?.req) {
// To use SSR properly, you need to forward the client's headers to the server
// This is so you can pass through things like cookies when we're server-side rendering
// If you're using Node 18, omit the "connection" header
const {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
connection: _connection,
...headers
} = ctx.req.headers;
return {
...headers,
// Optional: inform server that it's an SSR request
'x-ssr': '1',
};
}
return {};
},
};
},
ssr: true,
})(MyApp);
pages/_app.tsx
tsx
import { withTRPC } from '@trpc/next';
import { AppType } from 'next/dist/shared/lib/utils';
import React from 'react';
import superjson from 'superjson';
import type { AppRouter } from './api/trpc/[trpc]';
const MyApp: AppType = ({ Component, pageProps }) => {
return <Component {...pageProps} />;
};
export default withTRPC<AppRouter>({
config(config) {
if (typeof window !== 'undefined') {
// during client requests
return {
transformer: superjson, // optional - adds superjson serialization
url: '/api/trpc',
};
}
// during SSR below
// optional: use SSG-caching for each rendered page (see caching section for more details)
const ONE_DAY_SECONDS = 60 * 60 * 24;
ctx?.res?.setHeader(
'Cache-Control',
`s-maxage=1, stale-while-revalidate=${ONE_DAY_SECONDS}`,
);
// The server needs to know your app's full url
// On render.com you can use `http://${process.env.RENDER_INTERNAL_HOSTNAME}:${process.env.PORT}/api/trpc`
const url = process.env.VERCEL_URL
? `https://${process.env.VERCEL_URL}/api/trpc`
: 'http://localhost:3000/api/trpc';
return {
transformer: superjson, // optional - adds superjson serialization
url,
/**
* Set custom request headers on every request from tRPC
* @see http://localhost:3000/docs/v9/header
* @see http://localhost:3000/docs/v9/ssr
*/
headers() {
if (ctx?.req) {
// To use SSR properly, you need to forward the client's headers to the server
// This is so you can pass through things like cookies when we're server-side rendering
// If you're using Node 18, omit the "connection" header
const {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
connection: _connection,
...headers
} = ctx.req.headers;
return {
...headers,
// Optional: inform server that it's an SSR request
'x-ssr': '1',
};
}
return {};
},
};
},
ssr: true,
})(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 : Puis-je utiliser getServerSideProps et/ou getStaticProps avec le SSR ?

Lorsque vous activez le SSR, tRPC utilise getInitialProps pour précharger toutes les requêtes sur le serveur. Cela cause des problèmes comme celui-ci quand vous utilisez getServerSideProps dans une page, et résoudre ce problème dépasse notre contrôle. Cependant, vous pouvez utiliser les SSG Helpers pour précharger les requêtes dans getStaticProps ou getServerSideProps.