Menu

Benutzerdefinierter Server

Next.js bringt standardmäßig einen eigenen Server mit next start mit. Wenn Sie einen bestehenden Backend-Server haben, können Sie diesen weiterhin mit Next.js verwenden (dies ist kein benutzerdefinierter Server). Ein benutzerdefinierter Next.js-Server ermöglicht es Ihnen, einen Server für benutzerdefinierte Muster programmgesteuert zu starten. In den meisten Fällen werden Sie diesen Ansatz nicht benötigen. Er steht jedoch zur Verfügung, falls Sie aussteigen müssen.

Hinweis:

  • Bevor Sie sich für einen benutzerdefinierten Server entscheiden, beachten Sie, dass dieser nur verwendet werden sollte, wenn der integrierte Router von Next.js die Anforderungen Ihrer Anwendung nicht erfüllen kann. Ein benutzerdefinierter Server entfernt wichtige Leistungsoptimierungen wie Automatische statische Optimierung.
  • Ein benutzerdefinierter Server kann nicht auf Vercel bereitgestellt werden.
  • Bei Verwendung des Standalone-Ausgabemodus werden benutzerdefinierte Serverdateien nicht nachverfolgt. Stattdessen wird eine separate minimale server.js-Datei ausgegeben. Diese können nicht zusammen verwendet werden.

Sehen Sie sich das folgende Beispiel eines benutzerdefinierten Servers an:

server.ts
import { createServer } from 'http'
import { parse } from 'url'
import next from 'next'
 
const port = parseInt(process.env.PORT || '3000', 10)
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
 
app.prepare().then(() => {
  createServer((req, res) => {
    const parsedUrl = parse(req.url!, true)
    handle(req, res, parsedUrl)
  }).listen(port)
 
  console.log(
    `> Server läuft unter http://localhost:${port} als ${
      dev ? 'Entwicklung' : process.env.NODE_ENV
    }`
  )
})
server.js
import { createServer } from 'http'
import { parse } from 'url'
import next from 'next'
 
const port = parseInt(process.env.PORT || '3000', 10)
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
 
app.prepare().then(() => {
  createServer((req, res) => {
    const parsedUrl = parse(req.url, true)
    handle(req, res, parsedUrl)
  }).listen(port)
 
  console.log(
    `> Server läuft unter http://localhost:${port} als ${
      dev ? 'Entwicklung' : process.env.NODE_ENV
    }`
  )
})

server.js durchläuft nicht den Next.js-Compiler oder den Bundling-Prozess. Stellen Sie sicher, dass die Syntax und der Quellcode dieser Datei mit der aktuellen Node.js-Version, die Sie verwenden, kompatibel sind. Beispiel anzeigen.

Um den benutzerdefinierten Server auszuführen, müssen Sie die scripts in package.json wie folgt aktualisieren:

package.json
{
  "scripts": {
    "dev": "node server.js",
    "build": "next build",
    "start": "NODE_ENV=production node server.js"
  }
}

Alternativ können Sie nodemon einrichten (Beispiel). Der benutzerdefinierte Server verwendet den folgenden Import, um den Server mit der Next.js-Anwendung zu verbinden:

import next from 'next'
 
const app = next({})

Der oben genannte next-Import ist eine Funktion, die ein Objekt mit den folgenden Optionen erhält:

OptionTypBeschreibung
confObjectDas gleiche Objekt, das Sie in next.config.js verwenden würden. Standard ist {}
customServerBoolean(Optional) Auf false setzen, wenn der Server von Next.js erstellt wurde
devBoolean(Optional) Ob Next.js im Entwicklungsmodus gestartet werden soll. Standard ist false
dirString(Optional) Speicherort des Next.js-Projekts. Standard ist '.'
quietBoolean(Optional) Fehlermeldungen mit Serverinformationen ausblenden. Standard ist false
hostnameString(Optional) Der Hostname, hinter dem der Server läuft
portNumber(Optional) Der Port, auf dem der Server läuft
httpServernode:http#Server(Optional) Der HTTP-Server, hinter dem Next.js läuft
turboBoolean(Optional) Turbopack aktivieren

Der zurückgegebene app kann dann verwendet werden, um Anfragen nach Bedarf zu verarbeiten.