> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Next.js

export const VersionRequirements = ({versions = []}) => {
  if (!Array.isArray(versions) || versions.length === 0) {
    return null;
  }
  const boundaries = {
    upper: " or lower",
    exact: "",
    lower: " or higher"
  };
  const containerStyle = {
    marginTop: "0.5rem",
    marginBottom: "1.5rem"
  };
  const lineStyle = {
    display: "block",
    margin: "0 0 0.35rem 0",
    fontSize: "0.875rem",
    lineHeight: "1.4"
  };
  const pillBaseStyle = {
    display: "inline-block",
    padding: "0.1em 0.4em",
    borderRadius: "0.25rem",
    border: "1px solid",
    fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
    fontSize: "0.85em",
    fontWeight: 500
  };
  const pillColors = {
    "AppSignal for Elixir": {
      background: "#f3e8ff",
      borderColor: "#e9d5ff",
      color: "#9333ea"
    },
    "AppSignal for Front-end": {
      background: "#fef9c3",
      borderColor: "#fde68a",
      color: "#ca8a04"
    },
    "AppSignal for Go": {
      background: "#ccfbf1",
      borderColor: "#99f6e4",
      color: "#0d9488"
    },
    "AppSignal for JavaScript": {
      background: "#fef9c3",
      borderColor: "#fde68a",
      color: "#ca8a04"
    },
    "AppSignal for Node.js": {
      background: "#dcfce7",
      borderColor: "#bbf7d0",
      color: "#16a34a"
    },
    "AppSignal for Python": {
      background: "#dbeafe",
      borderColor: "#bfdbfe",
      color: "#2563eb"
    },
    "AppSignal for Ruby": {
      background: "#fee2e2",
      borderColor: "#fecaca",
      color: "#dc2626"
    },
    "AppSignal for Rust": {
      background: "#ffedd5",
      borderColor: "#fed7aa",
      color: "#ea580c"
    }
  };
  const defaultPillColor = {
    background: "#f4f4f5",
    borderColor: "#e4e4e7",
    color: "#52525b"
  };
  const getPillStyle = name => ({
    ...pillBaseStyle,
    ...pillColors[name] || defaultPillColor
  });
  const getBoundText = bound => {
    return boundaries[bound] || boundaries.lower;
  };
  return <div style={containerStyle}>
      {versions.map((v, i) => <p key={`${v.name}-${v.version}-${v.bound || "lower"}-${i}`} style={lineStyle}>
          This feature requires{" "}
          <code style={getPillStyle(v.name)}>{v.name}</code> version {v.version}
          {getBoundText(v.bound)}.
        </p>)}
    </div>;
};

<VersionRequirements
  versions={[
{ name: "AppSignal for Node.js", version: "3.0.14" },
{ name: "Next.js", version: "13.3.0" }
]}
/>

L'intégration AppSignal pour [Next.js](https://nextjs.org/).

Pour rapporter à la fois les traces back-end et les erreurs front-end, il est recommandé d'utiliser `@appsignal/nodejs` en combinaison avec [`@appsignal/javascript`](/front-end) et [`@appsignal/react`](/front-end/integrations/react) côté client pour une surveillance complète des performances et un suivi des erreurs sur l'ensemble de la pile.

<Tip>
  En raison de limitations techniques de l'agent AppSignal, il n'est pas possible
  d'utiliser `@appsignal/nodejs` dans l'environnement serverless de Vercel. Nous
  recommandons d'utiliser à la place notre [Vercel log drain](/vercel/logs) et
  nos packages [JavaScript front-end](/front-end) et
  [React](/front-end/integrations/react).
</Tip>

## Installation

Tout d'abord, suivez les [instructions d'installation de `@appsignal/nodejs`](/nodejs/3.x/installation).

Ensuite, modifiez le fichier de configuration `next.config.js` de votre projet Next afin d'activer les hooks d'instrumentation :

Si vous utilisez Next 15 :

<CodeGroup>
  ```javascript JavaScript theme={null}
  const nextConfig = {
    serverExternalPackages: ["@appsignal/nodejs"],
  };
  ```
</CodeGroup>

Si vous utilisez Next 13 ou 14 :

<CodeGroup>
  ```javascript JavaScript theme={null}
  const nextConfig = {
    // Add the `experimental` object if not present
    experimental: {
      // Add the following lines inside the object
      instrumentationHook: true,
      serverComponentsExternalPackages: ["@appsignal/nodejs"],
    },
  };
  ```
</CodeGroup>

Puis, ajoutez le fichier suivant à la racine de votre projet Next.js sous le nom `instrumentation.js` :

