Skip to content

Commit 2fd37c3

Browse files
chan9yuclaude
andcommitted
perf: Reveal.js 프레젠테이션 성능 최적화
- iframe 지연 로딩 활성화 (data-src, data-preload) - iframe 사전 로딩 설정 추가 (viewDistance: 3) - 마우스 휠 네비게이션 지원 - 발표 모드 개선 (커서 자동 숨김, 2초 후) - 선형 네비게이션 모드 적용 - 개요 모드 및 도움말 활성화 - PDF 내보내기 최적화 - 터치 제스처 지원 추가 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 9d26e05 commit 2fd37c3

2 files changed

Lines changed: 46 additions & 24 deletions

File tree

index.html

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<div class="slides">
1313
<!-- Slide 1 -->
1414
<section>
15-
<iframe src="contents/1.html"></iframe>
15+
<iframe data-src="contents/1.html" data-preload></iframe>
1616
<aside class="notes">
1717
안녕하세요! 오늘은 React를 완전히 까보는 시간을 가져보려고 합니다. 평소에 우리가 당연하게 써왔던
1818
React가 내부적으로 어떻게 동작하는지, Virtual DOM부터 Fiber Architecture까지 30분 동안 함께
@@ -22,7 +22,7 @@
2222

2323
<!-- Slide 2 -->
2424
<section>
25-
<iframe src="contents/2.html"></iframe>
25+
<iframe data-src="contents/2.html" data-preload></iframe>
2626
<aside class="notes">
2727
오늘은 크게 5가지 주제를 다룰 건데요. 각 주제가 서로 연결되어 있어서 순서대로 따라오시면 전체
2828
그림이 보이실 겁니다. 목표는 '아 그래서 React가 이렇게 동작하는구나'를 느끼는 거예요!
@@ -31,7 +31,7 @@
3131

3232
<!-- Slide 3 -->
3333
<section>
34-
<iframe src="contents/3.html"></iframe>
34+
<iframe data-src="contents/3.html" data-preload></iframe>
3535
<aside class="notes">
3636
여러분 처음 JSX 봤을 때 어땠나요? 저는 '어? JavaScript에서 HTML을 쓴다고?'라고 생각했어요. 근데
3737
이거, 사실은 JavaScript가 아닙니다!
@@ -40,7 +40,7 @@
4040

4141
<!-- Slide 4 -->
4242
<section>
43-
<iframe src="contents/4.html"></iframe>
43+
<iframe data-src="contents/4.html" data-preload></iframe>
4444
<aside class="notes">
4545
JSX는 Babel이 JavaScript로 변환해줍니다. 보시면 React.createElement라는 함수 호출로 바뀌죠. 그럼
4646
이 함수가 뭘 반환할까요?
@@ -49,7 +49,7 @@
4949

5050
<!-- Slide 5 -->
5151
<section>
52-
<iframe src="contents/5.html"></iframe>
52+
<iframe data-src="contents/5.html" data-preload></iframe>
5353
<aside class="notes">
5454
결국 JavaScript 객체를 만드는 거예요! 이 객체가 바로 Virtual DOM을 구성하는 노드입니다. HTML처럼
5555
보이지만 사실은 전부 JavaScript 객체인 거죠.
@@ -58,7 +58,7 @@
5858

5959
<!-- Slide 6 -->
6060
<section>
61-
<iframe src="contents/6.html"></iframe>
61+
<iframe data-src="contents/6.html" data-preload></iframe>
6262
<aside class="notes">
6363
Virtual DOM 이야기를 하기 전에, 왜 필요했는지부터 보죠. jQuery 시대에는 데이터가 바뀔 때마다
6464
DOM을 일일이 찾아서 업데이트했어요. 코드는 복잡해지고 버그는 양산되죠.
@@ -67,7 +67,7 @@
6767

6868
<!-- Slide 7 -->
6969
<section>
70-
<iframe src="contents/7.html"></iframe>
70+
<iframe data-src="contents/7.html" data-preload></iframe>
7171
<aside class="notes">
7272
Virtual DOM의 핵심 아이디어는 간단합니다. 상태가 바뀌면 새로운 Virtual DOM을 만들고, 이전 것과
7373
비교해서 바뀐 부분만 실제 DOM에 반영하는 거예요. 그런데 여기서 중요한 오해가 하나 있습니다...
@@ -76,7 +76,7 @@
7676

7777
<!-- Slide 8 -->
7878
<section>
79-
<iframe src="contents/8.html"></iframe>
79+
<iframe data-src="contents/8.html" data-preload></iframe>
8080
<aside class="notes">
8181
많은 분들이 'Virtual DOM이 빠르니까 쓴다'고 생각하는데, 사실 목적은 성능이 아니라 개발
8282
경험이에요. 우리가 What만 신경 쓰면 How는 React가 알아서 해주는 거죠!
@@ -85,7 +85,7 @@
8585

