当团队采用[Cloudflare Workers22时,第一次部署很简单:11,就是这样,脚本已上线。当另一个团队采用 Pages 时,第一次部署也很简单:连接 GitHub 存储库,配置构建命令,仅此而已。当两者共存于同一区域时,当您需要每个分支进行预览时,或者当有人需要在不访问仪表板的情况下审核生产中运行的内容时,就会出现问题。
Workers 如何部署
Workers 项目的核心工件是2。它包含路由、绑定、环境变量、兼容性限制和环境。典型的生产/暂存部署在同一个文件中如下所示:
0
这是代码中的版本化配置,可在拉取请求中审查,可在 Git 历史记录中追踪。任何路由或绑定更改都会经过相同的代码审查流程。
3 将脚本部署为单独的 Worker (4),具有自己的路由和绑定。 Workers 中的环境是不同的 Workers,而不是同一部署的变体。
Pages 如何部署
Pages 通过 git Push 工作。您连接一个存储库,在仪表板上定义构建命令和输出目录,每次推送到主分支都会触发一个管道:克隆、安装、构建、将资产上传到 CDN。免费计划的管道每月最多运行 500 个构建,付费计划(20 美元/月)的管道每月最多运行 5,000 个构建。
巨大的操作差异:每次推送到主分支以外的任何分支都会生成一个自动预览部署,其唯一的 URL 格式为 5´。您打开一个拉取请求,Cloudflare 使用预览 URL 对 PR 进行评论。产品团队在批准合并之前测试 URL。 Workers 没有相应的本地功能。
对称限制:页面构建设置(构建命令、环境变量、节点版本)位于仪表板上,而不是在代码文件中。迄今为止,Pages 还没有完整的6 支持。这意味着构建配置更改不会通过拉取请求,也不在 Git 历史记录中。对于需要完整基础设施审计跟踪的团队来说,这是一个真正的摩擦。
路由和路由冲突陷阱
工作人员使用链接到区域的路线模式。 7 模式捕获该路径的所有请求并将它们传递给相应的脚本。如果两个不同的 Worker 尝试在同一区域中注册相同的模式,则第二次部署会失败并出现冲突错误。
Pages 使用专用子域 (8) 或链接到项目的自定义域。当您在 Pages 中使用自定义域时,Cloudflare 会创建一个内部 Worker,为资产提供服务并将其路由到 Functions。这个内部Worker占用了域路由。
具体问题是:您在 9 中有一个 Pages 项目,并且想要添加一个单独的 Worker 来处理 10 中的 Webhooks。它不给。页面路由已经捕获11。解决方案是将 webhooks 处理程序移至 12 中的页面函数,或使用具有独立 Worker 的单独子域 (13)。
页面内的路由优先级遵循固定顺序:首先处理14,然后是15,然后是16 中的函数,最后是静态资源。这意味着 17 中的函数优先于 18 中的静态文件 — 如果您生成具有相同路径的静态页面,这可能会令人惊讶。
页面环境和缺失的内容
Pages 具有生产和预览环境的概念。生产为主;任何其他分支都会生成预览。您可以在仪表板上配置按环境分隔的环境变量。
Pages 没有什么:具有不同构建配置的多个命名环境。 Workers 允许 19 具有一组完全不同的绑定和变量。在 Pages 中,如果您想要具有不同 D1 数据库的临时环境,您可以创建一个单独的 Pages 项目并手动管理两者之间的同步。
对于使用严格的分段(单独的数据库、沙箱 API 密钥、不同的功能标志)的团队来说,这种限制非常重要,并且通常会将这些工作负载推给 Workers。
wrangler.toml 如何(部分)进入页面
Cloudflare 宣布在 2020 年对配置 Pages Functions 绑定(KV 命名空间、D1 数据库、环境变量)提供实验性支持。这解决了部分审计跟踪问题:绑定保留在代码中。但构建管道(命令、输出目录、节点版本)仍然在仪表板上。
目前的状态是部分的。如今,那些需要 100% 代码配置的人使用 Workers 以及通过 R2 + Cache API 提供的资产,从而放弃免费的 Pages CDN。这是一个真正的权衡,值得在做出决定之前进行计算。
决定之前要评估什么
Pages 部署模型提供了两个具体资产:集成的构建管道(无需组装外部 CI)和每个分支的自动预览部署。对于在合并之前审查功能的设计和产品团队来说,分支预览可显着加快审查周期。
Workers 从第一天起就提供可审核的代码配置、具有不同绑定的命名环境,并支持 Pages 不具备的非 HTTP 触发器(cron、队列、电子邮件)。对于没有可视化组件且需要严格分级的 API 或服务,采用组织良好的 21 结构的 Workers 在操作上更加干净。
对于从 Pages 开始,然后尝试添加隔离的 Worker 的团队来说,同一区域中的项目之间的路由冲突是最常见的问题。正确的思维导图:Pages 中的自定义域就像占据该域通配符的 Workers。您想要该域上的任何其他内容都需要存在于 Pages 项目中。
另请阅读
- [Cloudflare Workers 与 Pages:选择之前最重要的区别24
- [从 Pages 迁移到 Workers:何时有意义以及变革的实际成本25
- [只有工人才能做的事情,只有页面才能做的事情以及两者相遇的地方26
- [页面功能:何时使用而不是纯粹的 Workers27
- [DNS 代理与仅 DNS:有何变化以及每种模式何时有意义28
- [持久对象编程模型:与您曾经使用过的任何东西不同的地方29
