Custom Server

Examples

Next.js varsayılan olarak next start ile kendi sunucusunu içerir. Mevcut bir arka ucunuz varsa, bunu Next.js ile kullanmaya devam edebilirsiniz (bu özel bir sunucu değildir). Özel bir Next.js sunucusu, özel sunucu modellerini kullanmak için bir sunucuyu %100 programlı olarak başlatmanıza olanak tanır. Çoğu zaman buna ihtiyacınız olmayacaktır - ancak tam özelleştirme için kullanılabilir.

Bildiğim iyi oldu:

  • Özel bir sunucu kullanmaya karar vermeden önce, bunun yalnızca Next.js'nin entegre yönlendiricisi uygulama gereksinimlerinizi karşılayamadığında kullanılması gerektiğini lütfen unutmayın. Özel bir sunucu, sunucusuz işlevler ve Otomatik Statik Optimizasyon gibi önemli performans optimizasyonlarını kaldıracaktır.
  • Özel bir sunucu Vercel üzerinde konuşlandırılamaz.

Aşağıdaki özel sunucu örneğine bir göz atın:

server.js
const { createServer } = require('http')
const { parse } = require('url')
const next = require('next')
 
const dev = process.env.NODE_ENV !== 'production'
const hostname = 'localhost'
const port = 3000
// when using middleware `hostname` and `port` must be provided below
const app = next({ dev, hostname, port })
const handle = app.getRequestHandler()
 
app.prepare().then(() => {
  createServer(async (req, res) => {
    try {
      // Be sure to pass `true` as the second argument to `url.parse`.
      // This tells it to parse the query portion of the URL.
      const parsedUrl = parse(req.url, true)
      const { pathname, query } = parsedUrl
 
      if (pathname === '/a') {
        await app.render(req, res, '/a', query)
      } else if (pathname === '/b') {
        await app.render(req, res, '/b', query)
      } else {
        await handle(req, res, parsedUrl)
      }
    } catch (err) {
      console.error('Error occurred handling', req.url, err)
      res.statusCode = 500
      res.end('internal server error')
    }
  })
    .once('error', (err) => {
      console.error(err)
      process.exit(1)
    })
    .listen(port, () => {
      console.log(`> Ready on http://${hostname}:${port}`)
    })
})

server.js babel veya webpack'ten geçmez. Bu dosyanın gerektirdiği sözdiziminin ve kaynakların çalıştırdığınız mevcut node sürümüyle uyumlu olduğundan emin olun.

Özel sunucuyu çalıştırmak için scripts adresini package.json adresinde şu şekilde güncellemeniz gerekir:

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

Özel sunucu, sunucuyu Next.js uygulamasına bağlamak için aşağıdaki içe aktarmayı kullanır:

const next = require('next')
const app = next({})

Yukarıdaki next import, aşağıdaki seçeneklerle birlikte bir nesne alan bir fonksiyondur:

OptionTypeDescription
confObjectThe same object you would use in next.config.js. Defaults to {}
customServerBoolean(Optional) Set to false when the server was created by Next.js
devBoolean(Optional) Whether or not to launch Next.js in dev mode. Defaults to false
dirString(Optional) Location of the Next.js project. Defaults to '.'
quietBoolean(Optional) Hide error messages containing server information. Defaults to false
hostnameString(Optional) The hostname the server is running behind
portNumber(Optional) The port the server is running behind
httpServernode:http#Server(Optional) The HTTP Server that Next.js is running behind

Döndürülen app daha sonra Next.js'nin istekleri gerektiği gibi işlemesine izin vermek için kullanılabilir.

Disabling file-system routing

Varsayılan olarak Next, pages klasöründeki her dosyayı dosya adıyla eşleşen bir yol adı altında sunacaktır. Projeniz özel bir sunucu kullanıyorsa, bu davranış aynı içeriğin birden fazla yoldan sunulmasına neden olabilir ve bu da SEO ve UX ile ilgili sorunlara yol açabilir.

Bu davranışı devre dışı bırakmak ve pages adresindeki dosyalara dayalı yönlendirmeyi önlemek için next.config.js adresini açın ve useFileSystemPublicRoutes yapılandırmasını devre dışı bırakın:

next.config.js
module.exports = {
  useFileSystemPublicRoutes: false,
}

useFileSystemPublicRoutes adresinin SSR'den dosya adı rotalarını devre dışı bıraktığını unutmayın; istemci tarafı yönlendirme bu yollara erişmeye devam edebilir. Bu seçeneği kullanırken, programatik olarak istemediğiniz yollara navigasyona karşı korunmalısınız.

İstemci tarafı yönlendiricisini, dosya adı rotalarına istemci tarafı yönlendirmelerine izin vermeyecek şekilde yapılandırmak da isteyebilirsiniz; bunun için bkz. router.beforePopState.