簡體   English   中英

我必須在 Next.js 項目中使用 express 嗎?

[英]Do I have to use express in Next.js project?

我正在通過Next.js創建一個網站。 Next.js提供SSRdynamic routing

  • 我必須使用express嗎?
  • 如果是這樣,為什么我必須使用它?
  • Next.js沒有提供哪些express功能有用?

我認為next buildnext start顯示頁面和我預期的一樣。

你不需要使用 express,Next JS 已經有自己的內置服務器。 然而,由於 express 很受歡迎,開發人員更容易與數據庫通信或處理其他后端工作。

Next.js 和 Express.js 都是服務器端渲染解決方案 (SSR)。 但是,您可以將 Next.js 與 Express.js 與自定義服務器 api 集成,如文檔中所述:

大多數情況下,默認的 Next.js 服務器就足夠了,但有時您需要運行自己的服務器以集成到現有應用程序中。 Next.js 提供自定義服務器 api

const express = require("express");
const next = require("next");

const port = 3000;
const dev = process.env.NODE_ENV !== "production";
const app = next({ dev });
const handle = app.getRequestHandler();

app.prepare().then(() => {
  const server = express();

  server.get("/test", (req, res) => {
    return app.render(req, res, "/test");
  });
  
  server.get("*", (req, res) => {
    return handle(req, res);
  });

  server.listen(port, (err) => {
    if (err) throw err;
    console.log(`Ready on http://localhost:${port}`);
  });
});

例如,它展示了如何使用get Express 方法來處理 Next.js 應用程序中的路由。 當用戶指向http://localhost:3000/test並傳遞reqres對象進行渲染時,上面的代碼將在 ./pages/test.js 處渲染 React 組件。

  • 我必須使用快遞嗎? - 如果您將通過 Now 部署它,則不必這樣做。 但是,如果您要將其托管在其他地方,那么可以。
  • 如果是這樣,為什么我必須使用它? - Express 是為 SSRed 頁面提供服務的一種。
  • Next.js 沒有提供哪些 express 功能有用? Next.js 與無服務器服務器(現在)或 Express 結合使用。 這兩個是您為 Next.js 應用程序提供服務的選項。

回答:

  • 您無需使用express即可使用 nextJS 開箱即用; 絕大多數人沒有。

長答案:

如果您不在 Vercel 的平台上托管,例如自托管(AWS、Digital Ocean、Azure 等),您可以選擇定義自定義 nextjs 服務器並交換底層服務器。

什么時候定制服務器是個好主意?

  • 當您不在 vercel 上托管時
  • 當您有自定義要求和自定義現有基礎架構時。

場景:想象一個大公司,他們多年來建立了許多定制的基礎設施(日志記錄、AB 測試、定制 linter 等)( linkedin、netflix、任何公司…… )。 他們現在想要利用一些 NextJS 抽象,例如:

  • 不同的 SSR 渲染策略
  • 現代/靈活的構建系統
  • 您需要從頭開始實施,維護,測試的所有其他東西......

我們稱這家公司為 XCompany。 XCompany 為他們的 web 服務器使用 ExpressJS(不管哪個節點服務器/框架)。 他們希望繼續使用 ExpressJS,因為他們已經投入了大量時間、資源來構建自定義基礎架構和工具,例如 AB 測試集成、日志中間件等。

自定義服務器將允許 XCompany 繼續使用 Express 而無需進行重大更改,並且仍然受益於 NextJS 擅長的東西,如 SSR、構建系統等、良好的約定和護欄等。

當您自行托管服務器並將其部署到您的基礎設施時,您將獲得一個長時間運行的節點服務器,這與在 vercel 上托管不同,后者的服務器是無服務器 function。

背景/歷史

NextJS 在后台使用 vanilla HTTP 服務器。 如果您想獲得類似的express功能,例如設置/組織路線的方式,您可以使用 package 之類next-connect

Express 使用依賴於connect package。 大多數 nodejs 服務器都遵循connect ,如 API 用於路由和設置處理程序。

對於來自 NodeJS 世界(python/flask)之外的人來說,組織服務器路由的連接方式有點像WASGI - Web 服務器網關接口在哲學上,但沒有規范或類似的東西。

使用自定義 NextJS 服務器的缺點/挑戰?

  • 初次投資學習自定義 nextJS 服務器模式 絕大多數人不會走這條路
  • 您無法將自定義服務器部署到 vercel ,但如果您沿着這條路線走,您可能不會去
  • 如果您不在 vercel 上托管,您將無法獲得無服務器功能 如果您沒有無服務器用例,這可能不是缺點或缺點。
    • 例如,如果您是 web 服務器將使用 websockets/WebtRTC,這需要客戶端和服務器之間持久的長時間運行連接,而不是無服務器功能不是這里的最佳選擇; 有解決方法,但我仍然認為它不是最好的用例。 請注意,您仍然可以通過其他提供商(AWS、Azure 等)向您的自定義服務器添加無服務器功能

向前發展大多數 js 運行時都在公開和使用RequestResponse object API 並將它們公開給消費者。

請注意,這里有很多東西可以討論。 請留下后續問題,我將嘗試相應地更新此答案

資源)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM