我必须在 Next.js 项目中使用 express 吗?
Do I have to use express in Next.js project?
我正在通过 Next.js
制作网站。
Next.js
提供 SSR
和 dynamic routing
.
- 我必须使用
express
吗?
- 如果是这样,为什么我必须使用它?
- 哪些
express
的有用功能是 Next.js
没有提供的?
我认为 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
并传递 req
和 res
对象进行渲染时,上面的代码将在 /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 并将它们公开给消费者。
注意,这里有很多东西可以讨论。请留下后续问题,我会尝试相应地更新此答案
资源
- how to deploy a nextjs custom server to another provider (not vercel)
- fastify-nextjs 有如何使用 fastify 创建自定义 nextJS 服务器的示例。
- Changing Lanes: How Lyft is Migrating 100+ Frontend Microservices to Next.js
- NextJS docs for Custom Server
- npmjs - connect
- npmjs - next-connect
- ExpressJS 是如何工作的
我正在通过 Next.js
制作网站。
Next.js
提供 SSR
和 dynamic routing
.
- 我必须使用
express
吗? - 如果是这样,为什么我必须使用它?
- 哪些
express
的有用功能是Next.js
没有提供的?
我认为 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
并传递 req
和 res
对象进行渲染时,上面的代码将在 /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 并将它们公开给消费者。
注意,这里有很多东西可以讨论。请留下后续问题,我会尝试相应地更新此答案
资源
- how to deploy a nextjs custom server to another provider (not vercel)
- fastify-nextjs 有如何使用 fastify 创建自定义 nextJS 服务器的示例。
- Changing Lanes: How Lyft is Migrating 100+ Frontend Microservices to Next.js
- NextJS docs for Custom Server
- npmjs - connect
- npmjs - next-connect
- ExpressJS 是如何工作的