<Tip>
  Si votre projet a un répertoire `src`, alors le fichier `instrumentation.js` doit être placé dans ce répertoire.

  Si votre projet utilise le [Next.js App Router](https://nextjs.org/docs/app/building-your-application/routing/defining-routes), le fichier ne doit pas être placé dans le dossier `app`, mais dans le dossier qui contient le dossier `app`.
</Tip>

<CodeGroup>
  ```javascript JavaScript theme={null}
  export function register() {
    if (process.env.NEXT_RUNTIME === "nodejs") {
      require("./appsignal.cjs");
    }
  }
  ```
</CodeGroup>

Le fichier de hook d'instrumentation référence le fichier `appsignal.cjs` qui a été créé [lors de la configuration d'AppSignal](/nodejs/3.x/configuration#minimal-required-configuration). Assurez-vous que le fichier `appsignal.cjs` se trouve dans le même dossier que le fichier `instrumentation.js`, ou ajustez le chemin du `require` dans le fichier `instrumentation.js` en conséquence.

Enfin, modifiez votre fichier de configuration `appsignal.cjs` afin de désactiver l'instrumentation HTTP, qui générerait sinon des traces redondantes :

<CodeGroup>
  ```javascript JavaScript theme={null}
  const { Appsignal } = require("@appsignal/nodejs");

  new Appsignal({
    // Add the `disableDefaultInstrumentations` list if not present
    disableDefaultInstrumentations: [
      // Add the following line inside the list
      "@opentelemetry/instrumentation-http",
    ],
  });
  ```
</CodeGroup>

### Prise en charge de TypeScript

Lorsque vous utilisez TypeScript, les backtraces émises par les erreurs Next.js côté serveur feront référence aux fichiers JavaScript compilés. Suivez ces étapes pour configurer Next.js de sorte que les backtraces se réfèrent au code TypeScript original.

Tout d'abord, configurez Next.js pour émettre des source maps en ajoutant les lignes suivantes au fichier `next.config.js` de votre application :

<CodeGroup>
  ```javascript JavaScript theme={null}
  const nextConfig = {
    // Add the `webpack` function if not present
    webpack: (config, { isServer }) => {
      // Add the following lines inside the function
      if (isServer) {
        config.devtool = "eval-source-map";
      }

      return config;
    },
  };
  ```
</CodeGroup>

Puis, dans votre `package.json`, modifiez la façon dont votre application Next.js est démarrée lors de l'exécution de `npm run start`, en utilisant la variable d'environnement `NODE_OPTIONS` pour passer l'indicateur `--enable-source-maps` au runtime Node.js :

<CodeGroup>
  ```json JSON theme={null}
  {
    "scripts": {
      // Modify the `start` script as follows
      "start": "NODE_OPTIONS=--enable-source-maps next start"
    }
  }
  ```
</CodeGroup>

Enfin, si vous utilisez le package d'intégration front-end `@appsignal/javascript` pour suivre les erreurs côté client, ajoutez l'option `productionBrowserSourceMaps` au fichier `next.config.js` pour que Next.js émette des source maps publiques :

<CodeGroup>
  ```javascript JavaScript theme={null}
  const nextConfig = {
    // Add the `productionBrowserSourceMaps` flag
    productionBrowserSourceMaps: true,
  };
  ```
</CodeGroup>

## Fonctionnalités

L'intégration Next.js enverra à AppSignal un échantillon de performance pour chaque requête.

Au sein de chaque échantillon, la chronologie des événements affichera des événements, avec leur durée, correspondant à :

* Le rendu du document
* L'exécution de la fonction `getServerSideProps` *(pages router uniquement)*
* L'exécution du gestionnaire de route
* La réalisation de requêtes HTTP via le `fetch` côté serveur de Next.js *(app router uniquement)*

## Sortie standalone

Aucune donnée ne peut être rapportée lorsque Next.js est configuré avec `output: "standalone"` dans `next.config.js`. Lorsque Next.js optimise la taille de son application pour n'inclure que ce qui est utilisé par l'application, il omet l'extension et l'agent AppSignal, qui rapportent les données à nos serveurs.

Lorsque vous utilisez le [starter Next.js « with-docker »](https://github.com/vercel/next.js/tree/canary/examples/with-docker), en particulier le [Dockerfile](https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile), une modification est nécessaire pour s'assurer que l'extension et l'agent AppSignal sont inclus dans l'image Docker de production.

Ajoutez la ligne suivante à votre `Dockerfile`, après des lignes `COPY` similaires près de la fin du fichier :

<CodeGroup>
  ```docker Dockerfile theme={null}
  # Dockerfile
  COPY --from=builder --chown=nextjs:nodejs /app/node_modules/@appsignal/nodejs ./node_modules/@appsignal/nodejs
  ```
</CodeGroup>

Le changement dans Git ressemblera à quelque chose comme ceci, mais votre Dockerfile peut être légèrement différent :

<CodeGroup>
  ```diff Diff theme={null}
  --- Dockerfile
  +++ Dockerfile
  @@ -48,6 +48,7 @@ COPY --from=builder /app/public ./public
   # https://nextjs.org/docs/advanced-features/output-file-tracing
   COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
   COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
  +COPY --from=builder --chown=nextjs:nodejs /app/node_modules/@appsignal/nodejs ./node_modules/@appsignal/nodejs

   USER nextjs
  ```
</CodeGroup>
