핵심: parser 진행과 first paint는 분리된다. 깃발(first paint)이 보라 사각형(JS 실행)보다 왼쪽이면 — JS가 손대기 전에 그려지면 — 사용자가 잘못된 상태를 본다.
- non-blocking (async/defer): paint가 JS보다 먼저 → flash window(빨간 구간) 발생.
- parser-blocking (동기
<script>): parser는 멈추지만 그 위 청크는 먼저 그려질 수 있어, default 상태가 한 프레임 노출될지가 브라우저 재량 = 보장 없음. - blocking=render (
<head>module): paint가 JS 뒤로 → 유일하게 깨끗.
트레이드오프: “1프레임 flash/CLS”를 막는 대가로 “FCP를 JS 실행시간만큼 미루는” 거래라, 스크립트가 작고 인라인일 때만 성립한다.
성립 조건 셋:
- 스크립트가 작고 인라인 (FCP 지연을 감당할 만큼).
<head>안에서만 동작 — 컴포넌트 마크업 뒤가 아니라 head에type="module" blocking="render"로 올려야 보장이 생긴다 (원문이 놓친 부분).- attribute가 무시돼도 옛 동작으로 떨어질 뿐 깨지지 않는다 → 라이브러리가 권장 패턴으로 제공하려면 이 안전한 폴백이 핵심.