cloudflare workerを始める
cloudflare workerずっと気になってたのでhelloworldとそのテストを触ってみたメモ
事前にアカウントは作っておいたのでプロジェクト作る所から。
プロジェクトを作る
pnpm create cloudflare@latest
これを実行するとcliでログインしていなければブラウザが起動して、cloudflareにログインする
コード
hello worldのテンプレートを選択して、生成されたsrc/index.ts
を確認すると以下のコードが生成されていた
export interface Env { } export default { async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> { return new Response('Hello World!'); }, };
Response
をnewしてreturnするとレスポンスを返せるのがわかる
メモ
トリガー
実行方法としては他にも
- Alarm
- Queue
- Scheduled(cron的な)
- 3つまでの制限あり
- Tail
- リアルタイムでログを処理しロギングサービスや分析サービスに送信するために使うらしい
などトリガーにすることもできる*1
Node.js Compatibility
Cloudflare workerは完全にnodejsのAPIをサポートしてるわけではない
ただNode.js compatibilityというのがありwrangler.toml
にcompatibility_flags = [ "nodejs_compat" ]
と書いてフラグをオンにするとnode:buffer
など一部のAPIが使えるようになるらしい
環境変数
基本的にはwrangler.toml
の[vars]
部分に記述するらしいが、gitignoreの対象ではないので内容によっては書くのに抵抗がある
そういう時はローカルで動かす時は.dev.vars
というファイルを作り、その中に.env
のように記述するとwrangler dev
した時に引数のenv
に入る。
debug
デバッグはwrangler dev
で行う事ができる。実行するとローカルサーバーが起動する。
なのでdevを実行してるターミナルと、httpie*2を使ってリクエストを送るターミナルの2つを開いてやってみる。
# terminal A pnpm run dev # 裏でwrangler devを実行している # terminal B http localhost:8787 HTTP/1.1 200 OK Content-Length: 12 Content-Type: text/plain;charset=UTF-8 Hello World!
テスト
テストにはwrangler
パッケージから出てるunstable_dev
を使う
hello worldのテンプレートにはテストツールが入っていないのでvitestを入れた*3
公式のサンプルで示されてるのはjsなのでtsとして書いた
import {unstable_dev, type UnstableDevWorker} from 'wrangler' import {describe, beforeAll, afterAll, it, expect} from 'vitest' describe("Worker", () => { let worker: UnstableDevWorker beforeAll(async () => { worker = await unstable_dev('src/index.ts', { experimental: { disableExperimentalWarning: true } }) }) afterAll(async () => { await worker.stop() }) it('should return Hello World', async () => { const resp = await worker.fetch() if(resp) { const text = await resp.text() expect(text).toMatchInlineSnapshot(`"Hello World!"`) } }) })
今回は文字列を返すシンプルなものだが、KVなどを使い始めるとminiflareを使えばテストできるのか今後確認したい
その他
quickstartsとしてHonoを使っているテンプレートやGraphQL Yogaのテンプレートのようなものまであるようなのでgenerate
してみて中を見るのも良さそう。
ただwarngler generate
を実行すると
[WARNING] The
generate
command is no longer supported and will be removed in a future version.
と表示されるのでそのうち動かなくなりそう
またasync fetch
以外にもasync cron
のように書くと定期実行できるみたいなのでそっちもそのうち試してみる
*1:cloudflareのコンソール上にそれぞれTriggersとして定義されている
*3:ts-nodeとか使うとnodeのテストランナーでもできるとは思うTest runner | Node.js v21.2.0 Documentation