Dev Study
← 研修トップ

アプリケーションの土台

フレームワークが隠しているもの。書いたコードのどの行がソケットに触り、どの行が文字列を作り、import は何を結び付け、npm run build で何が起きるのか。Webサーバがただのプロセスであるところから、開発サーバと本番の違いまでを積み上げます。

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