Cloudflare Workers
Cloudflare Workers 是 Cloudflare CDN 上的 JavaScript 边缘运行时。
你可以本地开发应用程序,并使用 Wrangler 通过几个命令发布它。 Wrangler 包含了转译编译器,所以我们可以使用 TypeScript 编写代码。
让我们用 Hono 创建你的第一个 Cloudflare Workers 应用程序。
1. 设置
Cloudflare Workers 的启动器已经可用。 使用 "create-hono" 命令启动你的项目。 在这个例子中选择 cloudflare-workers
模板。
npm create hono@latest my-app
yarn create hono my-app
pnpm create hono my-app
bun create hono@latest my-app
deno init --npm hono my-app
移动到 my-app
并安装依赖。
cd my-app
npm i
cd my-app
yarn
cd my-app
pnpm i
cd my-app
bun 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. 运行
在本地运行开发服务器。然后在你的 web 浏览器中访问 http://localhost:8787
。
npm run dev
yarn dev
pnpm dev
bun run dev
更改端口号
如果你需要更改端口号,你可以按照这里的说明更新 wrangler.toml
/ wrangler.json
/ wrangler.jsonc
文件: Wrangler 配置
或者,你可以按照这里的说明设置 CLI 选项: Wrangler CLI
4. 部署
如果你有一个 Cloudflare 账户,你可以部署到 Cloudflare。在 package.json
中,$npm_execpath
需要更改为你选择的包管理器。
npm run deploy
yarn deploy
pnpm run deploy
bun run deploy
就这样!
Service Worker 模式 或 Module Worker 模式
编写 Cloudflare Workers 有两种语法。 Module Worker 模式 和 Service Worker 模式。使用 Hono,你可以用两种语法编写,但我们建议使用 Module Worker 模式,以便绑定变量是局部作用域的。
// Module Worker 模式
export default app
// Service Worker 模式
app.fire()
将 Hono 与其他事件处理程序一起使用
你可以在 Module Worker 模式 中将 Hono 与其他事件处理程序(例如 scheduled
)集成。
要做到这一点,导出 app.fetch
作为模块的 fetch
处理程序,然后根据需要实现其他处理程序:
const app = new Hono()
export default {
fetch: app.fetch,
scheduled: async (batch, env) => {},
}
提供静态文件
如果你想提供静态文件,你可以使用 Cloudflare Workers 的 静态资源功能。在 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 i --save-dev @cloudflare/workers-types
yarn add -D @cloudflare/workers-types
pnpm add -D @cloudflare/workers-types
bun add --dev @cloudflare/workers-types
测试
对于测试,我们建议使用 @cloudflare/vitest-pool-workers
。 请参考 示例 来进行设置。
如果有如下应用程序。
import { Hono } from 'hono'
const app = new Hono()
app.get('/', (c) => c.text('Please test me!'))
我们可以用以下代码测试它是否返回 "200 OK" 响应。
describe('测试应用程序', () => { // Test the application
it('应该返回 200 响应', async () => { // Should return 200 response
const res = await app.request('http://localhost/')
expect(res.status).toBe(200)
})
})
Bindings
在 Cloudflare Workers 中,我们可以绑定环境变量值、KV namespace、R2 bucket 或 Durable Object。你可以在 c.env
中访问它们。如果你将 bindings 的 "类型结构" 作为泛型传递给 Hono
,它将具有类型。
type Bindings = {
MY_BUCKET: R2Bucket
USERNAME: string
PASSWORD: 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!`)
})
在中间件中使用变量
这是 Module Worker 模式的唯一情况。 如果你想在中间件中使用 Variables 或 Secret Variables,例如,Basic Authentication Middleware 中的 "username" 或 "password",你需要像下面这样编写。
import { basicAuth } from 'hono/basic-auth'
type Bindings = {
USERNAME: string
PASSWORD: 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 Middleware、JWT Authentication 或其他中间件。
从 GitHub Actions 部署
在通过 CI 将代码部署到 Cloudflare 之前,你需要一个 cloudflare token。你可以从这里管理:https://dash.cloudflare.com/profile/api-tokens
如果是新创建的 token,选择 编辑 Cloudflare Workers 模板,如果你已经有另一个 token,请确保该 token 具有相应的权限(不,token 权限在 Cloudflare Pages 和 Cloudflare Workers 之间不共享)。
然后转到你的 GitHub 仓库设置仪表板:Settings->Secrets and variables->Actions->Repository secrets
,并添加一个新的 secret,名称为 CLOUDFLARE_API_TOKEN
。
然后在你的 Hono 项目根文件夹中创建 .github/workflows/deploy.yml
,粘贴以下代码:
name: Deploy
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
name: Deploy
steps:
- uses: actions/checkout@v4
- name: Deploy
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
然后编辑 wrangler.toml
,并在 compatibility_date
行之后添加此代码。
main = "src/index.ts"
minify = true
一切就绪!现在推送代码并享受它吧。
本地开发时加载 env
要为本地开发配置环境变量,请在项目的根目录中创建 .dev.vars
文件。 然后像使用普通 env 文件一样配置你的环境变量。
SECRET_KEY=value
API_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_KEY
return c.text(SECRET_KEY)
})
在将项目部署到 cloudflare 之前,请记住在 Cloudflare Workers 项目的配置中设置环境变量/secrets。
有关此部分的更多信息,你可以在 Cloudflare 文档中找到: https://developers.cloudflare.com/workers/configuration/environment-variables/#add-environment-variables-via-the-dashboard