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-appyarn create hono my-apppnpm create hono my-appbunx create-hono my-appdeno run -A npm:create-hono my-appmy-app に移動し、依存関係をインストールします。
cd my-app
npm icd my-app
yarncd my-app
pnpm icd my-app
bun i2. Hello World
以下のように src/index.ts を編集します。
import { Hono } from 'hono'
const app = new Hono()
app.get('/', (c) => c.text('Hello Cloudflare Workers!'))
export default app3. 実行
ローカルで開発サーバーを実行します。次に、Web ブラウザで https://:8787 にアクセスします。
npm run devyarn devpnpm devbun run dev4. デプロイ
Cloudflare アカウントをお持ちの場合は、Cloudflare にデプロイできます。 package.json で、$npm_execpath を選択したパッケージマネージャーに変更する必要があります。
npm run deployyarn deploypnpm run deploybun run deploy以上です!
Service Worker モードまたは Module Worker モード
Cloudflare Workers を記述するための構文は 2 つあります。Module Worker モードとService Worker モードです。Hono を使用すると、両方の構文で記述できますが、バインディング変数をローカライズできるように、Module Worker モードを使用することをお勧めします。
// Module Worker
export default app// Service Worker
app.fire()Hono を他のイベントハンドラーで使用する
Hono をModule Worker モードで他のイベントハンドラー (scheduled など) と統合できます。
これを行うには、モジュールの fetch ハンドラーとして app.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型
ワーカーの型が必要な場合は、@cloudflare/workers-types をインストールする必要があります。
npm i --save-dev @cloudflare/workers-typesyarn add -D @cloudflare/workers-typespnpm add -D @cloudflare/workers-typesbun 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('Should return 200 response', async () => {
const res = await app.request('https:///')
expect(res.status).toBe(200)
})
})バインディング
Cloudflare Workers では、環境変数、KV 名前空間、R2 バケット、または Durable Object をバインドできます。 c.env でそれらにアクセスできます。 ジェネリックとしてバインディングに「型構造体」を Hono に渡すと、型が設定されます。
type Bindings = {
MY_BUCKET: R2Bucket
USERNAME: string
PASSWORD: string
}
const app = new Hono<{ Bindings: Bindings }>()
// Access to environment values
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 モードの場合のみです。 Basic 認証ミドルウェアの「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 認証ミドルウェア、JWT 認証などにも同じことが当てはまります。
Github Action からのデプロイ
CI 経由で Cloudflare にコードをデプロイする前に、cloudflare トークンが必要です。 こちらから管理できます: https://dash.cloudflare.com/profile/api-tokens
新しく作成されたトークンの場合は、**Cloudflare Workers の編集** テンプレートを選択します。別のトークンが既にある場合は、トークンに対応する権限があることを確認してください(いいえ、トークン権限は cloudflare page と cloudflare worker で共有されません)。
次に、Github リポジトリ設定ダッシュボード: Settings->Secrets and variables->Actions->Repository secrets に移動し、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すべて準備が整いました! これでコードをプッシュして楽しんでください。
ローカル開発時に環境変数をロードする
ローカル開発用の環境変数を構成するには、プロジェクトのルートディレクトリに .dev.vars ファイルを作成します。 次に、通常の env ファイルと同様に環境変数を構成します。
SECRET_KEY=value
API_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9このセクションの詳細については、Cloudflare ドキュメントを参照してください: https://developers.cloudflare.com/workers/wrangler/configuration/#secrets
次に、c.env.* を使用してコード内の環境変数を取得します。
Cloudflare Workers の場合、環境変数は process.env ではなく c を介して取得する必要があります。
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 Worker プロジェクトの構成で環境変数/シークレットを設定することを忘れないでください。
このセクションの詳細については、Cloudflare ドキュメントを参照してください: https://developers.cloudflare.com/workers/configuration/environment-variables/#add-environment-variables-via-the-dashboard
