跳至內容

自訂伺服器

Next.js 預設包含自己的伺服器,可使用 next start 啟動。如果您已擁有後端,仍然可以將其與 Next.js 搭配使用(這不是自訂伺服器)。自訂 Next.js 伺服器允許您以程式化方式啟動伺服器以實現自訂模式。大多數情況下,您不需要這種方法。但是,如果您需要退出預設設定,可以使用它。

注意事項 (Good to know):

  • 在決定使用自訂伺服器之前,請記住,只有在 Next.js 的整合路由器無法滿足您的應用程式需求時才應該使用它。自訂伺服器會移除重要的效能優化,例如自動靜態優化
  • 自訂伺服器無法部署在 Vercel 上。
  • 使用獨立輸出模式時,它不會追蹤自訂伺服器檔案。此模式會輸出一個單獨的最小 server.js 檔案。它們不能一起使用。

參考以下範例,了解如何建立自訂伺服器

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 listening at https://127.0.0.1:${port} as ${
      dev ? 'development' : process.env.NODE_ENV
    }`
  )
})

server.js 並不會經過 Next.js 編譯器或打包程序。請確保此檔案所需的語法和原始碼與您目前使用的 Node.js 版本相容。參考一個範例

要執行自訂伺服器,您需要像這樣更新 package.json 中的 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物件與您在 next.config.js 中使用的物件相同。預設為 {}
customServer布林值(*選用*)當伺服器由 Next.js 建立時,設為 false
dev布林值布林值
(*選用*)是否以開發模式啟動 Next.js。預設為 falsedir字串
(*選用*)Next.js 專案的位置。預設為 '.'布林值quiet
布林值dir(*選用*)隱藏包含伺服器資訊的錯誤訊息。預設為 false
hostname字串(*選用*)伺服器執行的背後主機名稱
port數字(*選用*)伺服器執行的背後埠號
Turbo布林值httpServer

node:http#Server