> ## 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" }
]}
/>

Die AppSignal-Integration für [Next.js](https://nextjs.org/).

Um sowohl Backend-Traces als auch Frontend-Fehler zu melden, wird empfohlen, `@appsignal/nodejs` in Kombination mit [`@appsignal/javascript`](/front-end) und [`@appsignal/react`](/front-end/integrations/react) auf der Client-Seite zu verwenden, um Full-Stack-Performance-Monitoring und Error-Tracking zu erhalten.

<Tip>
  Aufgrund technischer Einschränkungen des AppSignal-Agents ist es nicht möglich,
  `@appsignal/nodejs` in der Serverless-Umgebung von Vercel zu verwenden. Wir
  empfehlen stattdessen die Verwendung unseres [Vercel-Log-Drain](/vercel/logs)
  sowie unserer Pakete [Front-End-JavaScript](/front-end) und
  [React](/front-end/integrations/react).
</Tip>

## Installation

Folgen Sie zunächst der [Installationsanleitung für `@appsignal/nodejs`](/nodejs/3.x/installation).

Ändern Sie anschließend die Konfigurationsdatei `next.config.js` Ihres Next-Projekts, um Instrumentation-Hooks zu aktivieren:

Wenn Sie Next 15 verwenden:

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

Wenn Sie Next 13 oder 14 verwenden:

<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>

Fügen Sie anschließend die folgende Datei als `instrumentation.js` im Stammverzeichnis Ihres Next.js-Projekts hinzu:

<Tip>
  Wenn Ihr Projekt ein `src`-Verzeichnis hat, sollte die Datei `instrumentation.js` in diesem Verzeichnis abgelegt werden.

  Wenn Ihr Projekt den [Next.js App Router](https://nextjs.org/docs/app/building-your-application/routing/defining-routes) verwendet, sollte die Datei nicht im Ordner `app` abgelegt werden, sondern in dem Ordner, der den Ordner `app` enthält.
</Tip>

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

Die Instrumentation-Hook-Datei verweist auf die Datei `appsignal.cjs`, die [bei der Konfiguration von AppSignal](/nodejs/3.x/configuration#minimal-required-configuration) erstellt wurde. Stellen Sie sicher, dass sich die Datei `appsignal.cjs` im selben Ordner wie die Datei `instrumentation.js` befindet, oder passen Sie den Pfad des `require` in der Datei `instrumentation.js` entsprechend an.

Ändern Sie schließlich Ihre Konfigurationsdatei `appsignal.cjs`, um die HTTP-Instrumentierung zu deaktivieren, da sie andernfalls redundante Traces erzeugen würde:

<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>

### TypeScript-Unterstützung

Bei Verwendung von TypeScript verweisen die Backtraces, die von serverseitigen Next.js-Fehlern erzeugt werden, auf die kompilierten JavaScript-Dateien. Folgen Sie diesen Schritten, um Next.js so zu konfigurieren, dass die Backtraces auf den ursprünglichen TypeScript-Code verweisen.

Konfigurieren Sie Next.js zunächst so, dass Source Maps erzeugt werden, indem Sie die folgenden Zeilen zur Datei `next.config.js` Ihrer Anwendung hinzufügen:

<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>

Ändern Sie anschließend in Ihrer `package.json`, wie Ihre Next.js-Anwendung beim Ausführen von `npm run start` gestartet wird, indem Sie die Umgebungsvariable `NODE_OPTIONS` verwenden, um das Flag `--enable-source-maps` an die Node.js-Laufzeit zu übergeben:

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

Wenn Sie schließlich das Frontend-Integrationspaket `@appsignal/javascript` verwenden, um clientseitige Fehler zu erfassen, fügen Sie die Option `productionBrowserSourceMaps` zur Datei `next.config.js` hinzu, damit Next.js öffentliche Source Maps erzeugt:

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

## Funktionen

Die Next.js-Integration sendet AppSignal eine Performance-Probe für jede Anfrage.

Innerhalb jeder Probe zeigt die Event-Timeline Ereignisse mit ihrer Dauer an, die Folgendem entsprechen:

* Rendern des Dokuments
* Ausführen der Funktion `getServerSideProps` *(nur Pages Router)*
* Ausführen des Route-Handlers
* Ausführen von HTTP-Anfragen mit dem serverseitigen `fetch` von Next.js *(nur App Router)*

## Standalone-Output

Es werden möglicherweise keine Daten gemeldet, wenn Next.js mit `output: "standalone"` in `next.config.js` konfiguriert ist. Wenn Next.js die App-Größe so optimiert, dass nur das enthalten ist, was von der App verwendet wird, werden die AppSignal-Extension und der Agent ausgelassen, die die Daten an unsere Server melden.

Wenn Sie den [Next.js „with-docker“-Starter](https://github.com/vercel/next.js/tree/canary/examples/with-docker) verwenden, insbesondere das [Dockerfile](https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile), ist eine Änderung erforderlich, um sicherzustellen, dass die AppSignal-Extension und der Agent im Produktions-Docker-Image enthalten sind.

Fügen Sie die folgende Zeile zu Ihrem `Dockerfile` hinzu, nach ähnlichen `COPY`-Zeilen gegen Ende der Datei:

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

Die Änderung in Git wird in etwa wie folgt aussehen, Ihr Dockerfile kann jedoch leicht abweichen:

<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>
