◆ 公開フォルダの静的ファイルをサーブするミドルウェアの比較
◆ static と static-cache の違いを簡単にまとめ

https://github.com/koajs/static
https://github.com/koajs/static-cache

static

koa-send のラッパー
static 自体の中身はほとんどなくてほぼ koa-send 任せ
機能はほぼ koa-send にあるもの

シンプルで独自のサーバサイドキャッシュとかはなし

圧縮で gzip と brotli のサポート
ただし .gz や .br 拡張子のファイルが存在する場合のみ
このミドルウェアで圧縮はしてくれない
動的な圧縮が必要なら koa-compress に任せられる

隠しファイルを送らなくできる
隠しファイルはファイル名が 「.」 から始まるもの
Windows のファイル属性は見ない

index.html のサポート
他の名前にもできる

defer を使えば next の後で処理できる
true ならルーターなどの下流のミドルウェアの処理後にレスポンスがない場合にパスにマッチするファイルを返す
false なら下流ミドルウェアの処理前にパスにマッチするファイルがあるならそれを返す

Last-Modified と Cache-Control を自動で送信してくれる
オプションの setHeaders 関数でリクエストごとにカスタマイズすることもできる
ただし Last-Modified は送るだけで If-Modified-Since をチェックして 304 レスポンスにする処理はない
conditional-get を使えばできるけど最後にレスポンスを送らず 304 に置き換えるだけ
ReadStream を body に入れるところまでサーバサイドの不要な処理は全部行われる
(createReadStream の時点で実際にファイルの読み込みは始まってる)
それでも body が大きい場合に通信量が減るメリットはあるけど 小さいテキストファイルなどだとムダは多い

Etag は非対応

static-cache

koa-send は使わず送信部分まで自作

ファイルマネージャ機能を作っていて 変数上にファイル情報やファイルの中身の buffer をキャッシュしてる
メモリに乗らない場合もあるので buffer は保存しなくもできる

基本は preload で起動時にサーブ対象のファイルすべてをロードする
md5 計算のために中身を取得するので buffer を保存しない設定でも全ファイルを読み取る時間がかかる
開発中などサーバの再起動が速いほうがいいときは preload をオフにしたほうが良さそう

preload をオフにするなら dynamic をオンにしないといけない
preload がオフで dynamic がオンだと 必要になったタイミングで未ロードならロードする
ファイルあたり一回だけど readFileSync が使われていて同期処理なので preload しない場合は注意

filter オプションを使えばサーブ対象のファイルを絞り込みできる
ただし preload のみで dynamic にすると効果なし
サーブ対象のフィルタではなく preload のフィルタってことなのかも

index.html はサポートしてない
必要なら ctx.path を書き換える必要あり
見つからないなら デフォルトファイルを返す SPA ならこれでも困らない

エイリアスを指定できる
ただ マッピングのみで関数での処理はできない
すべての index.html を事前に列挙しておかないと エイリアス機能で index.html 対応は無理

圧縮は gzip のみで brotli は対応してない
圧縮条件は 1024 バイトより大きいときのみで固定

md5 を使った Etag に対応

ファイルごとに maxage の指定ができる
ファイル情報オブジェクトを編集する方法なのでリクエストごとに関数呼び出しされるわけではない