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)보다 짧은 뷰포트 진입 스태거 리빌이 범용 정답인 경우가 많다