Настройка пользовательского сервера в Next.js
Next.js по умолчанию включает собственный сервер с командой next start
. Если у вас есть существующий бэкенд, вы все равно можете использовать его с Next.js (это не пользовательский сервер). Пользовательский сервер Next.js позволяет программно запускать сервер для реализации пользовательских сценариев. В большинстве случаев этот подход не требуется, но он доступен, если вам нужно выйти за рамки стандартного поведения.
Важно знать:
- Прежде чем решить использовать пользовательский сервер, учтите, что это следует делать только тогда, когда встроенный маршрутизатор Next.js не может удовлетворить требования вашего приложения. Пользовательский сервер отключает важные оптимизации производительности, такие как Автоматическая статическая оптимизация.
- При использовании режима standalone output он не отслеживает файлы пользовательского сервера. Вместо этого этот режим выводит отдельный минимальный файл
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 listening at http://localhost:${port} as ${
dev ? 'development' : process.env.NODE_ENV
}`
)
})
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 listening at http://localhost:${port} as ${
dev ? 'development' : process.env.NODE_ENV
}`
)
})
Файл
server.js
не проходит через компилятор Next.js или процесс сборки. Убедитесь, что синтаксис и исходный код этого файла совместимы с используемой версией Node.js. Пример.
Для запуска пользовательского сервера обновите scripts
в package.json
следующим образом:
{
"scripts": {
"dev": "node server.js",
"build": "next build",
"start": "NODE_ENV=production node server.js"
}
}
Альтернативно можно настроить nodemon
(пример). Пользовательский сервер использует следующий импорт для соединения с приложением Next.js:
import next from 'next'
const app = next({})
Импорт next
представляет собой функцию, которая принимает объект со следующими опциями:
Опция | Тип | Описание |
---|---|---|
conf | Object | Тот же объект, что используется в next.config.js . По умолчанию {} |
dev | Boolean | (Опционально) Запускать ли Next.js в режиме разработки. По умолчанию false |
dir | String | (Опционально) Расположение проекта Next.js. По умолчанию '.' |
quiet | Boolean | (Опционально) Скрывать сообщения об ошибках с информацией о сервере. По умолчанию false |
hostname | String | (Опционально) Имя хоста, на котором работает сервер |
port | Number | (Опционально) Порт, на котором работает сервер |
httpServer | node:http#Server | (Опционально) HTTP-сервер, на котором работает Next.js |
turbo | Boolean | (Опционально) Включить Turbopack |
Возвращаемый объект app
может затем использоваться для обработки запросов Next.js по мере необходимости.