c24165b8bc
에이전트 8종(대화형/프로그래머 C·S/디자이너/설계자/기획자/QA/PD/PM)에게 [공통 기본 능력 + 롤별 Specialty] 2층으로 지식을 주입하기 위한 재분류. 문서 내용·포맷은 무수정, 폴더 이동만 (6,372개 문서 수 보존 확인). - Topic_Programming → Domain_Programming (내부 구조 보존) - Topic_Graphic → Domain_Design - Topic_Business → Domain_Product - Topic_General → Domain_General - _Common 신설: Math(구 Topic_Math_Specialty), Reasoning(구 General/From_Thinking & Reasoning), Reasoning_Creativity(구 General/From_창의성), Communication(Poetic_Blog_Writing + From_writing) - 타 도메인의 From_* 폴더는 유지 (출처 표기일 뿐, 이미 도메인에 맞게 분류된 문서) - 빈 폴더 정리 (memory/procedures) - 에이전트→폴더 매핑은 workspace의 .astra/agent-knowledge-map.json (9개 에이전트) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
5.8 KiB
5.8 KiB
id, title, category, status, canonical_id, aliases, duplicate_of, source_trust_level, confidence_score, verification_status, tags, raw_sources, last_reinforced, github_commit, tech_stack
| id | title | category | status | canonical_id | aliases | duplicate_of | source_trust_level | confidence_score | verification_status | tags | raw_sources | last_reinforced | github_commit | tech_stack | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| wiki-2026-0508-code-splitting-lazy-loading | Code Splitting & Lazy Loading | 10_Wiki/Topics | verified | self |
|
none | A | 0.95 | applied |
|
2026-05-10 | pending |
|
Code Splitting & Lazy Loading
매 한 줄
"매 ship-only-what-you-execute". 매 Code Splitting 은 single bundle 을 route/component-bound chunk 로 분할하여 initial JS payload 의 minimization. Lazy Loading 은 매 chunk 를 user-interaction 시점에 fetch. 매 2026 의 standard 는 Vite + React.lazy + dynamic import + RSC (React Server Components) hybrid.
매 핵심
매 split 차원
- Route-based: 매 page 의 lazy import —
/dashboard,/settings. - Component-based: 매 heavy widget (chart, code-editor) 의 deferred load.
- Vendor split: 매 third-party (React, lodash) 의 separate chunk → long-term cache.
- Dynamic feature flag: 매 A/B variant 의 gated import.
매 핵심 메커니즘
- Dynamic
import(): 매 ES module spec — Promise 반환. - Bundler chunk splitting: Webpack/Vite 의
splitChunksheuristic. - HTTP/2 push 의 deprecation: 매 modern preload + modulepreload 로 대체.
- Streaming SSR + RSC: 매 chunk 의 server-streamed delivery.
매 응용
- SaaS dashboard —
/adminroute 의 lazy chunk. - E-commerce — checkout flow 만 separate bundle.
- Editor app (Notion-like) — markdown/code-editor lazy.
💻 패턴
패턴 1: React.lazy + Suspense
import { lazy, Suspense } from "react";
import { Routes, Route } from "react-router-dom";
const Dashboard = lazy(() => import("./pages/Dashboard"));
const Settings = lazy(() => import("./pages/Settings"));
export function App() {
return (
<Suspense fallback={<Skeleton />}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/dashboard" element={<Dashboard />} />
<Route path="/settings" element={<Settings />} />
</Routes>
</Suspense>
);
}
패턴 2: Vite manual chunks
// vite.config.ts
import { defineConfig } from "vite";
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes("node_modules/react")) return "react-vendor";
if (id.includes("node_modules/@radix-ui")) return "radix";
if (id.includes("/src/charts/")) return "charts";
}
}
}
}
});
패턴 3: Preload on hover (intent-based prefetch)
function NavLink({ to, children }: { to: string; children: React.ReactNode }) {
const prefetch = () => {
if (to === "/dashboard") import("./pages/Dashboard");
};
return <Link to={to} onMouseEnter={prefetch} onFocus={prefetch}>{children}</Link>;
}
패턴 4: Conditional dynamic import
async function loadChart(type: "line" | "bar" | "heatmap") {
switch (type) {
case "line": return (await import("./charts/Line")).default;
case "bar": return (await import("./charts/Bar")).default;
case "heatmap": return (await import("./charts/Heatmap")).default;
}
}
패턴 5: React Server Component (RSC) split
// app/dashboard/page.tsx (Next.js 15+)
import { Suspense } from "react";
import { HeavyChart } from "./HeavyChart"; // server component
export default function Page() {
return (
<>
<Header />
<Suspense fallback={<ChartSkeleton />}>
<HeavyChart /> {/* streamed independently */}
</Suspense>
</>
);
}
패턴 6: Bundle analyzer pipeline
# Vite + rollup-plugin-visualizer
npm i -D rollup-plugin-visualizer
import { visualizer } from "rollup-plugin-visualizer";
export default defineConfig({
plugins: [visualizer({ open: true, gzipSize: true })]
});
패턴 7: Module federation (micro-frontend)
// host vite.config.ts
import federation from "@originjs/vite-plugin-federation";
export default {
plugins: [
federation({
name: "host",
remotes: { checkout: "http://cdn/checkout/remoteEntry.js" },
shared: ["react", "react-dom"]
})
]
};
매 결정 기준
| 상황 | Approach |
|---|---|
| Multi-page SPA | route-based React.lazy |
| Heavy single widget | component-level dynamic import |
| Multi-team monorepo | module federation |
| Server-rendered Next.js | RSC + Suspense streaming |
| Legacy Webpack 4 | upgrade to Vite/Webpack 5 first |
| Initial paint > 3s | bundle analyzer + manualChunks |
기본값: Vite + React.lazy(route) + intent-prefetch on hover.
🔗 Graph
- 부모: Web Performance
- 변형: Module Federation
- 응용: React Server Components — 경계 의식
- Adjacent: Vite · Rollup · esbuild
🤖 LLM 활용
언제: bundle analysis 의 chunk strategy 추천, lazy boundary 후보 식별, manualChunks rule 작성. 언제 X: 매 production runtime 의 dynamic decision — 매 bundler-time static analysis 의 영역.
❌ 안티패턴
- Over-splitting: 매 component 마다 lazy — 매 too many waterfalls. 매 100KB+ threshold.
- Suspense boundary 의 미사용: 매 React.lazy 의 fallback 없음 → throw.
- Preload everything: 매 idle prefetch 의 abuse — bandwidth waste.
- Dynamic import in render: 매 매 render 마다 import() 호출 → re-fetch.
🧪 검증 / 중복
- Verified (web.dev code-splitting docs, Vite docs, React.lazy spec, RFC#118).
- 신뢰도 A.
🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — substantive content + 2026 stack (Vite, RSC, module federation) |