Cloudflare Pages 适配器

Qwik City Cloudflare Pages 适配器允许您将 Qwik City 连接到 Cloudflare Pages.

安装

要集成 cloudflare-pages 适配器,请使用 add 命令

npm run qwik add cloudflare-pages

适配器将在 adapters/ 目录中添加一个新的 vite.config.ts,并创建一个新的入口文件,例如

└── adapters/
    └── cloudflare-pages/
        └── vite.config.ts
└── src/
    └── entry.cloudflare-pages.tsx

此外,在 package.json 中,build.serverdeploy 脚本将被更新。

请注意您本地环境中的 nodejs 版本,方法是运行 node -v 命令

node -v
v20.11.1

当使用 npm create qwik@latest 设置您的 Qwik 应用程序时,它可能会使用与 Cloudflare Pages 默认使用的 nodejs 版本不同的版本(v16.20.2)。

生产构建

要为生产构建应用程序,请使用 build 命令,此命令将自动运行 npm run build.servernpm run build.client

npm run build

在此处阅读完整指南

部署到 Cloudflare Pages

使用 npm run qwik add cloudflare-pages 安装集成后,项目就可以部署到 Cloudflare Pages 了。

如果您的环境中的 nodejs 版本与 Cloudflare Pages(v16.20.2)不同,则需要添加一个 NODE_VERSION 环境变量并将值设置为从您环境中运行 node -v 命令获得的版本

node -v
v20.11.1

要在 Cloudflare 中执行此操作,请转到 **Workers & Pages > YOUR_PROJECT > Settings > Environment variables > Production (and Preview) > Add variables > Save **

有关如何部署网站的更多信息,请参阅 Cloudflare Pages 文档

请注意,您需要一个 Cloudflare 帐户 才能完成此步骤。

高级

Cloudflare Pages 入口中间件

添加 cloudflare-pages 适配器后,将在 src/entry.cloudflare-pages.tsx 中创建一个新的入口文件。以下是在入口文件中使用内置中间件的示例。

src/entry.cloudflare-pages.tsx
import {
  createQwikCity,
  type PlatformCloudflarePages,
} from '@builder.io/qwik-city/middleware/cloudflare-pages';
import qwikCityPlan from '@qwik-city-plan';
import { manifest } from '@qwik-client-manifest';
import render from './entry.ssr';
 
const fetch = createQwikCity({ render, qwikCityPlan, manifest });
 
export { fetch };

编译后的中间件将在 server/ 目录中构建。此目录还包含一个 _worker.js 文件,该文件根据 Cloudflare Pages 高级模式 实现应用程序的请求处理。该文件只是重新导出了生成的 fetch 处理程序,如下所示。

/dist/_worker.js
import { fetch } from "../server/entry.cloudflare-pages";
export default { fetch };

Cloudflare Pages 函数调用路由

Cloudflare Page 的 function-invocation-routes 配置 可用于包含或排除要由工作程序函数使用的特定路径。拥有 _routes.json 文件可以让开发者更细致地控制何时调用您的函数。

这对于确定页面响应应该是服务器端渲染 (SSR) 还是应该使用静态站点生成的 (SSG) index.html 文件很有用。

默认情况下,Cloudflare Pages 适配器包含 public/_routes.json 配置,而是由 Cloudflare 适配器从构建中自动生成。自动生成的 dist/_routes.json 的示例如下

{
  "include": ["/*"],
  "exclude": [
    "/_headers",
    "/_redirects",
    "/build/*",
    "/favicon.ico",
    "/manifest.json",
    "/service-worker.js",
    "/about"
  ],
  "version": 1
}

在上面的示例中,它表示所有页面都应该进行 SSR。但是,根静态文件(如 /favicon.ico/build/* 中的任何静态资产)应该从函数中排除,而应该作为静态文件处理。

在大多数情况下,生成的 dist/_routes.json 文件是理想的。但是,如果您需要更细致地控制每个路径,则可以提供自己的 public/_routes.json 文件。当项目提供自己的 public/_routes.json 文件时,Cloudflare 适配器将不会自动生成路由配置,而是使用 public 目录中提交的配置。

上下文

您可以在端点方法的 platform 参数中访问 Cloudflare Page 的环境变量

export const onRequest = async ({ platform }) => {
  const secret = platform.env['SUPER_SECRET_TOKEN'];
};

此外,您可以导入 RequestHandlerPlatformCloudflarePages 类型,以便在编辑器中获得类型补全。

import { type RequestHandler } from '@builder.io/qwik-city';
import { type PlatformCloudflarePages } from '@builder.io/qwik-city/middleware/cloudflare-pages';
 
export const onGet: RequestHandler<PlatformCloudflarePages> = ({ platform }) => {
  //...
};

贡献者

感谢所有帮助改进这份文档的贡献者!

  • adamdbradley
  • manucorporat
  • OzzieOrca
  • himorishige
  • reemardelarosa
  • mhevery
  • igorbabko
  • mrhoodz
  • dario-piotrowicz
  • matthewlal