# Cloudflare > 部署 Nitro 应用到 Cloudflare。 ## Cloudflare Workers **预设:** `cloudflare_module` 与此提供者的集成可以通过 [零配置](/deploy#zero-config-providers) 实现,支持 [workers builds (beta)](https://developers.cloudflare.com/workers/ci-cd/builds/)。 要将 Workers 与静态资产一起使用,您需要设置 Nitro 兼容日期为 `2024-09-19` 或更高。 以下是将 Nitro 应用部署到 Cloudflare Workers 的示例 `nitro.config.ts` 文件。 ```ts [nitro.config.ts] import { defineNitroConfig } from "nitro/config"; export default defineNitroConfig({ compatibilityDate: "2024-09-19", preset: "cloudflare_module", cloudflare: { deployConfig: true, nodeCompat: true } }) ``` ```ts [nuxt.config.ts] export default defineNuxtConfig({ compatibilityDate: "2024-09-19", nitro: { preset: "cloudflare_module", cloudflare: { deployConfig: true, nodeCompat: true } } }) ``` :: 通过设置 `deployConfig: true`,Nitro 将自动为您生成一个正确配置的 `wrangler.json`。 如果您需要添加 [Cloudflare Workers 配置](https://developers.cloudflare.com/workers/wrangler/configuration/),例如 [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/),您可以: - 在您的 Nitro 配置中设置 `cloudflare: { wrangler : {} }`。这与 `wrangler.json` 的类型相同。 - 提供您自己的 `wrangler.json`。Nitro 将与适当的设置合并您的配置,包括指向构建输出。 ### 本地预览 您可以使用 [Wrangler](https://github.com/cloudflare/workers-sdk/tree/main/packages/wrangler) 在本地预览您的应用: ### 手动部署 构建应用程序后,您可以使用 Wrangler 手动部署它。 首先确保您已登录到 Cloudflare 账户: 然后您可以用以下命令部署应用程序: ### 运行时钩子 您可以使用以下 [运行时钩子](/guide/plugins#nitro-runtime-hooks) 来扩展 [Worker 处理程序](https://developers.cloudflare.com/workers/runtime-apis/handlers/)。 - [`cloudflare:scheduled`](https://developers.cloudflare.com/workers/runtime-apis/handlers/scheduled/) - [`cloudflare:email`](https://developers.cloudflare.com/email-routing/email-workers/runtime-api/) - [`cloudflare:queue`](https://developers.cloudflare.com/queues/configuration/javascript-apis/#consumer) - [`cloudflare:tail`](https://developers.cloudflare.com/workers/runtime-apis/handlers/tail/) - `cloudflare:trace` ### 额外导出 你可以在项目根目录下添加一个 `exports.cloudflare.ts` 文件,以向 Cloudflare Worker 入口点导出额外的处理程序或属性。 ```ts [exports.cloudflare.ts] export class MyWorkflow extends WorkflowEntrypoint { async run(event: WorkflowEvent, step: WorkflowStep) { // ... } } ``` Nitro 将自动检测此文件,并在最终构建中包含其导出内容。 `exports.cloudflare.ts` 文件不能有默认导出。 您还可以在 `nitro.config.ts` 中使用 `cloudflare.exports` 选项自定义入口文件的位置: ```ts [nitro.config.ts] export default defineConfig({ cloudflare: { exports: "custom-exports-entry.ts" } }) ``` ## Cloudflare Pages **预设:** `cloudflare_pages` 与此提供者的集成可以通过 [零配置](/deploy#zero-config-providers) 实现。 Cloudflare [Workers Module](#cloudflare-workers) 是推荐用于部署的新预设。如果您只需特定功能,请考虑使用 Pages。 以下是将 Nitro 应用部署到 Cloudflare Pages 的示例 `nitro.config.ts` 文件。 ```ts [nitro.config.ts] import { defineNitroConfig } from "nitro/config"; export default defineNitroConfig({ preset: "cloudflare_pages", cloudflare: { deployConfig: true, nodeCompat:true } }) ``` ```ts [nuxt.config.ts] export default defineNuxtConfig({ nitro: { preset: "cloudflare_pages", cloudflare: { deployConfig: true, nodeCompat:true } } }) ``` :: Nitro 将自动生成一个 `_routes.json` 文件,该文件控制来自文件的路由和来自 Worker 脚本的路由。通过配置选项 `cloudflare.pages.routes` 可以覆盖自动生成的路由文件 ([了解更多](https://developers.cloudflare.com/pages/platform/functions/routing/#functions-invocation-routes))。 ### 本地预览 您可以使用 [Wrangler](https://github.com/cloudflare/workers-sdk/tree/main/packages/wrangler) 在本地预览您的应用: ### 手动部署 构建应用程序后,您可以使用 Wrangler 手动部署它,首先确保您已登录到 Cloudflare 账户: 然后您可以用以下命令部署应用程序: ## 使用 GitHub Actions 在 CI/CD 中部署 无论您是使用 Cloudflare Pages 还是 Cloudflare Workers,您都可以使用 [Wrangler GitHub actions](https://github.com/marketplace/actions/deploy-to-cloudflare-workers-with-wrangler) 来部署您的应用。 **注意:** 请记得 [指示 Nitro 使用正确的预设](/deploy#changing-the-deployment-preset)(请注意,这在所有预设中都是必要的,包括 `cloudflare_pages`)。 ## 环境变量 Nitro 允许您通过 `process.env` 或 `import.meta.env` 或运行时配置通用访问环境变量。 确保仅在 **事件生命周期内** 访问环境变量,而不是在全局上下文中,因为 Cloudflare 仅在请求生命周期期间提供它们,而不是在此之前。 **示例:** 如果您设置了 `SECRET` 和 `NITRO_HELLO_THERE` 环境变量,您可以通过以下方式访问它们: ```ts import { defineHandler } from "nitro/h3"; import { useRuntimeConfig } from "nitro/runtime-config"; console.log(process.env.SECRET) // 请注意,这是在全局范围内!因此实际上它不起作用,变量是未定义的! export default defineHandler((event) => { // 请注意,所有以下方式都是访问上述变量的有效方法 useRuntimeConfig().helloThere useRuntimeConfig().secret process.env.NITRO_HELLO_THERE import.meta.env.SECRET }); ``` ### 在开发模式中指定变量 在开发时,您可以使用 `.env` 或 `.env.local` 文件指定环境变量: ```ini NITRO_HELLO_THERE="captain" SECRET="top-secret" ``` **注意:** 请确保将 `.env` 和 `.env.local` 添加到 `.gitignore` 文件中,以免您提交它,因为它可能包含敏感信息。 ### 为本地预览指定变量 构建后,当您尝试在本地使用 `wrangler dev` 或 `wrangler pages dev` 测试项目时,为了访问环境变量,您需要在项目根目录中指定在 `.dev.vars` 文件中(如 [Pages](https://developers.cloudflare.com/pages/functions/bindings/#interact-with-your-environment-variables-locally) 和 [Workers](https://developers.cloudflare.com/workers/configuration/environment-variables/#interact-with-environment-variables-locally) 文档中所示)。 如果您在开发时使用了 `.env` 或 `.env.local` 文件,则您的 `.dev.vars` 应与之相同。 **注意:** 请确保将 `.dev.vars` 添加到 `.gitignore` 文件中,以免您提交它,因为它可能包含敏感信息。 ### 为生产环境指定变量 对于生产环境,请使用 Cloudflare 控制台或 [`wrangler secret`](https://developers.cloudflare.com/workers/wrangler/commands/#secret) 命令设置环境变量和机密。 ### 使用 `wrangler.toml`/`wrangler.json` 指定变量 您可以指定自定义的 `wrangler.toml`/`wrangler.json` 文件,并在其中定义变量。 请注意,这不推荐用于敏感数据,例如机密。 **示例:** ```ini [wrangler.toml] # 共享 [vars] NITRO_HELLO_THERE="general" SECRET="secret" # 为 `--env production` 用法覆盖值 [env.production.vars] NITRO_HELLO_THERE="captain" SECRET="top-secret" ``` ```json [wrangler.json] { "vars": { "NITRO_HELLO_THERE": "general", "SECRET": "secret" }, "env": { "production": { "vars": { "NITRO_HELLO_THERE": "captain", "SECRET": "top-secret" } } } } ``` ## 直接访问 Cloudflare 绑定 绑定允许您与 Cloudflare 平台上的资源交互,这些资源的示例包括键值数据存储 ([KVs](https://developers.cloudflare.com/kv/)) 和无服务器 SQL 数据库 ([D1s](https://developers.cloudflare.com/d1/))。 有关绑定的更多详细信息及其用法,请参阅 Cloudflare 的 [Pages](https://developers.cloudflare.com/pages/functions/bindings/) 和 [Workers](https://developers.cloudflare.com/workers/configuration/bindings/#bindings) 文档。 Nitro 提供了高级 API,以便与 [KV 存储](/guide/storage) 和 [数据库](/guide/database) 交互,强烈建议您优先使用它们,而不是直接依赖低级 API 以确保使用稳定性。 在运行时,您可以通过访问请求事件的 `context.cloudflare.env` 字段来访问绑定,例如,您可以这样访问 D1 绑定: ```ts import { defineHandler } from "nitro/h3"; defineHandler(async (event) => { const { cloudflare } = event.context const stmt = await cloudflare.env.MY_D1.prepare('SELECT id FROM table') const { results } = await stmt.all() }) ``` ### 在本地开发中访问绑定 要在开发模式下访问绑定,首先需要定义它们。你可以在 `wrangler.jsonc`、`wrangler.json` 或 `wrangler.toml` 文件中进行定义。 例如,在 `wrangler.toml` 中定义一个变量和一个 KV 命名空间: ```ini [wrangler.toml] [vars] MY_VARIABLE="my-value" [[kv_namespaces]] binding = "MY_KV" id = "xxx" ``` ```json [wrangler.json] { "vars": { "MY_VARIABLE": "my-value" }, "kv_namespaces": [ { "binding": "MY_KV", "id": "xxx" } ] } ``` 接下来我们安装所需的 `wrangler` 包(如果尚未安装): ```ts [nuxt.config.ts] export default defineNuxtConfig({ modules: ['nitro-cloudflare-dev'] }) ``` :: 从此时起,当运行 您将能够像上面所示一样,从请求事件中访问 `MY_VARIABLE` 和 `MY_KV`。 #### Wrangler 环境 如果您有多个 Wrangler 环境,可以在 Cloudflare 开发仿真期间指定要使用的 Wrangler 环境: ```ts [nitro.config.ts] import { defineNitroConfig } from "nitro/config"; export default defineNitroConfig({ preset: 'cloudflare-module', cloudflare: { dev: { environment: 'preview' } } }) ```