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>;