1. 从“cloudflare-os”这个标题说起:它到底是什么
第一次看到“cloudflare-os”这个词,很多人会误以为 Cloudflare 出了一款操作系统。其实不是。它更像是一个概念性的项目代号,指的是把 Cloudflare 的边缘计算能力(Workers、Pages、KV、D1、R2、Durable Objects 等)当作一套“操作系统”来用,在上面搭建完整的应用后端、AI 服务、API 网关甚至轻量级 SaaS 产品。换句话说,它不是一个装在硬盘上的 OS,而是一套跑在 Cloudflare 全球边缘网络上的开发范式。
我最早接触这个思路,是因为一个很现实的问题:传统后端部署要买服务器、配 Nginx、搞数据库、做负载均衡,运维成本高得离谱。而 Cloudflare Workers 提供了一种“函数即服务”的模型,代码上传后自动分布到全球几百个节点,冷启动几乎为零,按请求计费,免费额度对个人项目来说绰绰有余。当我把几个小项目陆续迁移上去之后,突然意识到——这不就是在用 Cloudflare 当操作系统吗?路由是它的网络栈,KV 是它的文件系统,Durable Objects 是它的进程管理,Cron Triggers 是它的定时任务。于是“cloudflare-os”这个概念在我脑子里就成型了。
这篇文章适合谁看?如果你是一个独立开发者、全栈工程师、或者对边缘计算和 AI 应用感兴趣的技术人,想用最低的成本和运维负担把想法快速上线,那这套东西非常值得研究。如果你只是听说过 Workers 但没实际用过,或者用过但只停留在“写个 Hello World”的阶段,那这篇文章会帮你把认知从“边缘函数”拉升到“边缘平台”的层面。我会从整体设计思路讲起,然后拆解核心技术点,再给出可复现的实操流程,最后分享我踩过的坑和排查技巧。全程用 pnpm 和 wrangler 这套工具链,因为这是目前最顺手的组合。
需要提前说明的是,本文涉及的所有操作都基于公开的开发者工具和文档,不涉及任何特殊网络配置。你只需要一个正常的开发环境和 Cloudflare 账号即可。
2. 整体设计与思路拆解:为什么把 Cloudflare 当操作系统用
2.1 传统后端架构的痛点与边缘计算的切入点
先说说为什么我会想到这个方向。传统的 Web 应用架构通常是这样的:一台云服务器跑 Node.js 或 Python,前面挂 Nginx 做反向代理,后面连 MySQL 或 PostgreSQL,静态资源放 CDN 或者对象存储。这套架构成熟、生态好,但问题也很明显。第一,服务器有固定成本,哪怕没人访问也要付费;第二,运维复杂,系统更新、安全补丁、日志监控都得自己搞;第三,全球用户访问时延迟不均匀,除非你在多个区域部署,否则总有人觉得慢。
边缘计算的思路完全不同。Cloudflare 在全球有超过 300 个数据中心,Workers 代码会被自动部署到离用户最近的节点执行。这意味着一个在东京的用户访问你的 API,请求不会绕到美国再回来,而是在东京本地就处理完了。延迟从几百毫秒降到几十毫秒甚至个位数。而且计费是按请求数算的,没有请求就不花钱。对于个人项目和小型产品来说,这种模型的经济性碾压传统服务器。
但光有 Workers 还不够。一个完整的应用需要存储、需要定时任务、需要队列、需要数据库。Cloudflare 这几年陆续补齐了这些能力:KV 做键值存储,D1 做 SQLite 数据库,R2 做对象存储,Durable Objects 做有状态协调,Queues 做消息队列,Cron Triggers 做定时任务。当这些组件凑齐之后,“cloudflare-os”这个概念就自然浮现了——你不再是在写一个函数,而是在一个分布式操作系统上构建应用。
2.2 核心组件选型与职责划分
我把这套“操作系统”的组件按职责做了一个划分,方便理解它们各自扮演什么角色。
| 组件 | 类比角色 | 实际职责 | 适用场景 |
|---|---|---|---|
| Workers | CPU/进程 | 执行 JavaScript/TypeScript 代码 | API 路由、业务逻辑、AI 推理调用 |
| KV | 文件系统 | 全球分布式键值存储 | 配置读取、会话缓存、静态数据 |
| D1 | 数据库 | SQLite 关系型数据库 | 结构化数据、用户表、订单表 |
| R2 | 磁盘 | 对象存储,兼容 S3 API | 图片、视频、备份文件 |
| Durable Objects | 进程管理 | 有状态单实例协调 | 聊天室、协作编辑、计数器 |
| Queues | 消息总线 | 异步任务队列 | 邮件发送、数据处理、削峰填谷 |
| Cron Triggers | 定时器 | 定时执行 Workers | 数据同步、报表生成、清理任务 |
| AI Gateway | 协处理器 | AI 模型调用网关 | 大模型推理、缓存、限流 |
这个划分不是绝对的,但能帮你快速判断某个需求该用哪个组件。比如你要做一个用户系统,用户数据放 D1,会话 token 放 KV,头像图片放 R2,登录接口用 Workers 写。如果你要做实时聊天,那 Durable Objects 就是核心,因为它能保证同一个聊天室的消息按顺序处理。
选型的时候有一个原则:能用无状态就不用有状态,能用最终一致就不用强一致。KV 是最终一致的,写入后全球同步需要几十秒,但它便宜且快;D1 是强一致的,但写入有延迟且并发有限;Durable Objects 是强一致且单实例的,但成本最高。所以我的做法是,核心交易数据放 D1,缓存和配置放 KV,只有真正需要实时协调的场景才上 Durable Objects。
2.3 为什么选择 pnpm 和 wrangler 这套工具链
工具链方面,我试过 npm、yarn 和 pnpm,最后锁定 pnpm。原因有三个。第一,pnpm 的硬链接机制让 node_modules 体积小很多,安装速度快,这在 CI/CD 环境里很关键。第二,pnpm 的依赖隔离更严格,不会出现“幽灵依赖”问题,项目迁移时不容易翻车。第三,wrangler 对 pnpm 的支持很好,官方文档里很多示例都用 pnpm。
wrangler 是 Cloudflare 官方的 CLI 工具,负责本地开发、预览、部署、密钥管理。它的工作流很清晰:wrangler dev启动本地开发服务器,wrangler deploy发布到全球网络,wrangler secret put管理环境变量。配合wrangler.toml配置文件,你可以把整个“操作系统”的资源配置声明式地管理起来。
这里要提醒一句,pnpm 在不同系统上的安装方式不一样。Windows 上如果用 npm 全局安装 pnpm,有时候会遇到“pnpm 不是内部或外部命令”的问题,这是因为 npm 全局 bin 目录没加到 PATH 里。Ubuntu 上可以用 corepack 或者独立脚本安装。如果你在公司内网环境,可能还需要配置镜像源或者离线安装包。这些细节我在后面的实操章节会展开讲。
3. 核心细节解析与实操要点:从零搭建你的边缘应用
3.1 环境准备:pnpm 安装与常见报错处理
在开始写代码之前,先把环境搞干净。我推荐用 Node.js 18 或 20 的 LTS 版本,太老的版本可能不支持某些新 API。安装 pnpm 最省事的方式是用 corepack,它是 Node.js 自带的包管理器管理工具。
corepack enable corepack prepare pnpm@latest --activate如果你用的是 Windows 并且上面这条命令报错,可以改用 npm 全局安装:
npm install -g pnpm装完之后运行pnpm -v验证。如果提示“pnpm 不是内部或外部命令”,说明 npm 的全局 bin 目录不在系统 PATH 里。你可以用npm config get prefix找到那个目录,然后手动加到环境变量里。Windows 上通常是C:\Users\你的用户名\AppData\Roaming\npm,macOS 和 Linux 上通常是/usr/local/bin或~/.npm-global/bin。
Ubuntu 用户如果遇到权限问题,不要用 sudo 装 pnpm,那样会把文件权限搞乱。正确做法是配置一个用户级的 npm prefix:
npm config set prefix ~/.npm-global export PATH=~/.npm-global/bin:$PATH npm install -g pnpm把第二行加到~/.bashrc或~/.zshrc里,以后就不会再遇到命令找不到的问题了。如果你在内网环境,pnpm 下载失败,可以设置镜像源:
pnpm config set registry https://registry.npmmirror.com或者用离线安装包,pnpm 官方提供了独立二进制文件,下载后放到 PATH 目录里就行。
注意:不要混用 npm 和 pnpm 安装同一个项目的依赖,否则 lock 文件会冲突。一个项目只用一种包管理器,这是铁律。
3.2 项目初始化与 wrangler 配置详解
环境好了之后,创建一个新项目。我习惯用 wrangler 的模板来初始化:
pnpm create cloudflare@latest my-edge-app这个命令会引导你选择模板类型。对于“cloudflare-os”这种场景,我建议选 “Hello World example” 然后手动改,或者选 “API starter” 如果你要写后端。初始化完成后,进入项目目录,你会看到一个wrangler.toml文件,这是整个项目的核心配置。
一个典型的wrangler.toml长这样:
name = "my-edge-app" main = "src/index.ts" compatibility_date = "2024-01-01" [[kv_namespaces]] binding = "MY_KV" id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" [[d1_databases]] binding = "MY_DB" database_name = "my-database" database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" [[r2_buckets]] binding = "MY_BUCKET" bucket_name = "my-bucket" [triggers] crons = ["0 * * * *"]这里有几个关键点。compatibility_date决定了 Workers 运行时用哪个版本的 API,建议设成你开始项目的那天,以后不要随便改,否则可能出现兼容性问题。binding是代码里访问这些资源的变量名,比如你在代码里写env.MY_KV.get('key')就能读到 KV 里的数据。crons是定时触发表达式,0 * * * *表示每小时执行一次。
创建 KV、D1、R2 这些资源需要用 wrangler 命令:
pnpm wrangler kv:namespace create MY_KV pnpm wrangler d1 create my-database pnpm wrangler r2 bucket create my-bucket执行后会返回对应的 ID,把它们填到wrangler.toml里。D1 还需要初始化表结构,你可以写一个schema.sql然后执行:
pnpm wrangler d1 execute my-database --file=./schema.sql提示:本地开发时,wrangler 会模拟这些资源,数据存在
.wrangler/state目录里。部署到线上后才会用真实资源。所以本地测试通过不代表线上没问题,部署后一定要再验证一遍。
3.3 Workers 代码结构与路由设计
Workers 的入口文件通常是一个fetch函数,接收Request返回Response。但实际项目里我不会把所有逻辑堆在一个文件里,而是按功能拆分模块。一个典型的目录结构是这样的:
src/ index.ts # 入口,路由分发 routes/ users.ts # 用户相关接口 posts.ts # 内容相关接口 ai.ts # AI 调用接口 lib/ db.ts # 数据库操作封装 kv.ts # KV 操作封装 auth.ts # 鉴权逻辑 types/ env.ts # 环境变量类型定义入口文件负责解析 URL 和 method,然后分发给对应的处理函数。我常用一个简单的路由表:
import { handleUsers } from './routes/users'; import { handleAI } from './routes/ai'; export default { async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> { const url = new URL(request.url); const path = url.pathname; if (path.startsWith('/api/users')) { return handleUsers(request, env); } if (path.startsWith('/api/ai')) { return handleAI(request, env); } return new Response('Not Found', { status: 404 }); } };这种写法简单直接,适合中小型项目。如果你要更复杂的路由,可以引入itty-router这样的轻量库,它只有几 KB,对冷启动影响很小。
Env类型定义很重要,它让 TypeScript 知道env里有哪些绑定:
export interface Env { MY_KV: KVNamespace; MY_DB: D1Database; MY_BUCKET: R2Bucket; AI_API_KEY: string; }这样写代码时就有自动补全,不会把MY_KV拼错成MY_KV2。
3.4 AI 能力的接入方式与多模型协作思路
“cloudflare-os”这个概念里,AI 是很重要的一块。Cloudflare 提供了 AI Gateway 和 Workers AI,前者是调用外部大模型的网关,后者是直接跑在边缘上的推理服务。我两种都用过,各有适用场景。
Workers AI 的好处是延迟低、无需管理 API Key、按推理量计费。它支持 Llama、Mistral 等开源模型,适合做文本分类、摘要、翻译这类任务。调用方式很简单:
const response = await env.AI.run('@cf/meta/llama-3-8b-instruct', { messages: [{ role: 'user', content: '用一句话解释边缘计算' }] });AI Gateway 则适合需要调用外部大模型的场景,比如你需要 GPT-4 或 Claude 的能力。它的价值在于缓存、限流、日志和成本追踪。你可以在 Gateway 里配置多个模型提供商,然后代码里统一调用:
const response = await fetch('https://gateway.ai.cloudflare.com/v1/your-account/your-gateway/openai/chat/completions', { method: 'POST', headers: { 'Authorization': `Bearer ${env.AI_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'gpt-4', messages: [{ role: 'user', content: '你好' }] }) });多 AI 协作的思路是,把不同模型当成不同的“专家”,根据任务类型路由到合适的模型。比如简单分类用 Workers AI 的轻量模型,复杂推理用外部大模型,代码生成用专门的代码模型。AI Gateway 可以帮你统一管理这些调用,还能做 fallback——主模型挂了自动切备用模型。
注意:AI 相关的 API Key 一定要用
wrangler secret put存成加密变量,不要硬编码在代码里,也不要提交到 Git 仓库。
4. 实操过程与核心环节实现:一个完整的边缘应用案例
4.1 需求定义与技术方案确定
为了把上面的理论落地,我设计一个具体的案例:一个“AI 辅助的读书笔记”应用。功能包括:用户注册登录、创建笔记、调用 AI 生成摘要、按标签检索、定时同步到 R2 备份。这个案例覆盖了 Workers、KV、D1、R2、Cron Triggers 和 AI 调用,能比较完整地展示“cloudflare-os”的用法。
技术方案是这样的:用户认证用 JWT,token 存 KV 并设过期时间;笔记数据存 D1,因为需要按标签查询和全文检索;AI 摘要调用 Workers AI,因为延迟低且免费额度够用;每天凌晨把 D1 数据导出成 JSON 存到 R2 做备份;前端用 Pages 部署静态页面,通过 API 和 Workers 通信。
这个方案的成本估算:Workers 免费额度每天 10 万请求,KV 免费 10 万读/天,D1 免费 500 万行读/天,R2 免费 10 GB 存储。对于个人使用和小规模内测,基本不花钱。即使超出,费用也很低,Workers 超出后每百万请求 0.5 美元。
4.2 数据库设计与 D1 建表实操
先设计 D1 的表结构。我建三张表:users、notes、tags。
CREATE TABLE users ( id TEXT PRIMARY KEY, email TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, created_at INTEGER DEFAULT (unixepoch()) ); CREATE TABLE notes ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL, title TEXT NOT NULL, content TEXT NOT NULL, summary TEXT, created_at INTEGER DEFAULT (unixepoch()), updated_at INTEGER DEFAULT (unixepoch()), FOREIGN KEY (user_id) REFERENCES users(id) ); CREATE TABLE tags ( id TEXT PRIMARY KEY, note_id TEXT NOT NULL, name TEXT NOT NULL, FOREIGN KEY (note_id) REFERENCES notes(id) ); CREATE INDEX idx_notes_user ON notes(user_id); CREATE INDEX idx_tags_note ON tags(note_id); CREATE INDEX idx_tags_name ON tags(name);把这段 SQL 存成schema.sql,然后执行:
pnpm wrangler d1 execute reading-notes-db --file=./schema.sql本地开发时加--local参数,数据存在本地。线上执行去掉--local。
提示:D1 目前对并发写入有限制,不适合高频写入场景。如果你的应用写入量很大,考虑用 Queues 做缓冲,或者把写入分散到不同的 D1 实例。
4.3 用户认证与 KV 会话管理实现
用户注册时,密码用 Web Crypto API 做哈希。Workers 运行时不支持 Node.js 的bcrypt,但可以用crypto.subtle做 PBKDF2 或者直接调SHA-256加盐。我一般用 PBKDF2,安全性够用。
async function hashPassword(password: string, salt: string): Promise<string> { const encoder = new TextEncoder(); const keyMaterial = await crypto.subtle.importKey( 'raw', encoder.encode(password), 'PBKDF2', false, ['deriveBits'] ); const bits = await crypto.subtle.deriveBits( { name: 'PBKDF2', salt: encoder.encode(salt), iterations: 100000, hash: 'SHA-256' }, keyMaterial, 256 ); return btoa(String.fromCharCode(...new Uint8Array(bits))); }登录成功后生成一个随机 token,存到 KV 里,过期时间设 7 天:
const token = crypto.randomUUID(); await env.MY_KV.put(`session:${token}`, userId, { expirationTtl: 604800 });后续请求带上这个 token,在 Workers 里查 KV 验证身份。KV 的读取很快,全球节点都有缓存,比查数据库快得多。
注意:KV 是最终一致的,刚写入的 token 在某些节点可能读不到。如果你需要强一致,用 Durable Objects 或者把 token 也写一份到 D1。不过对于大多数场景,几秒的同步延迟可以接受。
4.4 AI 摘要生成与异步任务处理
创建笔记后,异步调用 AI 生成摘要。这里用ctx.waitUntil让 AI 调用在响应返回后继续执行,不阻塞用户请求:
export default { async fetch(request: Request, env: Env, ctx: ExecutionContext) { // ... 创建笔记逻辑 ctx.waitUntil(generateSummary(noteId, content, env)); return new Response(JSON.stringify({ id: noteId }), { status: 201 }); } }; async function generateSummary(noteId: string, content: string, env: Env) { const response = await env.AI.run('@cf/meta/llama-3-8b-instruct', { messages: [ { role: 'system', content: '你是一个摘要助手,用一句话总结用户笔记的核心内容。' }, { role: 'user', content: content.slice(0, 2000) } ] }); await env.MY_DB.prepare('UPDATE notes SET summary = ? WHERE id = ?') .bind(response.response, noteId).run(); }ctx.waitUntil是 Workers 的一个很实用的特性,它让异步任务在响应发送后继续运行,最长可以跑 30 秒。对于 AI 推理这种耗时操作,比同步等待体验好很多。
如果 AI 调用失败,可以加重试逻辑,或者把失败的任务丢到 Queues 里稍后重试。Queues 的用法也很简单,在wrangler.toml里配置队列绑定,然后env.MY_QUEUE.send(message)就行。
4.5 定时备份与 R2 存储集成
最后加一个 Cron Trigger,每天凌晨 3 点把 D1 数据导出到 R2。在wrangler.toml里配置:
[triggers] crons = ["0 3 * * *"]然后在 Workers 里处理scheduled事件:
export default { async scheduled(event: ScheduledEvent, env: Env, ctx: ExecutionContext) { const notes = await env.MY_DB.prepare('SELECT * FROM notes').all(); const backup = JSON.stringify({ exportedAt: new Date().toISOString(), count: notes.results.length, data: notes.results }); const key = `backups/notes-${new Date().toISOString().split('T')[0]}.json`; await env.MY_BUCKET.put(key, backup); } };R2 的写入不收费,存储费用是每 GB 每月 0.015 美元,读取免费。对于备份场景非常划算。而且 R2 兼容 S3 API,以后要迁移到其他存储也很方便。
提示:Cron Trigger 的时间是 UTC,不是本地时间。如果你要按北京时间凌晨 3 点执行,得设成
0 19 * * *(UTC 19 点等于北京时间次日 3 点)。
5. 常见问题与排查技巧实录
5.1 pnpm 与 wrangler 的典型报错速查
在实际操作中,pnpm 和 wrangler 的报错是最常见的拦路虎。我整理了一个速查表,覆盖大部分场景。
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
| pnpm 不是内部或外部命令 | npm 全局 bin 不在 PATH | 把npm config get prefix的路径加到 PATH |
| pnpm 下载失败 | 网络或镜像源问题 | 设置pnpm config set registry为可用镜像 |
| wrangler 登录失败 | 浏览器授权超时 | 改用wrangler login --browser=false手动复制链接 |
| deploy 报错 10000 | 资源 ID 配置错误 | 检查 wrangler.toml 里的 id 是否和创建时一致 |
| D1 查询超时 | 查询太复杂或数据量大 | 加索引,或者分页查询 |
| KV 读不到刚写的数据 | 最终一致性延迟 | 等待几秒,或改用 D1 存储关键数据 |
| Workers AI 返回 429 | 免费额度用完 | 等次日重置,或升级付费计划 |
| R2 上传失败 | 文件太大或类型不对 | 检查文件大小限制,R2 单文件最大 5TB |
这些报错我基本都遇到过,最坑的是 wrangler 登录失败。有时候浏览器授权页面打不开,或者授权后 CLI 没反应。这时候用wrangler login --browser=false,它会输出一个链接,你手动在浏览器打开授权,然后把 token 粘贴回终端就行。
5.2 本地开发与线上环境差异的坑
本地开发时 wrangler 会模拟 KV、D1、R2,但模拟和真实环境有差异。我踩过最大的坑是 D1 的本地模拟不支持某些 SQL 函数,比如unixepoch()在本地返回的结果和线上不一样。还有 KV 的本地模拟没有过期时间,你设了expirationTtl本地也不会过期。
所以我的建议是:本地开发用模拟资源快速迭代,但每次部署前一定要在线上环境做一次完整测试。可以建一个 staging 环境,用wrangler deploy --env staging部署到独立的资源上,验证没问题再上生产。
另一个坑是环境变量。本地开发时.dev.vars文件里的变量不会自动同步到线上,线上要用wrangler secret put单独设置。而且wrangler.toml里的[vars]是明文存储的,只适合放非敏感配置,API Key 这类一定要用 secret。
5.3 性能优化与成本控制的实战经验
性能方面,Workers 的冷启动已经很快了,但代码体积还是会影响。我建议把依赖控制在 1 MB 以内,用 esbuild 或 wrangler 自带的打包功能做 tree-shaking。避免引入 lodash 这种大而全的库,用 lodash-es 按需导入,或者自己写几个工具函数。
KV 的读取虽然快,但频繁读同一个 key 也会产生费用。我的做法是在 Workers 内存里做一层缓存,同一个请求生命周期内不重复读 KV。Durable Objects 也可以做跨请求的缓存,但成本更高,适合高频读写的场景。
成本控制的核心是理解计费模型。Workers 按请求数计费,KV 按读写次数计费,D1 按行读写计费,R2 按存储和操作计费。我每个月会看一下 Cloudflare 的用量面板,如果某个资源用量异常,就针对性优化。比如发现 KV 读次数太高,就加缓存;D1 写次数太高,就合并写入或者用 Queues 缓冲。
提示:Cloudflare 的免费额度是按天重置的,不是按月。所以如果你某天用量突然飙升,第二天就恢复了。但频繁超限可能触发限流,影响服务可用性。
5.4 安全加固与密钥管理要点
安全这块,我总结了几条必须做的事。第一,所有 API Key 和密钥用wrangler secret put存储,不要写在代码或配置文件里。第二,用户密码必须哈希加盐,不要明文存储。第三,API 接口要做速率限制,可以用 KV 记录请求次数,或者用 Cloudflare 的 Rate Limiting 规则。第四,CORS 要配置好,只允许你的域名访问。第五,输入要做校验和转义,防止注入攻击。
D1 的查询要用参数化绑定,不要拼接 SQL 字符串:
// 正确 await env.MY_DB.prepare('SELECT * FROM users WHERE email = ?').bind(email).first(); // 错误,有注入风险 await env.MY_DB.prepare(`SELECT * FROM users WHERE email = '${email}'`).first();Workers 运行在 V8 隔离环境中,不同租户之间是隔离的,这比容器安全一些。但代码层面的安全还是得自己保证。我习惯在部署前用wrangler deploy --dry-run检查一下打包结果,看看有没有意外引入敏感信息。
6. 这套“边缘操作系统”还能怎么扩展
把上面这套东西跑通之后,你会发现它的扩展性很强。比如你可以加一个 Pages 前端,用同一个域名下的/api路径访问 Workers,这样前后端就整合在一起了。Pages 支持自定义域名和自动 HTTPS,部署也简单,git push就自动构建。
还可以接入 Cloudflare Access 做零信任认证,给内部工具加一层身份验证。或者用 Durable Objects 做一个实时协作的笔记编辑器,多个用户同时编辑同一篇笔记,消息通过 WebSocket 实时同步。Durable Objects 的 WebSocket 支持是原生的,比传统方案省很多事。
AI 这块也可以继续深挖。比如用 Vectorize 做向量数据库,把笔记内容向量化后支持语义搜索。用户输入一个问题,系统找到最相关的笔记片段,再让大模型生成回答。这就是一个完整的 RAG 应用,全部跑在边缘上,延迟低、成本低。
我个人的体会是,“cloudflare-os”这个思路最大的价值在于它把基础设施的复杂度降到了最低。你不需要懂 Kubernetes,不需要配负载均衡,不需要管服务器安全补丁。你只需要写业务逻辑,剩下的交给平台。对于独立开发者和中小团队来说,这是一种很务实的架构选择。当然,它也有局限,比如不适合需要长时间运行的任务,不适合需要特定系统依赖的场景。但大多数 Web 应用和 AI 应用,它都能胜任。
最后分享一个小技巧:如果你在本地开发时想模拟线上环境,可以用wrangler dev --remote,它会把代码部署到 Cloudflare 的预览环境,用真实的 KV、D1、R2 资源。这样测试结果和线上几乎一致,能提前发现很多本地模拟发现不了的问题。不过这个模式会消耗真实资源配额,调试完记得切回本地模式。