← 研修トップ
アプリケーションの土台
フレームワークが隠しているもの。書いたコードのどの行がソケットに触り、どの行が文字列を作り、import は何を結び付け、npm run build で何が起きるのか。Webサーバがただのプロセスであるところから、開発サーバと本番の違いまでを積み上げます。
- 1約 9 分Webサーバはただのプロセス — listen するとは何かWebサーバは特別なプログラムではありません。socket・bind・listen・accept という4つのシステムコールを順に出す、普通のプロセスです。
- 2約 9 分1リクエストは1本のバイト列 — パースしてから「ルーティング」するサーバに「リクエスト」という構造体が届くことはありません。届くのはバイト列で、CRLF で区切って開始行を読み切って初めてメソッドとパスが確定します。
- 3約 9 分ハンドラ関数とレスポンス — hello world のどの行が socket に触っているかフレームワークに書く `return "hello"` は、最後には必ず接続への書き出しになります。第13週『システムコール — アプリとカーネルの境界線』で見たとおり、アプリは自分で線にバイトを流せず、書き出しはカーネルへの依頼です。
- 4約 9 分文字列を返しているだけ — テンプレートとJSXの正体テンプレートもJSXも、値を受け取ってHTML文字列を組み立てるか、描画の指示を表すオブジェクトを組み立てるかのどちらかです。返しているのはこの2つしかありません。
- 5約 9 分なぜ Content-Type と文字コードが要るのか受け取る側は、届いたバイト列から「これは何か」を読み取れません。本文に書かれていないからです。送る側がラベルを付けない限り、型の決定は受け取る側の推測に移ります。
- 6約 9 分状態を持たないHTTPとCookie/セッションHTTP は前の要求を覚えません。RFC 9110 は「stateless」を、各要求メッセージの意味が単独で理解できること、と定義します。だから「続き」を表すには、合言葉を毎回クライアントが運ぶしかありません。
- 7約 9 分JSONとAPI — ブラウザ以外の相手に返すハンドラが返すものは、相手がブラウザでも他のプログラムでも文字列です。HTMLとJSONの違いは返し先ではなく表現の違いで、どちらとして読むかを Content-Type が告げます。
- 8約 9 分モジュール — import は何をしているかimport が行っているのは、ファイルの中の名前を別のファイルにある実体に結び付ける表引きです。名前そのものに実体は入っておらず、どこを指すかを決める作業が別にあります。
- 9約 9 分ビルドとバンドル — 書いたコードと届くコードが違う理由ブラウザは TypeScript も JSX も読めません。だから配る前に**変換 → 束ねる → 縮める → 内容で決まる名前を付ける**工程が挟まり、受け取るのは書いたファイルではなくその出力です。
- 10約 9 分ランタイム — Node.js は1スレッドで「待つ」をどう扱うかJavaScript を動かすスレッドは既定で1本ですが、「待つ」仕事はそこで抱えません。ネットワークの待ちはカーネルのイベント通知機構(ポーラ。epoll / kqueue)に、ファイル I/O と名前解決は libuv のスレッドプールに預けられます。だから1本でも多数を捌けます。
- 11約 9 分開発サーバと本番 — localhost:3000 と https://example.com の間開発サーバは「1プロセス・平文・自分の機械宛て・ソースを都度変換」という最小構成です。本番はその前にTLSを終端する段や取り次ぎ役が並び、実体も複数になり、ビルド済みのコードが配られます。