SlideShare a Scribd company logo
React
그래서React는무슨라이브러리인가?
npmtrend
떡상(githubrepostart5위!)
참고
1위:freeCodeCamp(코딩교육관련)
2위:996icu(중국...개발자근무환경관련운동레포)
3위:vuejs(중국...)
4위:EbookFoundation/free-programming-books(코딩교육관련)
"수량"에관련해서그들을이길수는없었다...
나의시선...
React는뭔가복잡한데,사용하기는쉽다
사용자의눈은높아지고
기능은많아지고
화면은복잡해졌는데
UI를편하게만들고싶다
그래서React는뭘해주나...?
많이하는오해
React는빠르다!?
a.k.a직접DOM접근비용이큰데,virtualDOM을활용해서그걸빠르게~~
이름의영향이있다고봅니다.Swift도뭔가엄청빨라보이잖아요
;
선언형,컴포넌트기반,한번배워어디서나사용하기
코드만들기쉽게해준다는얘기.빠르다는말은없음
그렇다면느린가?
React는충분히빠르다
충분히안빠르면안씀
파생된오해
VirtualDOM은빠르다?
썩그런것도아니다
실제로React가하는것
1) tree구조를 가지는 element tree를 만들어 놓는다
2) 가지고 있던 tree가 업데이트 되면 무엇이 업데이트 되었는지 비교한다
3) 바뀐 부분만 실제 DOM에 업데이트 한다
뭘그릴지에만관심이있는라이브러리
따라서,
잘조작한다면,실제DOM을직접조작하는게더빠르다.
모든라이브러리가마찬가지겠지만,하나의레이어가더생긴이상느려질수밖에없음.
하지만우리가필요한건생산성
React는배우기쉽고,UI개발을효율적으로만들어줍니다.
배우기쉬운이유는라이브러리가제공하는기능의갯수가많지않기때문
React는적은수의기능을잘제공하는라이브러리
const people = { name: '호종호호종' };
people.name = '호종';
vs
const element = document.querySelector('#people');
element.name = '호종';
DOM도객체니어짜피둘다객체접근.그러므로큰차이없다
가장비용이큰연산은 렌!더!링!
따라서바뀌어야할부분을최소한의비용으로바꿔야함(증분렌더링)
React(와같은방식)가왜생산성을높여주나
버튼의가로사이즈를바꾸는코드
function changeWidth(width) {
const searchButton = document.querySelector('#search_btn');
searchButton.style.width = width;
}
changeWidth('100px');
버튼의가로사이즈를바꾸는코드
const myObj = {
target: document.querySelector('#search_btn'),
style: {
width: '5px',
},
render() {
this.target.style = {
...this.target.style,
...this.style,
};
},
};
...
function changeWidth(width) {
myObj.style.width = width;
myObj.render();
}
changeWidth('100px');
- changeWidth 에서DOMapi에직접접근하지않는다.=>제어역전
-search_btn의상태를가지고있다가복원할수도있음
-개발자는데이터만바꾸면된다.그리는건myObj가알아서...
React컴포넌트
const MyComponent: React.FC = () => {
const [title, setTitle] = useState('제목');
return <div>{title}</div>;
};
참고:JSXissyntacticsugar
https://github.com/facebook/react/blob/master/packages/react/src/ReactElement.js#L146
const ReactElement = function (type, key, ref, self, source, owner, props) {
const element = {
// This tag allows us to uniquely identify this as a React Element
$$typeof: REACT_ELEMENT_TYPE,
// Built-in properties that belong on the element
type: type,
key: key,
ref: ref,
props: props,
// Record the component responsible for creating this element.
_owner: owner,
};
return element;
};
const MyComponent: React.FC = () => {
const [title, setTitle] = useState('제목');
return <div>{title}</div>;
};
1)title이라는값이있다.이title은setTitle을통해변경할수있다.
2)setTitle을호출하면MyComponent는render의목록에들어간다.
3)render목록에서현재프레임에표시되어야할값을계산한다.
4)이전과비교해서필요한부분만변경한다.
React의core가하는일은tree간의비교를효율적으로수행하는것
따라서
React와
컴포넌트,상태관리등tree관리에필요한기능.(reconciliation)
ReactDOM이분리되어있고,
DOM에렌더링하는기능-render
Reactnative와같은파생라이브러리도등장할수있는것
좀더깊은내용...
React의핵심은Reconciliation
Reconciliation알고리즘
Recursive
Recursive는
쪼갤수없다
어떻게하면singlethread환경에서부드러운UI를표현할수있을까?
ReactFiber
ReactFiber에서Rendering의두단계
1.renderphase
무엇이더해질지,빠질지,변경될지결정하는단계
DOM에는아무런영향을끼치지않음
asynchronous.
interrupt가가능하다
2.commitphase
실제로그리는단계
synchronous
1.Lifecyclemethodscalledduringrenderphase:
UNSAFE_componentWillMount()
UNSAFE_componentWillReceiveProps()
getDerivedStateFromProps()
shouldComponentUpdate()
UNSAFE_componentWillUpdate()
render()
2.Lifecyclemethodscalledduringcommitphase:
getSnapshotBeforeUpdate()
componentDidMount()
componentDidUpdate()
componentWillUnmount()
Fiber
renderphase에서tree간비교를위한자료구조.마치react만의thread
splitable,prioritize,rebase,andreuseworkinprogress
child,sibling,return(parent)의ref를가지는mutablelinkedlist
비선점형멀티태스킹(cooperativescheduling,Mozilla의Quantum에서영향을받았다고함)
두컨텍스트(current와workinprogress)의fibertree를통해비교수행
linkedlist기반의DFS를수행
Fiber의구조,Fiber의스케쥴러
끝
참고자료
https://velopert.com/3236
https://www.bsidesoft.com/8267
https://www.youtube.com/watch?v=ZCuYPiUIONs
https://indepth.dev/posts/1007/the-how-and-why-on-reacts-usage-of-linked-list-in-
fiber-to-walk-the-components-tree
https://dzone.com/articles/understanding-of-react-fiber-architecture

