세그먼트별 점진 사전 가져오기

Incremental segment prefetching

Next.js 16은 공통 레이아웃을 재사용하고 캐시에 없는 라우트 조각만 사전 가져옵니다.

···
html
<section class="stage"><div class="heading">INCREMENTAL PREFETCH <span class="hint">reuse shared layout</span></div><div class="segments"><div class="tile layout">/shop layout <small>cached</small></div><div class="paths"><div class="tile route">/item/A <small>loaded</small></div><div class="tile route new">/item/B <small>fetch</small></div></div></div><div class="caption">Prefetch only the missing segment</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)}.segments{flex:1;display:flex;align-items:center;justify-content:center;gap:clamp(7px,2vmin,20px)}.layout{width:38%;max-width:190px;border-color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 13%,var(--surface))!important}.paths{display:flex;flex-direction:column;gap:8px;width:40%;max-width:190px}.route{border-color:var(--accent-2)!important}.route.new{opacity:.3;transform:translateX(-10px);transition:opacity .3s,transform .3s}.tile small{display:block;color:var(--muted);font:600 .7em ui-monospace,monospace;margin-top:4px}.stage[data-step="1"] .route.new,.stage[data-step="2"] .route.new{opacity:1;transform:none}.stage[data-step="2"] .route:first-child{opacity:.4}.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,980);stage.addEventListener("pointerdown",()=>{clearInterval(timer);tick()})

Next.js 16의 라우팅은 여러 링크가 같은 레이아웃을 가리킬 때 그 레이아웃을 중복 다운로드하지 않습니다. 사전 가져오기도 이미 캐시에 있는 세그먼트는 건너뛰고 부족한 조각만 요청합니다.

이 방식은 총 전송량을 줄일 수 있지만 요청 수는 더 많아질 수 있습니다. 데모는 공통 레이아웃을 한 번 받은 뒤 새 상세 세그먼트만 추가하는 흐름입니다.

언제 쓰나

Next.js 16의 중첩 라우트를 설계하거나 사전 가져오기 네트워크 동작을 분석할 때 알아두면 좋습니다.

페이지로 열기 ↗