部署 Monorepo 中的 Nuxt 项目到 Cloudflare Workers
本教程将指导你将 Monorepo 结构中位于 apps/web
文件夹的 Nuxt 项目部署到 Cloudflare Workers 平台。Cloudflare Workers 是一个边缘计算平台,适合运行 Nuxt 的服务器端渲染 (SSR) 应用。本教程假设你对 Nuxt 和 Monorepo 有基本了解,但无需熟悉 Cloudflare Workers。
前提条件
- Node.js: 安装 Node.js 18.x 或更高版本(推荐通过
nvm
管理)。 - Cloudflare 账户: 在 Cloudflare 官网 注册并登录。
- Wrangler CLI: Cloudflare 的命令行工具,用于部署 Workers。
- Git: 项目已托管在 GitHub 或 GitLab(可选,但推荐)。
- Monorepo 结构: Nuxt 项目位于
apps/web
文件夹。
步骤 1: 安装 Wrangler CLI
Wrangler 是 Cloudflare Workers 的命令行工具,用于构建和部署项目。
- 全局安装 Wrangler:bash
npm install -g wrangler
- 验证安装:bash确保输出类似
wrangler --version
wrangler 3.x.x
。 - 登录 Cloudflare 账户:bash这会打开浏览器授权 Wrangler 访问你的 Cloudflare 账户。完成后返回终端。
wrangler login
步骤 2: 配置 Nuxt 项目
确保你的 Nuxt 项目(位于 apps/web
)适配 Cloudflare Workers 环境。Nuxt 的 Nitro 引擎支持 cloudflare
预设,我们需要配置它。
- 进入 Nuxt 项目目录:bash
cd apps/web
- 检查
nuxt.config.ts
: 编辑apps/web/nuxt.config.ts
,确保指定 Cloudflare Workers 的 Nitro 预设:javascriptexport default defineNuxtConfig({ nitro: { preset: 'cloudflare' } });
- 安装依赖: 在
apps/web
目录运行:bash确保项目依赖已安装,特别是npm install
@nuxt/kit
和nitro
相关依赖。 - 测试本地构建: 在
apps/web
目录运行:bash这会生成npm run build
.output
文件夹,包含适配 Cloudflare Workers 的构建产物(通常在.output/server/index.mjs
和.output/public
)。
步骤 3: 配置 Wrangler
Cloudflare Workers 使用 wrangler.toml
文件定义部署配置。我们需要在 apps/web
目录中创建并验证它。
创建
wrangler.toml
: 在apps/web
目录运行:bashwrangler init
按提示选择:
- 是否创建新的 Workers 项目?选择
y
。 - 是否使用 TypeScript?选择
n
(保持简单)。 - 是否绑定其他资源(如 KV、D1)?暂时选择
n
。
这会在
apps/web
目录生成wrangler.toml
文件。- 是否创建新的 Workers 项目?选择
编辑
wrangler.toml
: 打开apps/web/wrangler.toml
,配置如下:tomlname = "nuxt-monorepo-web" compatibility_date = "2025-08-23" main = ".output/server/index.mjs" [site] bucket = ".output/public"
name
: 项目名称,需唯一(建议包含项目名,如nuxt-monorepo-web
)。compatibility_date
: 设置为当前日期(格式:YYYY-MM-DD)。main
: 指向 Nuxt 构建的入口文件(通常是.output/server/index.mjs
)。[site].bucket
: 指向静态资源目录(通常是.output/public
)。
验证配置:
- 运行构建命令确认产物:bash确认
npm run build ls -la .output
.output/server/index.mjs
和.output/public
存在。 - 运行本地开发服务器测试配置:bash访问
wrangler dev
http://localhost:8787
,检查页面是否正常加载。 - 模拟部署检查配置:bash如果有错误,Wrangler 会提示问题(如文件路径错误)。
wrangler publish --dry-run
- 运行构建命令确认产物:
步骤 4: 构建并部署
现在可以构建 Nuxt 项目并部署到 Cloudflare Workers。
- 构建项目: 在
apps/web
目录运行:bashnpm run build
- 本地预览(可选): 使用 Wrangler 模拟 Workers 环境:bash在浏览器访问
wrangler dev
http://localhost:8787
,测试页面加载是否正常。 - 部署到 Cloudflare Workers: 运行以下命令部署项目:bash部署成功后,Wrangler 会返回一个 URL(如
wrangler publish
https://nuxt-monorepo-web.<your-account>.workers.dev
)。访问该 URL 检查部署结果。
步骤 5: 配置 Monorepo 工作流
由于项目是 Monorepo 结构,需调整工作流以确保只构建和部署 apps/web
。
- 更新
package.json
: 在apps/web/package.json
中添加部署脚本:json{ "scripts": { "build": "nuxt build", "dev": "nuxt dev", "deploy": "wrangler publish" } }
- Monorepo 工具支持: 如果使用
pnpm
,yarn
, 或turborepo
管理 Monorepo,在根目录的package.json
中添加工作流脚本:json运行:{ "scripts": { "build:web": "cd apps/web && npm run build", "deploy:web": "cd apps/web && npm run deploy" } }
bashnpm run build:web npm run deploy:web
- GitHub Actions(可选): 为自动化部署,在 Monorepo 根目录创建
.github/workflows/deploy.yml
:yamlname: Deploy Nuxt to Cloudflare Workers on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 18 - run: npm install - run: npm run build:web - name: Publish to Cloudflare run: cd apps/web && npx wrangler publish env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
- 在 Cloudflare 仪表板生成 API Token(需 Workers 权限)。
- 在 GitHub 仓库的 Settings > Secrets 中添加
CLOUDFLARE_API_TOKEN
。
步骤 6: 常见问题与解决方法
- 问题 1: 部署后页面返回 500 错误:
- 检查
.output/server/index.mjs
是否生成。运行npm run build
确认。 - 确保
wrangler.toml
中的main
和bucket
路径正确。 - 查看日志:
wrangler publish --verbose
或wrangler tail
。
- 检查
- 问题 2: API 路由(如
/api/*
)不工作:- 确认
nuxt.config.ts
使用了cloudflare
预设。 - 检查是否使用了不兼容的模块(如
node:crypto
),可能需用unenv
兼容替代方案。
- 确认
- 问题 3: Monorepo 依赖问题:
- 确保
apps/web
的package.json
包含所有必要依赖。 - 如果使用
pnpm
,运行pnpm install --filter ./apps/web
只安装apps/web
依赖。
- 确保
- 问题 4: 静态资源未加载:
- 确认
[site].bucket
指向正确的静态资源目录(.output/public
)。 - 检查 Workers 是否启用了静态资源服务。
- 确认
步骤 7: 优化与扩展
- 自定义域名: 在 Cloudflare 仪表板为 Workers 项目绑定自定义域名:
- 进入 Workers 项目 > “Triggers” > “Custom Domains”。
- 添加域名并配置 DNS 记录(通常是 CNAME)。
- 添加存储或数据库: 如果需要持久化存储:
- Cloudflare KV(键值存储):toml
[[kv_namespaces]] binding = "MY_KV" id = "<your-kv-id>"
- Cloudflare D1(SQL 数据库):toml
[[d1_databases]] binding = "MY_D1" database_name = "<your-database-name>" database_id = "<your-database-id>"
- 在
nuxt.config.ts
中通过process.env
访问绑定。
- Cloudflare KV(键值存储):
- 性能优化:
- 启用 Cloudflare 缓存(在仪表板配置)。
- 使用 Nuxt 的
useAsyncData
和useFetch
优化数据加载。 - 考虑将静态资源托管到 Cloudflare R2,减少 Workers 负载。
总结
通过以上步骤,你已成功将 Monorepo 中的 Nuxt 项目(位于 apps/web
)部署到 Cloudflare Workers。关键点包括:
- 配置
nuxt.config.ts
使用cloudflare
预设。 - 设置
wrangler.toml
指定入口文件和静态资源。 - 使用
wrangler dev
和wrangler publish --dry-run
验证配置。 - 针对 Monorepo 结构调整工作流(如
package.json
脚本或 GitHub Actions)。
如果遇到问题,参考 Cloudflare Workers 文档 或 Nuxt 部署指南。需要进一步帮助?请提供你的 nuxt.config.ts
或具体错误信息,我可以帮你排查!