Cloudflare Workers
Cloudflare Workers 是运行在 Cloudflare CDN 上的 JavaScript 边缘运行时(edge runtime)。
你可以在本地开发应用,然后通过 Wrangler 使用几条命令即可发布。Wrangler 内置了转译器(trans compiler),因此我们可以直接用 TypeScript 编写代码。
接下来,让我们使用 Hono 为 Cloudflare Workers 创建你的第一个应用。
1. 安装
Cloudflare Workers 有现成的 Starter 模板。用 create-hono 命令启动项目。本例中选择 cloudflare-workers 模板。
npm
npm create hono@latest my-app
yarn
yarn create hono my-app
pnpm
pnpm create hono@latest my-app
bun
bun create hono@latest my-app
deno
deno init --npm hono my-app
进入 my-app 目录并安装依赖。
npm
cd my-appnpm i
yarn
cd my-appyarn
pnpm
cd my-apppnpm i
bun
cd my-appbun i
2. Hello World
编辑 src/index.ts:
import { Hono } from 'hono'const app = new Hono()app.get('/', (c) => c.text('Hello Cloudflare Workers!'))export default app
3. 运行
本地运行开发服务器,然后在浏览器访问 http://localhost:8787。
npm
npm run dev
yarn
yarn dev
pnpm
pnpm dev
bun
bun run dev
修改端口号
如果需要更改端口号,可以编辑 wrangler.toml / wrangler.json / wrangler.jsonc 文件,参考:Wrangler Configuration
也可以通过 CLI 选项设置,参考:Wrangler CLI
4. 部署
如果你有 Cloudflare 账号,可以将应用部署到 Cloudflare。在 package.json 中,将 $npm_execpath 改成你使用的包管理器。
npm
npm run deploy
yarn
yarn deploy
pnpm
pnpm run deploy
bun
bun run deploy
就是这么简单!
Service Worker 模式 vs Module Worker 模式
Cloudflare Workers 有两种写法:Module Worker mode 和 Service Worker mode。使用 Hono 可以兼容两种写法,但推荐使用 Module Worker mode,因为绑定变量会被局部化。
// Module Workerexport default app
// Service Workerapp.fire()
与其他事件处理器一起使用
在 Module Worker mode 中,可以将 Hono 与其他事件处理器(如 scheduled)结合使用。
const app = new Hono()export default {fetch: app.fetch,scheduled: async (batch, env) => {},}
服务静态文件
如果需要提供静态文件服务,可以使用 Cloudflare Workers 的 Static Assets 功能。在 wrangler.toml 指定目录:
assets = { directory = "public" }
然后创建 public 目录并放置文件。例如,./public/static/hello.txt 将被映射为 /static/hello.txt。
.├── package.json├── public│ ├── favicon.ico│ └── static│ └── hello.txt├── src│ └── index.ts└── wrangler.toml
类型支持
如果想要 Workers 类型,需要安装 @cloudflare/workers-types。
npm
npm i --save-dev @cloudflare/workers-types
yarn
yarn add -D @cloudflare/workers-types
pnpm
pnpm add -D @cloudflare/workers-types
bun
bun add --dev @cloudflare/workers-types
测试
测试推荐使用 @cloudflare/vitest-pool-workers。可参考 examples 进行设置。
示例应用:
import { Hono } from 'hono'const app = new Hono()app.get('/', (c) => c.text('Please test me!'))
我们可以测试它是否返回 200 OK:
describe('Test the application', () => {it('Should return 200 response', async () => {const res = await app.request('http://localhost/')expect(res.status).toBe(200)})})
Bindings(绑定)
在 Cloudflare Workers 中,可以绑定环境变量、KV namespace、R2 bucket 或 Durable Object。可通过 c.env 访问它们。如果将 “type struct“ 作为泛型传给 Hono,还会自动获得类型提示。
type Bindings = {MY_BUCKET: R2BucketUSERNAME: stringPASSWORD: string}const app = new Hono<{ Bindings: Bindings }>()app.put('/upload/:key', async (c, next) => {const key = c.req.param('key')await c.env.MY_BUCKET.put(key, c.req.body)return c.text(`Put ${key} successfully!`)})
在 Middleware 中使用变量
仅适用于 Module Worker mode。如果需要在 Middleware 中使用变量或密钥变量(如 Basic Authentication 的 username 和 password),写法如下:
import { basicAuth } from 'hono/basic-auth'type Bindings = {USERNAME: stringPASSWORD: string}const app = new Hono<{ Bindings: Bindings }>()app.use('/auth/*', async (c, next) => {const auth = basicAuth({username: c.env.USERNAME,password: c.env.PASSWORD,})return auth(c, next)})
同样适用于 Bearer Authentication、JWT Authentication 等。
从 GitHub Actions 部署
通过 CI 部署到 Cloudflare 前,需要一个 Cloudflare token。可在 User API Tokens 管理。
新建 token 时选择 Edit Cloudflare Workers 模板;已有 token 时确保其具有相应权限(Cloudflare Pages 和 Workers 的 token 权限不共享)。
然后在 GitHub 仓库设置中添加 CLOUDFLARE_API_TOKEN 到:Settings -> Secrets and variables -> Actions -> Repository secrets。
接着在项目根目录创建 .github/workflows/deploy.yml:
name: Deployon:push:branches:- mainjobs:deploy:runs-on: ubuntu-latestname: Deploysteps:- uses: actions/checkout@v4- name: Deployuses: cloudflare/wrangler-action@v3with:apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
编辑 wrangler.toml,在 compatibility_date 之后添加:
main = "src/index.ts"minify = true
一切就绪!推送代码即可。
本地开发加载环境变量
本地开发时,可以在项目根目录创建 .dev.vars 文件,并像普通 .env 文件一样配置:
SECRET_KEY=valueAPI_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
更多信息可参考 Cloudflare 文档: https://developers.cloudflare.com/workers/wrangler/configuration/#secrets
然后通过 c.env.* 获取变量。
注意:在 Cloudflare Workers 中必须通过 c 获取环境变量,而不是 process.env。
type Bindings = {SECRET_KEY: string}const app = new Hono<{ Bindings: Bindings }>()app.get('/env', (c) => {const SECRET_KEY = c.env.SECRET_KEYreturn c.text(SECRET_KEY)})
在部署到 Cloudflare 之前,记得在 Cloudflare Workers 项目配置中设置环境变量/密钥。
