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

7uzetpgm  于 2022-12-21  发布在  Java
关注(0)|答案(3)|浏览(518)

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

  • 我必须使用express吗?
  • 如果是这样,我为什么要使用它?
  • express的哪些功能是有用的,而Next.js没有提供?

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

xeufq47z

xeufq47z1#

你不需要使用express,Next JS已经有了自己的内置服务器,但是由于express的流行,开发人员与数据库的通信或者处理其他后台工作会更加容易。

dgiusagp

dgiusagp2#

答案:

  • 您不需要使用express来使用开箱即用的nextJS;绝大多数人都不知道。

详细答案:

如果您不在Vercel平台上托管,例如自托管(AWS、Digital Ocean、Azure等),您可以选择define a custom nextjs server并交换底层服务器实现/框架(* 使用express、fastify、vanilla节点等 *)。

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

  • 当你不在vercel上托管的时候
  • 当您有定制需求和定制现有基础架构时
    **场景:**想象一下,一家大公司多年来构建了大量自定义基础设施(日志记录、AB测试、自定义链接器等),现在他们希望利用一些NextJS抽象,如:
  • 不同SSR渲染策略
  • 现代/灵活建筑系统
  • 所有其他你需要从头开始实现的东西,维护,测试...

让我们称这家公司为XCompany。XCompany使用ExpressJS(* 无论是哪个节点服务器/框架 )作为他们的Web服务器。他们希望继续使用ExpressJS,因为他们已经投入了大量的时间、资源来构建定制的基础设施和工具,如AB测试集成、日志记录中间件等。
自定义服务器将允许XCompany继续使用Express,而无需完全重写更改,并且仍然受益于NextJS接下来提供的SSR、构建系统等、漂亮的约定和护栏等。
在此回复的结尾,我链接到Lyft的工程博客,该博客介绍了他们迁移到使用NextJS及其自己的基础架构 *
当您自托管您的服务器并将其部署到您的on基础结构时,您将获得一个长时间运行的节点服务器,这与在vercel上托管不同,在vercel上,服务器是一个无服务器功能。

背景/历史

NextJS使用的是普通的HTTP服务器,如果你想获得类似express的功能,比如路由的设置/组织方式,你可以使用像next-connect这样的包。
Express用于直接依赖connect包。大多数nodejs服务器遵循connect之类的API来路由和设置处理程序。
对于NodeJS世界(python/flask)之外的人来说,组织服务器路由的连接风格有点像哲学上的WASGI - Web Server Gateway Interface

使用自定义NextJS服务器的缺点/挑战?

*最初投资学习定制nextJS服务器模式

  • 绝大多数人不走这条路,所以文档更加稀缺
    *如果你没有在vercel上托管,你就不会得到无服务器的功能。如果你没有无服务器的用例,这可能不是缺点或缺点。
  • 例如,如果你的网络服务器将使用websockets/WebtRTC,这需要客户端和服务器之间持久的长时间运行的连接,而无服务器功能在这里不是最好的选择;有变通的方法,但我仍然认为这不是最好的用例。注意,您仍然可以通过另一个提供商(AWS,Azure等)将无服务器功能添加到您的自定义服务器
    向前发展大多数js运行时都集中在公开和使用RequestResponse对象API,并将它们公开给消费者。

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

资源

pod7payv

pod7payv3#

Next.js和Express.js都是服务器端呈现解决方案(SSR)。但是,您可以使用自定义服务器API将Next.js与Express.js集成,如文档中所述:
大多数时候默认的Next.js服务器就足够了,但是有时候你需要运行自己的服务器来集成到现有的应用程序中。

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组件。

相关问题