Astro 실험적 큐 렌더링

Experimental Astro queued rendering

Astro 6의 실험 기능으로, 컴포넌트 트리를 먼저 순서 큐로 펼친 뒤 두 번째 단계에서 렌더링합니다.

···
html
<section class="stage"><div class="heading">QUEUED RENDER <span class="hint">traverse → render</span></div><div class="queued"><div class="tree-mini"><b>ROOT</b><span>A</span><span>B</span></div><div class="arrow">→</div><div class="queue"><span>ROOT</span><span>A</span><span>B</span></div><div class="arrow">→</div><div class="output-mini">HTML</div></div><div class="caption">Pass 1 orders nodes; pass 2 emits output</div></section>
css
.stage{width:min(94vw,780px);height:min(88vh,322px);padding:clamp(12px,3vmin,20px);border:1px solid var(--line);border-radius:16px;background:var(--surface);box-shadow:0 12px 36px #0001;display:flex;flex-direction:column;gap:clamp(7px,2vmin,14px);font:500 clamp(12px,3.5vmin,17px)/1.3 var(--font-sans,system-ui,sans-serif);overflow:hidden}.heading{display:flex;justify-content:space-between;align-items:center;gap:8px;font-weight:750;color:var(--accent)}.hint{color:var(--muted);font-size:clamp(12px,3.2vmin,14px);font-weight:500}.caption{margin-top:auto;color:var(--muted);font-size:clamp(12px,3.2vmin,14px)}.row{display:flex;gap:clamp(5px,1.5vmin,12px);align-items:center}.tile{padding:clamp(6px,1.8vmin,13px);border:1px solid var(--line);border-radius:9px;background:var(--bg);text-align:center;min-width:0}.arrow{color:var(--accent);font-weight:800}.stage [data-on]{transition:background .3s,border-color .3s,opacity .3s,transform .3s}.stage .on{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 14%,var(--surface));color:var(--accent)}.queued{flex:1;display:flex;align-items:center;justify-content:center;gap:clamp(3px,1.3vmin,12px)}.tree-mini,.queue,.output-mini{width:26%;max-width:140px;min-width:0;border:1px solid var(--line);border-radius:8px;background:var(--bg);padding:7px;text-align:center}.tree-mini b{display:block;font-size:.8em}.tree-mini span{display:inline-block;margin:5px 2px 0;padding:4px;border:1px solid var(--accent-2);border-radius:5px}.queue{display:flex;flex-direction:column;gap:4px}.queue span{background:var(--line);border-radius:5px;padding:3px;opacity:.3;transition:opacity .3s,background .3s}.output-mini{padding:16px 3px;font-weight:800;opacity:.3;transition:opacity .3s}.stage[data-step="1"] .queue span,.stage[data-step="2"] .queue span{opacity:1;background:color-mix(in srgb,var(--accent-2) 20%,var(--surface))}.stage[data-step="2"] .output-mini{opacity:1;border-color:var(--accent);color:var(--accent)}.stage small,.stage button,.stage .cards b,.stage .phase b,.stage .pair b,.stage .tree-mini b{font-size:clamp(12px,3.2vmin,14px)!important}
js
const stage=document.querySelector(".stage");let step=0;function tick(){stage.dataset.step=String(step);step=(step+1)%3}tick();let timer=setInterval(tick,1000);stage.addEventListener("pointerdown",()=>{clearInterval(timer);tick()})

기존 Astro 렌더러는 컴포넌트 트리를 재귀적으로 내려가며 렌더링합니다. Astro 6의 실험적 큐 렌더링은 첫 번째 단계에서 순서 있는 큐를 만들고 두 번째 단계에서 그 큐를 렌더링합니다.

공식 문서는 성능·메모리 개선 가능성을 소개하지만 기능은 여전히 실험 단계입니다. 데모는 트리가 일렬 큐로 펼쳐졌다가 HTML 출력으로 이어지는 두 단계를 보여줍니다.

언제 쓰나

Astro 6에서 렌더러 성능을 비교 실험할 때 기능 플래그와 결과를 확인합니다.

페이지로 열기 ↗