Next.js - 使用 Cloflare Workers 进行无服务器渲染?

mrs*_*999 6 javascript node.js reactjs next.js cloudflare-workers

我正在使用 Next.js v9,并希望通过将我的应用程序与 Cloudflare Workers 结合使用来利用 Next 的无服务器部署选项。

从 Next.js 文档中,我知道 Next 创建的每个无服务器函数都具有以下签名:

export function render(req: http.IncomingMessage, res: http.ServerResponse) => void
Run Code Online (Sandbox Code Playgroud)

当使用 Node 的http.Server类(express例如使用)时,传入reqandres对象变得微不足道,并且在执行此操作的文档中显示了一个示例。

然而,问题是,CloudFlare的工人使用不同的RequestResponse比预计接下来对象。他们Request对象的文档可以在这里找到,他们Response对象的文档可以在这里找到。

因此,在 Cloudflare Workers 上运行的简单“hello world”应用程序如下所示:

// 1. Register a FetchEvent listener that sends a custom
//    response for the given request.
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

// 2. Return a custom request object
async function handleRequest(request) {
  return new Response('hello world')
}
Run Code Online (Sandbox Code Playgroud)

并呈现一个简单的 Next.js 函数可能如下所示:

const page = require('./.next/serverless/pages/some_page.js');

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  return page.render(request, new Response());
}
Run Code Online (Sandbox Code Playgroud)

结果和响应类型之间存在固有的不匹配,所以我怀疑会抛出错误。

我知道我需要修改这些,以便按照 Next.js 的预期传入。我知道,工人Request所看到物体可以修改这里。但我不确定如何使它与http.IncomingMessage对象匹配。而且我也不确定如何格式化Response对象。有什么想法吗?

谢谢

sel*_*ncy 5

您的目标是复制Node.jshttp模块的 API,该模块提供http.IncomingMessagehttp.ServerResponse. 这似乎是一项艰巨的任务,在某些方面,它违背了使用基于 Service Worker API 建模的 Cloudflare Workers 的目的。相反,考虑将 Next.js 用于 Cloudflare Workers 特定的 React SSR 方法,正如 Cloudflare在此处演示的那样。