名称: cloudflare-nextjs 描述: 通过OpenNext适配器将Next.js部署到Cloudflare Workers。用于SSR、ISR、App/Pages Router,或遇到Worker大小限制、运行时兼容性、连接作用域错误时。
关键词: Cloudflare Next.js, OpenNext Cloudflare, @opennextjs/cloudflare, Next.js Workers, Next.js App Router Cloudflare, Next.js Pages Router Cloudflare, Next.js SSR Cloudflare, Next.js ISR, 服务器组件cloudflare, 服务器操作cloudflare, Next.js 中间件workers, nextjs d1, nextjs r2, nextjs kv, Next.js 部署, opennextjs-cloudflare cli, nodejs_compat, worker大小限制, next.js运行时兼容性, 数据库连接作用域, Next.js迁移cloudflare 许可证: MIT 元数据: 版本: 1.0.0 最后验证: 2025-11-21 包版本: “@opennextjs/cloudflare”: “^1.13.1” “next”: “^14.2.0 || ^15.0.0 || ^16.0.0” “wrangler”: “^4.50.0” 兼容性要求: 兼容日期: “2025-05-05” 兼容标志: [“nodejs_compat”] 令牌节省: “~59%” 预防错误: 10 官方文档: “https://opennext.js.org/cloudflare” Cloudflare指南: “https://developers.cloudflare.com/workers/framework-guides/web-apps/nextjs/”
Cloudflare Next.js 部署技能
使用OpenNext Cloudflare适配器将Next.js应用程序部署到Cloudflare Workers,实现生产就绪的服务器less Next.js托管。
何时加载参考文件
根据具体任务加载额外参考文件:
-
references/error-catalog-extended.md- 在设置、构建或部署期间遇到任何错误时加载。包含11+个记录问题的完整目录,包括根本原因、解决方案和官方来源。 -
references/service-integration-patterns.md- 在将Cloudflare服务(D1、R2、KV、Workers AI)与Next.js集成时加载。包含数据库查询、文件上传、缓存和AI推理的完整模式。 -
references/troubleshooting.md- 加载以获取错误目录之外的通用故障排除和调试指南。 -
references/feature-support.md- 在检查特定Next.js功能是否在Cloudflare Workers上受支持时加载(例如,“我能使用服务器操作吗?”,“ISR有效吗?”)。 -
references/database-client-example.ts- 在集成外部数据库客户端(Drizzle、Prisma、PostgreSQL、MySQL)并需要Workers要求的正确请求作用域模式时加载。 -
references/open-next.config.ts- 在配置缓存行为、图像优化或自定义OpenNext设置时加载。 -
references/package.json- 在设置新项目或将现有Next.js应用程序迁移到Cloudflare Workers时加载。 -
references/wrangler.jsonc- 在配置Worker设置、兼容标志、环境绑定(D1、R2、KV、AI)或部署选项时加载。
使用此技能时
- 将Next.js应用程序(App Router或Pages Router)部署到Cloudflare Workers
- 需要在Cloudflare上实现服务器端渲染(SSR)、静态站点生成(SSG)或增量静态再生(ISR)
- 将现有Next.js应用从Vercel、AWS或其他平台迁移到Cloudflare
- 使用Cloudflare服务(D1、R2、KV、Workers AI)构建全栈Next.js应用程序
- 需要在Workers上使用React服务器组件、服务器操作或Next.js中间件
- 希望使用Cloudflare网络进行全球边缘部署
与标准Next.js的关键区别
OpenNext适配器将Next.js构建转换为Workers。关键要求:
- 通过
nodejs_compat标志的Node.js运行时(非Edge) - 请求作用域的数据库客户端(全局客户端失败)
- Worker大小限制:3 MiB(免费)/ 10 MiB(付费)
- 双重测试:
next dev用于速度,preview用于生产类验证
设置模式
新项目设置
使用Cloudflare的create-cloudflare(C3)CLI来搭建预配置为Workers的新Next.js项目:
npm create cloudflare@latest -- my-next-app --framework=next
这做什么:
- 运行Next.js官方设置工具(
create-next-app) - 安装
@opennextjs/cloudflare适配器 - 创建正确配置的
wrangler.jsonc - 创建用于缓存配置的
open-next.config.ts - 将部署脚本添加到
package.json - 可选地立即部署到Cloudflare
开发工作流:
npm run dev # Next.js开发服务器(快速重新加载)
npm run preview # 在workerd运行时中测试(生产类)
npm run deploy # 构建并部署到Cloudflare
现有项目迁移
将OpenNext适配器添加到现有Next.js应用程序:
1. 安装适配器
bun add -d @opennextjs/cloudflare
2. 创建 wrangler.jsonc
{
"name": "my-next-app",
"compatibility_date": "2025-05-05",
"compatibility_flags": ["nodejs_compat"]
}
关键配置:
compatibility_date: 最低2025-05-05(用于FinalizationRegistry支持)compatibility_flags: 必须包括nodejs_compat(用于Node.js运行时)
3. 创建 open-next.config.ts
import { defineCloudflareConfig } from "@opennextjs/cloudflare";
export default defineCloudflareConfig({
// 缓存配置(可选)
// 参见:https://opennext.js.org/cloudflare/caching
});
4. 更新 package.json 脚本
{
"scripts": {
"dev": "next dev",
"build": "next build",
"preview": "opennextjs-cloudflare build && opennextjs-cloudflare preview",
"deploy": "opennextjs-cloudflare build && opennextjs-cloudflare deploy",
"cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts"
}
}
脚本目的:
dev: Next.js开发服务器(快速迭代)preview: 构建 + 在workerd运行时中运行(部署前测试)deploy: 构建 + 部署到Cloudflarecf-typegen: 为Cloudflare绑定生成TypeScript类型
5. 确保Node.js运行时(非Edge)
从应用中移除Edge运行时导出:
// ❌ 移除这个(Edge运行时不支持)
export const runtime = "edge";
// ✅ 使用Node.js运行时(默认)
// 无需导出 - Node.js是默认的
开发工作流
需要双重测试:
npm run dev- 快速迭代(Next.js开发服务器)npm run preview- 生产类测试(workerd运行时,部署前必须测试)npm run deploy- 构建并部署
关键:部署前始终测试preview以捕获Workers特定运行时问题
关键配置
wrangler.jsonc最低要求:
{
"compatibility_date": "2025-05-05", // FinalizationRegistry的最低要求
"compatibility_flags": ["nodejs_compat"] // Node.js运行时必需
}
Cloudflare绑定:在wrangler.jsonc中添加D1、R2、KV或AI绑定,通过process.env访问(见“Cloudflare服务集成”部分获取完整模式)
包导出(如果需要):创建.env,设置WRANGLER_BUILD_PLATFORM="node"以优先Node.js导出
前5个关键错误
这些是最常见的部署阻塞错误。获取11+个错误的完整目录,加载references/error-catalog-extended.md。
1. Worker大小限制超出
错误: "您的Worker超出了3 MiB的大小限制"(免费)或"10 MiB"(付费)
快速修复: 升级计划,使用bunx opennextjs-cloudflare build分析捆绑包 → 检查.open-next/server-functions/default/handler.mjs.meta.json,移除未使用的依赖项,或使用动态导入。
来源: https://opennext.js.org/cloudflare/troubleshooting#worker-size-limits
2. 无法为不同请求执行I/O
错误: "无法为不同请求执行I/O"
原因: 全局数据库客户端跨请求重用(Workers限制)
快速修复: 在请求处理器内部创建数据库客户端,绝不全局。或使用专为Workers设计的Cloudflare D1。
// ❌ 错误: 全局客户端
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
// ✅ 正确: 请求作用域
export async function GET() {
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
// ... 使用pool
await pool.end();
}
3. NPM包导入失败
错误: "无法解析'<package>'"
快速修复: 在wrangler.jsonc中启用nodejs_compat标志,和/或创建.env,设置WRANGLER_BUILD_PLATFORM="node"。
来源: https://opennext.js.org/cloudflare/troubleshooting#npm-packages-fail-to-import
4. SSRF漏洞(CVE-2025-6087)
漏洞: 通过/_next/image端点的服务器端请求伪造,版本< 1.3.0
快速修复: 立即升级: bun add -d @opennextjs/cloudflare@^1.3.0
来源: https://github.com/advisories/GHSA-rvpw-p7vw-wj3m
5. 加载块失败(Turbopack)
错误: "加载块服务器/chunks/ssr/失败"
快速修复: 从构建命令中移除--turbo标志。使用next build(标准),不是next build --turbo。
来源: https://opennext.js.org/cloudflare/troubleshooting#failed-to-load-chunk
更多错误: 加载references/error-catalog-extended.md获取6个额外记录错误,包括FinalizationRegistry问题、Durable Objects警告、Prisma冲突、cross-fetch错误和Windows开发问题
功能支持矩阵
| 功能 | 状态 | 备注 |
|---|---|---|
| App Router | ✅ 完全支持 | 最新App Router功能有效 |
| Pages Router | ✅ 完全支持 | 传统Pages Router支持 |
| 路由处理器 | ✅ 完全支持 | API路由按预期工作 |
| React服务器组件 | ✅ 完全支持 | RSC完全功能 |
| 服务器操作 | ✅ 完全支持 | 服务器操作有效 |
| SSG | ✅ 完全支持 | 静态站点生成 |
| SSR | ✅ 完全支持 | 服务器端渲染 |
| ISR | ✅ 完全支持 | 增量静态再生 |
| 中间件 | ✅ 支持 | 除了Node.js中间件(15.2+) |
| 图像优化 | ✅ 支持 | 通过Cloudflare Images |
| 部分预渲染(PPR) | ✅ 支持 | 在Next.js中实验性 |
| 可组合缓存 | ✅ 支持 | 'use cache'指令 |
| 响应流 | ✅ 支持 | 流响应工作 |
next/after API |
✅ 支持 | 响应后异步工作 |
| Node.js中间件(15.2+) | ❌ 不支持 | 未来支持计划 |
| Edge运行时 | ❌ 不支持 | 使用Node.js运行时 |
Cloudflare服务集成
通过process.env在Next.js路由处理器中访问Cloudflare绑定:
import type { NextRequest } from 'next/server';
export async function GET(request: NextRequest) {
const env = process.env as any;
// D1数据库
const users = await env.DB.prepare('SELECT * FROM users').all();
// R2存储
const file = await env.BUCKET.get('file.txt');
// KV存储
const value = await env.KV.get('key');
// Workers AI
const ai = await env.AI.run('@cf/meta/llama-3-8b-instruct', { prompt: 'Hello' });
return Response.json({ users, file, value, ai });
}
Wrangler绑定配置:
{
"d1_databases": [{ "binding": "DB", "database_id": "..." }],
"r2_buckets": [{ "binding": "BUCKET", "bucket_name": "..." }],
"kv_namespaces": [{ "binding": "KV", "id": "..." }],
"ai": { "binding": "AI" }
}
详细集成模式: 加载references/service-integration-patterns.md获取完整模式,包括:
- D1: 查询、插入、事务、批量操作
- R2: 上传、下载、列表、删除与流式传输
- KV: 获取、设置TTL、删除、列出键
- Workers AI: 文本生成、嵌入、图像分类
- 多服务集成示例
- 绑定的TypeScript类型(
npm run cf-typegen)
相关技能: cloudflare-d1、cloudflare-r2、cloudflare-kv、cloudflare-workers-ai用于服务特定深入探讨
图像优化与缓存
图像: 通过Cloudflare Images自动优化(单独计费)。在open-next.config.ts中配置imageOptimization: { loader: 'cloudflare' }。使用标准Next.js <Image />组件。
缓存: OpenNext提供合理的默认值。如果需要,在open-next.config.ts中覆盖。参见 https://opennext.js.org/cloudflare/caching 获取高级配置
已知限制
尚不支持
-
Node.js中间件(Next.js 15.2+)
- 在Next.js 15.2中引入
- 未来发布支持计划
- 现在使用标准中间件
-
Edge运行时
- 仅支持Node.js运行时
- 从应用中移除
export const runtime = "edge"
-
完整Windows支持
- Windows开发不完全保证
- 使用WSL、VM或基于Linux的CI/CD
Worker大小约束
- 免费计划: 3 MiB限制(gzip压缩)
- 付费计划: 10 MiB限制(gzip压缩)
- 开发期间监控捆绑包大小
- 使用动态导入进行代码拆分
数据库连接
- 外部数据库客户端(PostgreSQL、MySQL)必须是请求作用域
- 无法跨请求重用连接(Workers限制)
- 为数据库需求优先使用Cloudflare D1(专为Workers设计)
部署
本地: npm run deploy(构建并部署)
CI/CD: 在GitHub Actions、GitLab CI或Cloudflare Workers Builds中使用npm run deploy命令(自动检测)
自定义域: Workers & Pages → Settings → Domains & Routes(域必须在Cloudflare上)
TypeScript与测试
TypeScript类型: 运行npm run cf-typegen生成带有类型绑定的cloudflare-env.d.ts(D1Database、R2Bucket、KVNamespace、Ai)
测试: 部署前始终在preview模式中测试,以捕获Workers特定运行时问题并验证绑定工作正常
从其他平台迁移
从Vercel迁移
- 复制现有Next.js项目
- 运行现有项目迁移步骤(如上)
- 在Cloudflare仪表板中更新环境变量
- 替换Vercel特定功能:
- Vercel Postgres → Cloudflare D1
- Vercel Blob → Cloudflare R2
- Vercel KV → Cloudflare KV
- Vercel Edge Config → Cloudflare KV
- 使用
npm run preview彻底测试 - 使用
npm run deploy部署
从AWS/其他平台迁移
与Vercel迁移相同过程 - 适配器自动处理Next.js标准功能。
资源
官方文档
- OpenNext Cloudflare: https://opennext.js.org/cloudflare
- Cloudflare Next.js指南: https://developers.cloudflare.com/workers/framework-guides/web-apps/nextjs/
- Next.js文档: https://nextjs.org/docs
故障排除
- 故障排除指南: https://opennext.js.org/cloudflare/troubleshooting
- 已知问题: https://opennext.js.org/cloudflare/known-issues
- GitHub问题: https://github.com/opennextjs/opennextjs-cloudflare/issues
相关技能
cloudflare-worker-base- 基于Hono + Vite + React的Worker设置cloudflare-d1- D1数据库集成cloudflare-r2- R2对象存储cloudflare-kv- KV键值存储cloudflare-workers-ai- Workers AI集成cloudflare-vectorize- RAG的向量数据库
快速参考
基本命令
# 新项目
npm create cloudflare@latest -- my-next-app --framework=next
# 开发
npm run dev # 快速迭代(Next.js开发服务器)
npm run preview # 在workerd中测试(生产类)
# 部署
npm run deploy # 构建并部署到Cloudflare
# TypeScript
npm run cf-typegen # 生成绑定类型
关键配置
// wrangler.jsonc
{
"compatibility_date": "2025-05-05", // 最低!
"compatibility_flags": ["nodejs_compat"] // 必需!
}
常见陷阱
- ❌ 使用Edge运行时 → ✅ 使用Node.js运行时
- ❌ 全局DB客户端 → ✅ 请求作用域客户端
- ❌ 旧的compatibility_date → ✅ 使用2025-05-05+
- ❌ 缺少nodejs_compat → ✅ 添加到compatibility_flags
- ❌ 仅在
dev中测试 → ✅ 部署前始终测试preview - ❌ 使用Turbopack → ✅ 使用标准Next.js构建
生产测试: 官方Cloudflare支持和活跃社区 令牌节省: ~59%对比手动设置 预防错误: 11+个记录问题 最后验证: 2025-12-04