8686
<!-- Slide 9 -->
8787
<section>
88-
<iframe src="contents/9.html"></iframe>
88+
<iframe data-src="contents/9.html" data-preload></iframe>
8989
<aside class="notes">
9090
두 개의 트리를 비교하는 건 원래 엄청 복잡한 문제예요. O(n³) 복잡도라서 노드가 1000개만 되어도
9191
10억 번 연산을 해야 합니다. 60fps를 유지하려면 16ms 안에 끝내야 하는데, 이건 불가능하죠. React는
@@ -95,7 +95,7 @@
9595

9696
<!-- Slide 10 -->
9797
<section>
98-
<iframe src="contents/10.html"></iframe>
98+
<iframe data-src="contents/10.html" data-preload></iframe>
9999
<aside class="notes">
100100
React는 두 가지 과감한 가정으로 O(n)을 달성했습니다. 첫째, 타입이 다르면 완전히 다른 UI라고
101101
가정하고 비교하지 않고 새로 만듭니다. 둘째, key를 통해 요소를 식별합니다. 이 두 가정 덕분에
@@ -105,7 +105,7 @@
105105

106106
<!-- Slide 11 -->
107107
<section>
108-
<iframe src="contents/11.html"></iframe>
108+
<iframe data-src="contents/11.html" data-preload></iframe>
109109
<aside class="notes">
110110
이게 바로 우리가 늘 듣는 'key warning'의 이유입니다. index를 key로 쓰면 React가 요소를 제대로
111111
식별하지 못해요. 새 아이템을 추가했는데 React는 기존 아이템이 바뀐 줄 알고 불필요하게 전부
@@ -115,7 +115,7 @@
115115

116116
<!-- Slide 12 -->
117117
<section>
118-
<iframe src="contents/12.html"></iframe>
118+
<iframe data-src="contents/12.html" data-preload></iframe>
119119
<aside class="notes">
120120
Diffing 알고리즘의 핵심은 3가지입니다. 같은 레벨끼리만 비교하고, 타입이 같으면 props만
121121
업데이트하고, 컴포넌트가 같으면 state를 유지합니다. 이 마지막 포인트가 리렌더링 시에도 state가
@@ -125,7 +125,7 @@
125125

126126
<!-- Slide 13 -->
127127
<section>
128-
<iframe src="contents/13.html"></iframe>
128+
<iframe data-src="contents/13.html" data-preload></iframe>
129129
<aside class="notes">
130130
React는 상태가 바뀌었는지 확인할 때 얕은 비교만 합니다. 참조만 비교하는 거죠. 깊은 비교는 중첩된
131131
모든 객체를 순회해야 해서 느립니다. 대신 우리가 불변성을 지켜야 하죠! 그리고 여기서 중요한
@@ -137,7 +137,7 @@
137137

138138
<!-- Slide 14 -->
139139
<section>
140-
<iframe src="contents/14.html"></iframe>
140+
<iframe data-src="contents/14.html" data-preload></iframe>
141141
<aside class="notes">
142142
이게 바로 우리가 항상 스프레드 연산자를 쓰는 이유입니다. 직접 수정하면 참조가 같아서 React가
143143
변화를 감지하지 못해요. 새 객체를 만들어야 참조가 바뀌면서 리렌더링이 일어나죠. 복잡하면 Immer
@@ -147,7 +147,7 @@
147147

148148
<!-- Slide 15 -->
149149
<section>
150-
<iframe src="contents/15.html"></iframe>
150+
<iframe data-src="contents/15.html" data-preload></iframe>
151151
<aside class="notes">
152152
Vue나 Angular는 자동으로 변화를 감지해줍니다. 편하죠. 하지만 React는 '명시적'을 선택했어요. 더
153153
번거롭지만, 코드를 읽었을 때 정확히 무슨 일이 일어나는지 알 수 있다는 장점이 있습니다!
@@ -156,7 +156,7 @@
156156

157157
<!-- Slide 16 -->
158158
<section>
159-
<iframe src="contents/16.html"></iframe>
159+
<iframe data-src="contents/16.html" data-preload></iframe>
160160
<aside class="notes">
161161
React 16 이전에는 Stack Reconciler를 썼는데요. 재귀적으로 모든 작업을 한 번에 처리했습니다.
162162
문제는 중단할 수 없다는 거예요. 대규모 리스트를 렌더링할 때 입력이 먹통되는 경험, 다들 해보셨죠?
@@ -166,7 +166,7 @@
166166

167167
<!-- Slide 17 -->
168168
<section>
169-
<iframe src="contents/17.html"></iframe>
169+
<iframe data-src="contents/17.html" data-preload></iframe>
170170
<aside class="notes">
171171
Fiber는 작업을 작은 단위로 쪼개서, 중요한 것부터 먼저 처리하고, 필요하면 중간에 멈추고 다시
172172
시작할 수 있습니다. 사용자 입력은 즉시 처리하고, 검색 결과 업데이트 같은 건 뒤로 미룰 수 있는
@@ -176,7 +176,7 @@
176176