More Related Content

PDF
클로져 소개 강의 (한국정보통신산업노동조합)
PDF
Project anarchy로 3d 게임 만들기 part_5_waste of time shoveling
PPT
Clojure development environment
PPTX
Clojure programming study_00
PDF
Django의 배신(주니어 개발자의 Django 삽질기)
PDF
스타트업 인턴 개발자 3달간의 고군분투기 김은향
PDF
Docker registry swift_junojunho
PPTX
모바일 크로스플랫폼 비교 - 월간슬라이드 4월
클로져 소개 강의 (한국정보통신산업노동조합)
Project anarchy로 3d 게임 만들기 part_5_waste of time shoveling
Clojure development environment
Clojure programming study_00
Django의 배신(주니어 개발자의 Django 삽질기)
스타트업 인턴 개발자 3달간의 고군분투기 김은향
Docker registry swift_junojunho
모바일 크로스플랫폼 비교 - 월간슬라이드 4월

What's hot (20)

PDF
[부스트캠프 Tech Talk] 김동현_리팩터링을 통한 내실 다지기
PDF
Project anarchy로 3d 게임 만들기 part_2_vforge피하기
PDF
대신 귀여운 리눅스를 드리겠습니다
PDF
파이콘 한국 2015 디자인 후기
PPTX
C++과 Lua script연동
PPTX
PHP와 함께 한 개발 성장기
PDF
WTM 2018 2개월차 신입 백엔드 개발자의 따끈따끈 개발 썰
PDF
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
PDF
개발하긴 싫지만 코딩은 하고싶어
PDF
온라인 게임 처음부터 끝까지 동적언어로 만들기
PDF
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
PPTX
MFC 발견 (1)
PDF
PDF
M5 6 1
PDF
C++ try catch 어디까지 가봤니
PDF
격변하는 프로그래밍 언어, 이제는 Let it go
PDF
라이트닝 토크 2015 파이콘
PDF
Ruby_01_Ruby Basic
PDF
Doxygen 사용법
PDF
Slack과 Rust로 Amazon ECS에서 서비스 배포하기
[부스트캠프 Tech Talk] 김동현_리팩터링을 통한 내실 다지기
Project anarchy로 3d 게임 만들기 part_2_vforge피하기
대신 귀여운 리눅스를 드리겠습니다
파이콘 한국 2015 디자인 후기
C++과 Lua script연동
PHP와 함께 한 개발 성장기
WTM 2018 2개월차 신입 백엔드 개발자의 따끈따끈 개발 썰
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
개발하긴 싫지만 코딩은 하고싶어
온라인 게임 처음부터 끝까지 동적언어로 만들기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
MFC 발견 (1)
M5 6 1
C++ try catch 어디까지 가봤니
격변하는 프로그래밍 언어, 이제는 Let it go
라이트닝 토크 2015 파이콘
Ruby_01_Ruby Basic
Doxygen 사용법
Slack과 Rust로 Amazon ECS에서 서비스 배포하기
Ad

Similar to React principle (20)

PDF
웹 본격적으로 배우기 전 감 잡기 - 1
PDF
Slipp 발표 자료 20151212
PDF
131 deview 2013 yobi-채수원
PDF
Ryan Dahl의 Node.js 소개 동영상 해설 by doortts
PDF
프리랜서 1년간 겪은 Go
PDF
Spring Boot 1
PPTX
회사에서 새로운 기술_적용하기
PPTX
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
PDF
JavaScript로 오픈소스를 해보자. bsJS
PDF
Javascript everywhere - Node.js | Devon 2012
PPTX
[125]react로개발자2명이플랫폼4개를서비스하는이야기 심상민
PDF
Node.js in Flitto
PDF
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
PPTX
프론트엔드 개발자
PDF
스프링 코어 강의 1부 - 봄 맞이 준비 운동
PPTX
Github? linux? 이건 뭐지?
PDF
Effective c++ chapter5 6_ 131039 신동찬
PDF
웹 Front-End 실무 이야기
PPTX
Java 그쪽 동네는
PPTX
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
웹 본격적으로 배우기 전 감 잡기 - 1
Slipp 발표 자료 20151212
131 deview 2013 yobi-채수원
Ryan Dahl의 Node.js 소개 동영상 해설 by doortts
프리랜서 1년간 겪은 Go
Spring Boot 1
회사에서 새로운 기술_적용하기
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
JavaScript로 오픈소스를 해보자. bsJS
Javascript everywhere - Node.js | Devon 2012
[125]react로개발자2명이플랫폼4개를서비스하는이야기 심상민
Node.js in Flitto
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
프론트엔드 개발자
스프링 코어 강의 1부 - 봄 맞이 준비 운동
Github? linux? 이건 뭐지?
Effective c++ chapter5 6_ 131039 신동찬
웹 Front-End 실무 이야기
Java 그쪽 동네는
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
Ad

React principle