2026-05-31
요약 (AI 작성)
zntc는 lazy compilation 작업이 하루 종일 대규모로 진척되었습니다. 동적 import 경계에서 멈춰 미파싱 seed를 남기고 on-demand로 청크를 컴파일하는 인프라(PR-3a/3b)를 시작으로, watch 기반 lazy 청크 캐시 무효화와 재귀 seed 누적(PR-4), startDevServer의 lazyCompilation 옵션 노출(PR-5), 그리고 napi build/watch API에 프리미티브를 노출하는 D105 시리즈까지 한꺼번에 머지되었습니다. CLI에는 zntc dev --lazy 플래그가 들어가 dev 서버가 방문된 lazy 청크를 watch 그래프에서 materialize하도록 연결했고(#4079), per-seed 정밀 캐시 무효화로 무관한 편집 시 cold 재빌드를 회피하는 최적화도 더해졌습니다.
안정성 측면에서는 dev 서버 teardown 경로의 결함 두 건을 잡았습니다 — entry 모드 teardown segfault(watch thread join, #4063)와 keep-alive connection thread teardown UAF(shutdown으로 깨우기, #4066). 또한 cache-hit rebuild replay가 lazy seed를 eager parse·emit하던 버그(#4074)와 watch/dev lazy 경로가 동적 청크를 만들지 않던 버그(#4071)도 수정했습니다.
suji에서는 5,500줄을 넘긴 거대한 main.zig를 도메인별 모듈로 쪼개는 리팩토링이 이어졌습니다 — backend lifecycle/build helpers, CLI diagnostics, types_cmd, plugin loader, runInit를 각각 별도 파일로 추출해 진입점을 정리했습니다.
커밋
ohah/suji
- refactor(main): extract backend lifecycle to core/backend_lifecycle.zig
- refactor(main): extract CLI diagnostics + usage (5,531 → 5,444 lines)
- refactor(main): extract backend build helpers to core/backend_build.zig
- refactor(main): extract runTypes + schema dump to cli/types_cmd.zig
- refactor(main): extract plugin loader + packaged path helpers
- refactor(main): extract runInit into src/cli/init.zig
ohah/zntc
- fix(bundler): watch/dev lazy 경로가 동적 청크를 안 만들던 버그 — buildIncremental 에서 materializeLazySeeds 호출 (#4071)
- feat(cli): JS dev 서버 lazy on-demand 청크 라우트 (env ZNTC_LAZY, #4062 PR-B-2)
- feat(napi): watch() onRebuild 이벤트에 lazySeeds 노출 (#4062 PR-C-1)
- fix(bundler): cache-hit rebuild replay 경로가 lazy seed 를 eager parse·emit 하던 버그 (#4074)
- feat(cli): lazy on-demand 캐시 epoch 가드로 rebuild-중-빌드 stale 캐시 방지 (#4062 PR-C-2)
- feat(bundler): lazy compilation PR-3a-i — 동적 import 경계 정지 + 미파싱 seed 인프라
- feat(napi): lazy compilation 프리미티브를 build/watch API 에 노출 (D105 PR-A)
- feat(napi): watch() onReady 이벤트에 lazySeeds 노출 + 공용 빌더 추출 (D105 PR-B-1)
- feat(cli): zntc dev --lazy 플래그 — 동적 import 청크 on-demand 컴파일 (#4062 PR-C-3)
- docs: RFC — lazy dev 요청 seed 를 watch 그래프에서 materialize (#4079 설계)
- feat(bundler): lazy 빌드 동적 청크가 force-parse 후에도 path-hash 안정 이름 유지 (#4079 PR-1)
- feat(napi): lazy compilation PR-5 — startDevServer 에 lazyCompilation 옵션 노출
- fix(server): entry 모드 dev 서버 teardown segfault — watch thread join (#4063)
- fix(server): keep-alive connection thread teardown UAF — shutdown 으로 깨우기 (#4066)
- docs(claude): 메인 설정은 자체 zntc.config — Vite/Rollup 어댑터는 호환 목적 명확화
- refactor(linker): mangle 경로 헬퍼 통합 + per-chunk bitset/leak hardening
- feat(bundler): lazy compilation PR-3a-ii — 미파싱 seed 청크 emit-skip + 경로기반 안정 이름
- feat(bundler): lazy compilation PR-3b-ii 완성 — shared-off + entry export-all-by-local
- feat(server): lazy compilation PR-4-i — watch-driven lazy 청크 캐시 무효화
- feat(server): lazy compilation PR-4-ii — 재귀 lazy(중첩 import() seed 누적)
- feat(server): lazy compilation PR-4-iii — 그래프 변경 entry 재계산 + TOCTOU 캐시 가드
- feat(bundler): lazy compilation PR-3b-ii — force-parse primitive + (B) 결정론 재빌드 검증
- feat(bundler): lazy compilation PR-3b-i — emitChunks 단일 청크 emit(restrict_to_chunk)
- feat(bundler): lazy compilation PR-3b-iii — dev 서버 lazy on-demand 라우트
- perf(cli): lazy on-demand 캐시 정밀(per-seed) 무효화 — 무관한 편집 시 cold 재빌드 회피 (#4062 후속)
- feat(napi): WatchHandle.requestLazySeed() — 요청된 lazy seed 를 watch 그래프에서 force-parse (#4079 PR-2)
- feat(cli): dev 서버가 방문된 lazy 청크를 watch 에 materialize 요청 (#4079 PR-3)