177177
<!-- Slide 18 -->
178178
<section>
179-
<iframe src="contents/18.html"></iframe>
179+
<iframe data-src="contents/18.html" data-preload></iframe>
180180
<aside class="notes">
181181
Fiber는 작업에 우선순위를 매길 수 있습니다. 클릭이나 입력 같은 사용자 인터랙션은 최우선으로
182182
처리하고, 데이터 페칭이나 로깅 같은 건 나중에 처리하죠. useTransition이나 Suspense 같은 기능도
@@ -186,7 +186,7 @@
186186

187187
<!-- Slide 19 -->
188188
<section>
189-
<iframe src="contents/19.html"></iframe>
189+
<iframe data-src="contents/19.html" data-preload></iframe>
190190
<aside class="notes">
191191
Fiber는 렌더링을 중단하고 다시 시작할 수 있기 때문에, 컴포넌트 함수가 여러 번 호출될 수
192192
있습니다. 그래서 반드시 순수 함수로 작성해야 해요. API 호출 같은 부작용은 useEffect에서 처리해야
@@ -196,7 +196,7 @@
196196

197197
<!-- Slide 20 -->
198198
<section>
199-
<iframe src="contents/20.html"></iframe>
199+
<iframe data-src="contents/20.html" data-preload></iframe>
200200
<aside class="notes">
201201
오늘 배운 내용을 정리해볼게요. JSX가 JavaScript 객체로 변환되고, 이게 Virtual DOM을 구성하고,
202202
Reconciliation으로 효율적으로 비교하고, 얕은 비교로 빠르게 감지하고, Fiber로 우선순위를
@@ -206,7 +206,7 @@
206206

207207
<!-- Slide 21 -->
208208
<section>
209-
<iframe src="contents/21.html"></iframe>
209+
<iframe data-src="contents/21.html" data-preload></iframe>
210210
<aside class="notes">
211211
이제 여러분은 React를 더 깊이 이해하게 되었습니다. key warning이 왜 뜨는지, 왜 불변성을 지켜야
212212
하는지, 언제 최적화를 해야 하는지 이해할 수 있죠. 이 지식은 실무에서 성능 문제를 디버깅하고 더
@@ -216,7 +216,7 @@
216216

217217
<!-- Slide 22 -->
218218
<section>
219-
<iframe src="contents/22.html"></iframe>
219+
<iframe data-src="contents/22.html" data-preload></iframe>
220220
<aside class="notes">
221221
더 깊이 공부하고 싶으시면 React 공식 문서와 Lin Clark의 Fiber 설명 영상을 추천드립니다. 여유가
222222
되시면 React 소스코드를 직접 읽어보거나, 간단한 React를 직접 구현해보는 것도 큰 도움이 될
@@ -226,15 +226,15 @@
226226

227227
<!-- Slide 23 -->
228228
<section>
229-
<iframe src="contents/23.html"></iframe>
229+
<iframe data-src="contents/23.html" data-preload></iframe>
230230
<aside class="notes">
231231
발표는 여기까지입니다. 궁금하신 점이나 더 자세히 알고 싶은 부분 있으시면 질문해주세요!
232232
</aside>
233233
</section>
234234

235235
<!-- Slide 24 -->
236236
<section>
237-
<iframe src="contents/24.html"></iframe>
237+
<iframe data-src="contents/24.html" data-preload></iframe>
238238
<aside class="notes">
239239
끝까지 들어주셔서 감사합니다. 혹시 나중에 더 궁금하신 게 있으시면 블로그나 GitHub로 연락주세요!
240240
</aside>

src/presentation.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Reveal from "reveal.js";
77
import RevealNotes from "reveal.js/plugin/notes/notes.esm.js";
88

99
Reveal.initialize({
10+
// 기본 설정
1011
hash: true,
1112
controls: true,
1213
progress: true,
@@ -17,6 +18,27 @@ Reveal.initialize({
1718
margin: 0,
1819
minScale: 1,
1920
maxScale: 1,
21+
22+
// iframe 최적화
23+
preloadIframes: true,
24+
viewDistance: 3,
25+
26+
// 네비게이션
27+
mouseWheel: true,
28+
navigationMode: "linear",
29+
slideNumber: false,
30+
overview: true,
31+
help: true,
32+
touch: true,
33+
34+
// 발표 모드
35+
hideInactiveCursor: true,
36+
hideCursorTime: 2000,
37+
38+
// PDF 내보내기
39+
pdfSeparateFragments: false,
40+
pdfMaxPagesPerSlide: 1,
41+
2042
plugins: [RevealNotes]
2143
});
2244

0 commit comments

Comments
 (0)