CloudFlare 使用 Workers 和 Nextjs 的深度集成

以前 CloudFlare 只提供了 Cloudflare Pages 的方式集成 Nextjs,现在有了 OpenNext https://opennext.js.org/ 项目后,Nextjs 也可以和 Cloudflare Workers集成,这意味着你创建一个项目,不仅有网站,还有 Workers。

毕竟 CloudFlare 的 Worker,可以有处理 Http/WebSocket 请求的 Fetch Handler https://developers.cloudflare.com/workers/runtime-apis/handlers/fetch/ ,还有接收邮件的 Email Handler https://developers.cloudflare.com/email-routing/email-workers/runtime-api/,还有后台定时任务的 Scheduled Handler https://developers.cloudflare.com/workers/runtime-apis/handlers/scheduled/ 等等强大的功能。

在你使用 OpenNext 创建一个 Nextjs 项目,在 wrangler.toml 中,worker 默认指向的是:

main = .worker-next/index.mjs

这样你是无法加其他 worker handlers,但是你可以自己创建一个 worker 文件,比如 src/worker.ts,在 wrangler.toml 中,将 worker 路径指向它:

main = "src/worker.ts"

然后在 worker 文件中,你再 import build 好的 ../.worker-next/index.mjs 文件(npm run preview/deploy 可以生成),就可以在 Worker 里面提供网站之外的服务:

import PagesFunction from "../.worker-next/index.mjs";

export default {
  // fetch: PagesFunction.fetch,
  async fetch(
    request: Request,
    env: CloudflareEnv,
    ctx: ExecutionContext
  ): Promise<Response> {
    return PagesFunction.fetch(request, env, ctx);
  },
  async scheduled(event, env, ctx) {
    ctx.waitUntil(doSomeTaskOnASchedule());
  },
  async email(message, env, ctx) {
    message.forward("<YOUR_EMAIL>");
  },
} satisfies ExportedHandler<CloudflareEnv>;