Today I Learned

日々の仕事と学びの振り返りです。何をして、何を学んだかを記録します。

20267

2026-07-31

旧ブラウザ互換は babel 一つではない — 構文・ポリフィル・条件ロード・スモークの多層契約

5 年超の旧ブラウザでアプリが丸ごと死ぬバグを直しながら学んだこと — 複数の機能が同時に死んだらハイドレーションを疑い、構文ダウンレベルとランタイムポリフィルを分離し、ポリフィルは feature-detect で旧ブラウザにだけロードし、スモークは実際のインタラクションを実行する

  • 複数の UI 機能が同時に死んだら、個別のバグではなくハイドレーション/バンドルのパースといった共通の根本原因をまず疑う
  • 構文ダウンレベル(babel)とランタイム API(ポリフィル)は別々のレイヤーである — トランスパイラは構文は変えても存在しない関数は作らない
2026-07-25

初回ペイントスプラッシュとオフラインファースト — ISR を守りつつ即時反映する

ネイティブアプリのようなローディングスプラッシュを初回ペイントから表示しつつボットには隠すインラインスクリプト技法、そしてオフラインファーストで『自分の書き込みの即時反映』を staleTime ではなく invalidate と durable キューで作る方法

  • 初回ペイント前の表示 + ボット隠蔽はインラインブロッキングスクリプト注入 — UA ゲートは headers() で ISR を dynamic に壊す
  • react-query で「自分の書き込みの即時反映」は staleTime を下げるのではなく書き込み後の invalidateQueries で作る(invalidate は staleTime を無視)
2026-07-24

LCP のボトルネックが画像ではなく hydration のとき、そして節度あるスクロールモーション

ランディング性能を改善して学んだこと — LCP が遅いのに画像が小さいなら render delay(hydration)を疑いクライアント JS を外す、派手なスクロールモーションより進入スタッガーリビール、構造化データは画面と 1:1

  • LCP が遅いのに TBT が 0 で画像が小さければ element render delay(=クライアント境界の hydration)を疑い、そのサーフェスのクライアント JS を外す
  • 派手なスクロール従属モーション(scroll-jacking)より短いビューポート進入スタッガーリビールが汎用的な正解であることが多い