我必须在 Next.js 项目中使用 express 吗?

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

我正在通过 Next.js 制作网站。 Next.js 提供 SSRdynamic routing.

我认为 next build & next start 显示的页面和我预期的一样。

你不需要使用express,Next JS已经有自己的内置服务器。然而,由于 express 流行,开发人员可以更轻松地与数据库通信或处理其他后端工作。

Next.js 和 Express.js 都是服务器端渲染解决方案 (SSR)。但是,您可以将 Next.js 与 Express.js 与自定义服务器 api 集成,如文档中所述:

Most of the time the default Next.js server will be enough but there are times you'll want to run your own server to integrate into an existing application. Next.js provides a custom server 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/api/test 并传递 reqres 对象进行渲染时,上面的代码将在 /api/test 渲染 React 组件。

答案:

  • 你不需要使用 express 来使用开箱即用的 nextJS;绝大多数人不会。

长答案:

如果您没有托管在 Vercel 的平台上,例如 self-hosting(AWS、Digital Ocean、Azure 等...),您可以选择 define a custom nextjs server 并交换底层服务器 implentation/framework(使用 express、fastify、vanilla 节点等。)。

什么时候自定义服务器是个好主意?

  • 当您不在 vercel 上托管时
  • 当您有自定义要求和自定义现有基础架构时

场景: 想象一家大公司,拥有他们多年来构建的大量定制基础设施(日志记录、AB 测试、定制 linters 等)。他们现在想利用一些 NextJS 抽象,例如:

  • 不同的 SSR 渲染策略
  • modern/flexible 构建系统
  • 您需要从头开始实施、维护、测试的所有其他内容...

我们称这家公司为 XCompany。 XCompany 使用 ExpressJS( 与哪个节点无关 server/framework)作为他们的 Web 服务器。他们希望继续使用 ExpressJS,因为他们投入了大量时间、资源来构建自定义基础架构和工具,例如 AB 测试集成、日志记录中间件等。

自定义服务器将允许 XCompany 继续使用 Express 而无需完全 re-write 更改,并且仍然受益于接下来提供 SSR 的 NextJS、构建系统等、良好的约定和护栏等。 在此回复结束时,我链接到 Lyft 的工程博文,介绍他们迁移到使用 NextJS 和他们自己的基础设施

当你 self-host 你的服务器并将其部署到你的基础设施上时,你会得到一个长 运行 节点服务器,这与在 Vercel 上托管不同,后者的服务器是无服务器功能。

Context/History

NextJS 底层使用 vanilla HTTP 服务器。如果您想获得类似 express 的功能,例如路由 setup/organized 的方式,您可以使用像 next-connect.

这样的包

Express使用直接依赖connect包。大多数 nodejs 服务器都遵循 connect 之类的 API 来路由和设置处理程序。

对于 NodeJS 世界之外的人 (python/flask),组织服务器路由的连接方式有点像哲学上的 WASGI - Web Server Gateway Interface

Cons/Challenges 使用自定义 NextJS 服务器?

  • 初始时间投资学习自定义 nextJS 服务器模式。绝大多数人不会走这条路
  • 你不能将自定义服务器部署到 vercel,但如果你走这条路,你可能不会走
  • 如果您不在 Vercel 上托管,您将无法获得无服务器功能。如果您没有无服务器用例,这可能不是坏处。
    • 例如,如果您的 Web 服务器将使用 websockets/WebtRTC,这需要持久的长 运行 连接 在客户端和服务器之间比无服务器功能不是最好的 选择在这里;有变通办法,但我仍然认为它不是 最佳用例。请注意,您仍然可以通过其他提供商(AWS、Azure 等)向您的自定义服务器添加无服务器功能

前进 大多数 js 运行时都集中在公开和使用 Request & Response 对象 API 并将它们公开给消费者。

注意,这里有很多东西可以讨论。请留下后续问题,我会尝试相应地更新此答案

资源