GDG DevFest 2017 Seoul
프론트엔드 모던 프레임워크 낱낱히 파헤치기 세션의 발표자료입니다.
이 발표자료에서는 여러분이 항상 궁금해 하신
프론트엔드 프레임워크의 삼총사
Angular, React, VueJS를 다차원적으로 깊이있게 비교하고 각각의 이점과 특화된 기능을 소개하고 있습니다.
이러한 프레임워크를 경험해보지 못한 분들을 위해 프레임워크 별로 특징부터 쉽게 접근하여 설명하기 때문에 경험 불문하고 가볍게 읽어 보실 수 있습니다.
11. Angular
완전하고 빠른 프레임워크
React
활발하고 오픈 되어 있으며 합리적인 프레임워크
VueJS
가볍고 친숙하며 장점만을 합쳐놓은 프레임워크
그러던 중 나타난 프레임워크들
그리고 프레임워크는 그 모든 것을 쉽게 만들어주었나니..
12. Angular
완전하고 빠른 프레임워크
React
활발하고 오픈 되어 있으며 합리적인 프레임워크
VueJS
가볍고 친숙하며 장점만을 합쳐놓은 프레임워크
그러던 중 나타난 프레임워크들
그리고 프레임워크는 그 모든 것을 쉽게 만들어주었나니..
13. Angular
모든 기능이 빌트인되어 있으며 성능이 훌륭하지만, 진입장벽이 가장 높음
React
에코시스템이 활발하게 움직이고 또 그것을 장려하지만
의존과 버전에 민감하고 라이브러리 자체의 기능만으로는 부족함
VueJS
프레임워크 자체가 가볍고 진입장벽이 낮으며 각 프레임워크의 장점을 흡수
다만 크기가 커질 수록 재활용성은 떨어지며, 테스트하기 어렵고 느림
이를 풀어 설명하자면
48. AOT 성능 변화
크기 (minified)
지연시간 (initial load)
메모리 (snapshot)
442KB
585ms
38.5MB
198KB
305ms
15.3MB
-55%
-48%
-60%
JIT AOT
JIT AOT
49. VirtualDOM
VirtualDOM (가상 DOM)
뷰 모델에서 발생하는 변경사항을 메모리에서 관리하는 논리적 DOM에서 먼저 감지 한 후
실제 DOM의 업데이트를 최소화하여 성능을 향상시키고 UX 측면에서 발생하는 문제를 줄임
미지원
지원
지원
VirtualDOMViewModel
Element A
Element B1
Element B2
Element B
Element A
Element B1
Element B2
Element B
header
.list-item
.list-item
.container
NativeDOM
(Real DOM)
diff patch
50. VirtualDOM
기존의 비싼 비용의 Native DOM 처리를 javascript 상의 diff 알고리즘을 통해
저렴한 비용으로 효율적인 처리가 가능해짐
MDN에 공개된 브라우저 Layout 처리
51. Angular의 최적화가 적용되지 않은 케이스에서는
VueJS가 성능이 빠를 것으로 예상됩니다.
(VueJS에서 제공하는 자료와 벤치마크 데이터 참조)
54. 마이크로 프로젝트에는 VueJS 권장
서버사이드 랜더링이 필요한 프로젝트에는 React
대규모의 프로젝트에는 Angular
55. 템플릿
{{interpolation}}
[1way data binding]
[(2way data binding)]
(1way data binding (event))
{{interpolation with pipe | pipeName}}
*ngFor *ngIf
[ngSwitch] [hidden] [innerHTML] [ngClass]
(click) (keypress) (blur) (input) (change)
…
React에서 공식적으로
제공하는 템플릿은 없습니다.
모든 것을
JSX 혹은 Javascript를 이용하여
표현합니다.
react-templates
라이브러리를 이용하면
다른 프레임워크와 유사하게
템플릿을 사용하실 수 있습니다.
v-directive-name:parameter
{{interpolation | filter}}
v-bind:id v-if v-html
v-for v-else v-else-if
v-show v-bind:class v-bind:style
v-on:event-name
v-bind:bind-target-name
{{interpolation}}
:store-name
v-model
58. Angular Change Detection & NgZone
NgZone의 몽키패칭된 이벤트로부터 변화를 감지하여 Change Detection Strategy에 맞게 변화를 전파
setTimeout, addEventListener,
requestAnimationFrame
NgZone
Monkey Patched
Tick
59. 1
React Reconciliation & React Fiber
React Reconciliation
React FibershouldComponentUpdate()
Dealing control by element types
(aka. Pair-wise diff)
2 3
Dealing control by key
(aka. List-wise diff)
Update DOM
render() 호출 시 VirtualDOM 생성 및 Dirty model을 감지하여 React Reconciliation 과정을 진행 후 React Fiber 혹은 DOM 변경
60. VueJS watcher & VirtualDOM
data 프로퍼티에서 Object.defineProperty()를 통해 Watcher가 변화를 감지 변화를 수신 시
render 함수에 의해 VirtualDOM에 따른 DOM 변경
70. MVVM 패턴은 Model-View-ViewModel의 약자
MVVM
View
ViewModel ViewModel
Data binding
Event receiving
Update
데이터 바인딩에 사용되는 채널 (변수)는 유사한 것 끼리 최대한 합치세요
데이터 바인딩에 사용되는 데이터가 정적이라면 이를 함수로 구현하지 마세요
72. Immutable (불변성)
Immutable
ViewModel의 사이드 이펙트를 줄이기위해 Immutable을 고려하시는 분들이 계실 겁니다.
Immutable을 제공하기 위해 우리는 큰 비용이 발생하는 DeepCopy를 사용합니다.
또한 Immutable 객체는 기존 Prop와 전혀 다른 객체이므로 무조건 랜더링이 업데이트 됩니다.
Immutable ValueUpdate
Dispatch
Reducer
Notify
shouldComponentUpdate
74. HMR (Hot Module Replacement)
Webpack의 HMR(Hot Module Replacement)는
Angular, React, VueJS에서 코드를 수정하고 저장할 때 새로고침을 할 필요 없이
더군다나 기존 상태를 잃지 않고 코드가 바로 교체되고 새로 저장한 코드를 즉시 사용할 수 있습니다.
76. Shadow DOM
ShadowDOM은 각 컴포넌트에 독립적으로 스타일을 지정하고 싶을 때 사용할 수 있는
논리적으로 구분된 가상의 DOM 범위입니다.
React는 ReactShadow, Angular는 encapsulation 속성을 통해 쉽게 사용가능합니다.
VueJS는.. 다음장으로!
78. Webpack build optimization
빌드 과정은 때묻지 않은 초기 스캐폴딩에서는 그렇게 오래 기다리지 않아도 됩니다.
애드혹 빌드 과정일 경우 보통 5초 내외로 완료되곤 합니다.
Watch 옵션을 켜서 메모리 캐시를 활용하면 더욱 빠릅니다. (1초 안팎)
문제는 어느정도 규모가 있는 프로젝트에서는 빌드 과정이 10분 이상 넘어갑니다.
다행이도 Webpack 빌드 과정은 다음장의 최적화 방식을 따라 하여 성능을 높일 수 있습니다.
79. Webpack Dll Plugin
Webpack Dll Plugin은 변경이 자주 발생하지 않는 번들 파일을 미리 빌드 해놓고
일반적인 변경사항에 대한 빌드에서 dll로 지정한 빌드된 번들파일을 최종적으로 묶어서
결과적으로 빌드 속도를 상승시켜주는 역할을 합니다.
설정법이 어렵지 않으며 Webpack 공식문서에 공개되어 있으니 참고하여 주세요
new webpack.DllReferencePlugin({
context: root,
manifest: manifest
});