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:
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:
{
"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:
Option | Type | Description |
---|---|---|
conf | Object | The same object you would use in next.config.js. Defaults to {} |
customServer | Boolean | (Optional) Set to false when the server was created by Next.js |
dev | Boolean | (Optional) Whether or not to launch Next.js in dev mode. Defaults to false |
dir | String | (Optional) Location of the Next.js project. Defaults to '.' |
quiet | Boolean | (Optional) Hide error messages containing server information. Defaults to false |
hostname | String | (Optional) The hostname the server is running behind |
port | Number | (Optional) The port the server is running behind |
httpServer | node: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:
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
.