Workers、Pages,对照 Compute
by Randall · 24 Sep 2026·randallflare / compute
← /u/randall/blog
by Randall · 24 Sep 2026·randallflare / compute
Cloudflare 的文档里,函数和站点是两个产品。Workers 跑代码,Pages 托管静态站,再加一层 Pages Functions。2026 年他们自己的对照表改了口风:新的全栈项目优先用 Workers 加上静态资源,Pages 还在,没有强制迁移。
我们这边没有让你再选一次。控制台里 Workers 和 Pages 两个旧地址都会跳到同一个列表,名字是 Compute。一条记录可以只放 isolate,可以只放静态文件,也可以两个都有。主机名、git、环境变量、binding 跟着这条记录走,不跟着产品名走。
底下的运行时是同一份 workerd。请求从边缘节点的 agent 进来,转到本机的 isolate。所以入口的形状不用发明第二套。
JavaScript 还是原来的写法:
env 上挂着你在控制台绑的名字。常用的几样和 Cloudflare 同名:
定时任务、队列消费、入站邮件这些,Cloudflare 写在 Workers 上,Pages 的对照表里是没有的。我们同样把它们放在「有代码的那条 Compute」上。静态站如果要一个接口,就在同一条记录里加函数,不用再开一个 Workers 项目。
有些 CF 的能力这边没有,也不假装有:Hyperdrive、Browser Rendering、Workers AI、Tail Workers、按百分比灰度。那是他们平台上的另一层。这边对齐的是 workerd 里那层请求和 binding。
Pages 的日常是:仓库或压缩包推上去,边缘吐静态文件,个别路径落到 Functions。预览地址、自己的域名、环境变量,都在这个项目上。
Compute 里一旦这条记录带了静态资源,编辑器就换成站点那套:文件、构建、Functions。没有静态资源时,编辑器是 isolate 的文件树。两种编辑器看的是同一条记录。给这个主机名再挂一个接口,不用新建产品。
Cloudflare 把「Workers 加静态资源」当成 2026 年的新建议。我们列表里一开始就是这一种东西,只是编辑器按里面有没有静态文件换了一张皮。
2026 年 9 月 21 日,Cloudflare 把 Python Workers 标成正式可用。运行时是 Pyodide,CPython 编成 WebAssembly,放在 workerd 里。入口他们定成这样:
from workers import Response, WorkerEntrypoint
正式版的变化是 binding 可以直接用。预览那两年,往队列里塞一个 dict 还得自己转成 JavaScript 对象。
我们也加上了。创建 Compute 时运行时选 Python,生成的 main.py 就是这个 Default 类。self.env.MY_KV.get、self.env.DB.prepare、self.env.BUCKET.put 和上面 JavaScript 那一列是同一套方法,不是另写的一套 HTTP。
已经在跑的一个:
https://python-compute-test-randall.edge.bigrandall.io/
Pyodide 比一段 JavaScript 重。内存小的节点不接这种运行时,它们继续接静态请求和 JS。装得下的节点才拉起 Python。这是放置,不是另一种语言。
Python 加在代码这种形态上。静态站仍然是静态文件加 JavaScript Functions。Cloudflare 的 Python 同样是 Workers 的事,不是 Pages 的事。
我刷新控制台的时候,地址栏里的 /flare/workers 和 /flare/pages 都会落到 /flare/compute。列表里一个静态站和那段 Python 测试挨在一起,主机名都是 *.edge.bigrandall.io。
Cloudflare 的对照表还在解释,什么时候该留在 Pages,什么时候可以迁到 Workers。请求进 workerd 之后,两边要做的事是一样的。
export default {
async fetch(request, env) {
const v = await env.MY_KV.get("hello");
return new Response(v ?? "empty");
},
};| 你在 CF 里叫 | 在这边的调用 |
|---|
| KV | env.MY_KV.get / put / delete / list |
| D1 | env.DB.prepare(sql).bind(...).all() |
| R2 | env.BUCKET.get / put / delete / list |
| Queues | env.JOBS.send,消费函数收一批消息 |
| Cache | caches.default |
| Cron | 定时触发 |
| 入站邮件进 worker,也可以向外发 | |
| Durable Objects | 命名空间上 get(id).fetch() |
| Workflows | 类上的 run(input, step) |
| Service bindings | env.OTHER.fetch() |
| Analytics | writeDataPoint |