はじめての公開第06章 ・ 読むのにかかる時間 約8分

Workerを動かす

アクセスされたら返事をする、小さなプログラム

前の章で公開したページは、置いてあるだけの紙です。誰が見ても同じことしか書いてありません。この章では、そこに「聞かれたら、その場で答えを作って返す係」を1人だけ雇います。それがWorkerです。

この章でできるようになること

  • 置いてあるページと、その場で作る答えの違いを、自分の目で見分ける
  • アクセスされると今の時刻を返す、小さなWorkerを作って公開する
  • 1つのURLの中で、静的なページとWorkerが同居していることを理解する

なぜ、置いてあるだけでは足りないのか

前の章のページに「ただいまの時刻」を出したいとします。HTMLに直接時刻を書き込んでも、それは書いた瞬間の時刻のまま止まります。1時間後に見た人には、1時間前の時刻が表示されます。

第2章で出てきた「静的」と「動的」の違いが、ここで効いてきます。時刻のように、聞かれた瞬間に決まるものは、あらかじめ紙に書いておくことができません。聞かれてから作る必要があります。

その「聞かれてから作る係」がWorkerです。

横にスクロールできます

Workerが行き先を振り分ける アクセスが来ると、まずWorkerが受け取ります。決めておいた住所ならその場で答えを作り、それ以外は置いてあるページをそのまま返します。 アクセス WORKER 住所を見て 振り分ける /api/hello だったら その場で答えを作る いまの時刻など、毎回変わるもの それ以外だったら 置いてあるページを返す 第5章で公開したHTML
Workerは受付です。全部を自分で作るのではなく、必要なときだけ作って、あとは置いてあるものを渡します。

パス(住所の後ろの部分)

https://example.com/api/hello/api/hello の部分です。同じサイトの中の「どこ」を指しているかを表します。Workerは、このパスを見て「これは自分が答える」「これは置いてあるページを渡す」を判断します。

作ってもらう

第5章のフォルダをそのまま使います。Claude Codeに開いた状態で、これを送ってください。

Claude Codeにこう頼みます

いまの静的サイトに、Workerを足してください。 ・/api/hello にアクセスされたら、いまの時刻とあいさつをJSONで返す ・それ以外のアクセスは、これまで通り public フォルダの中のページをそのまま返す ・wrangler.jsonc に main と assets の binding を追加してください 追加したあと、それぞれのファイルが何をしているのかを、プログラミングを知らない人にもわかるように日本語で説明してください。

できあがるプログラムは、驚くほど短いです。要点はこの3行だけです。

if (url.pathname === "/api/hello") {
  return new Response(...);   // ここで答えを作る
}
return env.ASSETS.fetch(request);   // それ以外は置いてあるページ

読めなくて大丈夫です。ただ、「もし〜だったら、こうする。そうでなければ、こうする」と書いてあるんだな、というのは何となく見えるはずです。プログラムはだいたいこれの積み重ねです。

JSON(ジェイソン)

コンピューター同士がデータをやりとりするときの、決まった書き方です。{"message": "こんにちは"} のように、名前と値を並べて書きます。人間が読んでもだいたい意味がわかるのが特徴で、だから広く使われています。

binding(バインディング)

Workerに「これを使っていいですよ」と持たせる権限のことです。今回は「置いてあるページ一式を使っていい」という権限を渡しています。第9章では、ここに「R2の倉庫を使っていい」という権限が増えます。この本で一番大事な言葉の1つなので、覚えておくと後が楽になります。

手元で動かして、目で見る

Claude Codeにこう頼みます

手元で動かして確認したいです。ローカルで起動して、トップページと /api/hello の両方のURLを教えてください。

2つのURLを、順番にブラウザで開いてみてください。

  • http://localhost:8787/ … これまで通りの自己紹介ページ
  • http://localhost:8787/api/hello … 時刻の入った短い文字列

ここで、必ずやってほしいことがあります。 /api/hello のほうを開いたまま、ブラウザの再読み込みを何度か押してください。時刻が毎回変わります。トップページのほうは、何度読み込んでも変わりません。

これが「静的」と「動的」の違いです。言葉で読むより、この2つを交互に読み込んだほうが、体で分かります。

公開する

Claude Codeにこう頼みます

確認できたので、この変更をCloudflareに公開してください。公開後のURLと、/api/hello を確認するためのURLの両方を教えてください。

今度はログインを聞かれません。第5章で承認済みだからです。

うまくいったか確認する

  • 公開されたURLの末尾に /api/hello を付けて開くと、時刻が表示される
  • 再読み込みするたびに、時刻が変わる
  • URLの末尾に何も付けなければ、これまで通り自己紹介ページが出る
  • スマホから /api/hello を開いても、同じように動く

いま起きたことの意味

あなたのURLは、もう「ただのページ」ではありません。頼めば答えを返してくれる窓口を持ちました。

この窓口の中身を変えれば、いろいろなことができます。フォームの送信を受け取る、外部のサービスに問い合わせる、そして——第10章でやりますが——画像のアップロードを受け取る。全部この形の延長線上にあります。

そして特筆すべきは、この処理が世界中のCloudflareのコンピューターで動いていることです。あなたは1台もサーバーを借りていません。

よくあるつまずき

/api/hello を開いたら、自己紹介ページが出てしまう
Workerが読み込まれていない可能性があります。wrangler.jsonc に main の行が入っているか、Claude Codeに確認してもらってください。
env.ASSETS is undefined
「置いてあるページを使っていい」という権限(binding)が設定されていません。assets の設定に binding が書かれているか確認してもらってください。
公開したのに、古い内容のまま見える
ブラウザが前の結果を覚えている(キャッシュしている)ことがあります。第2章で出てきたキャッシュです。ブラウザの再読み込みを強めにするか、シークレットウィンドウで開いてみてください。
日本語が文字化けする
返すときの文字の種類の指定が抜けています。「日本語が化けるので、文字コードの指定を直してください」と頼めば直ります。

この章のまとめ

Workerを1つ足して、聞かれたときだけ答えを作る窓口を用意しました。静的と動的が1つのURLに同居していて、Workerがパスを見て振り分けています。

次の章では、覚えにくいURLを自分のドメインに変えます。あわせて、ずっと気になっているはずのお金の話に、数字で答えます。

章末チェックリスト