[React]React란?
- React : A library for creating user interfaces.
리액트는 왜쓰는가?
- Jquery 이후 SPA(Single Page Application)기반의 Backbone과 AngularJS 등장
- 이 후 React 등장 : React는 Angular와 같은 프레임워크가 아닌
라이브러리
- Router와 같은 웹 개발을 위한 도구들이 기본적으로 포함되어 있지 않음.- But, 그 대신 가볍고 빠르게 기술 습득 가능.
리액트 특징
1. Component
- Component : UI를 구성하는 개별적인 뷰 단위
- 전체 application은 component들의 결합
- 각 component들은 다른 앱에서 재사용 가능
- React의 목표는 성능보다 유지가능한 앱을 만드는 것 –> Component 덕분에 가능
2. JSX
class Square extends React.Component {
render() {
return (
<button className="square"></button>
);
}
}
class Game extends React.Component {
render() {
return(
<div className="game">
<Square />
</div>
);
}
}
// =====================
ReactDOM.render(
<Game />,
document.getElementById('root')
);
- React 코드는 컴파일 과정 필수. JSX의 경우 Babel을 이용한 컴파일 과정을 거쳐 일반 javascript 코드로 변형. - Babel 트랜스파일러을 통한 컴파일이 주로 사용됨.
Babel
: ES6를 사용할 때, ES5 문법으로 변환해주는 변환장치. 구 버전 브라우저 혹은 IE를 위한 변환 작업 수행- React는 Babel 과 같은 트랜스파일러가 필수이기 때문에 Webpack과 같은 모듈 번들러 등의 초기 세팅이 번거로울 수 있음
- 그렇다면 왜 이런 번거로운 세팅 과정을 거쳐야 하나?
- 선언형(Declarative)의 장점
- html의 형태와 비슷한 JSX는 개발자가 만들고자 하는 view에 직관적으로 접근하는 것을 가능하게 해줌.
- 선언형(Declarative)의 장점
3. Virtual DOM
- DOM?
- Document Object Model : 웹페이지에 대한 인터페이스. HTML요소들의 구조화된 표현.
- 단순히 브라우저에서 보이는 것이 DOM은 아니다. DOM은 display:none 속성을 가질 수도 있고, javascript 소스를 통해 새로운 DOM 객체가 생성, 수정, 삭제될 수 있기 때문이다.
class HelloMessage extends React.Component {
render() {
return (
<div>
<div> Hello {this.props.name}</div>
<div>I am {this.state.chatName}</div>
</div>
);
}
}
- this.props.name 또는 this.state.chatName 중 하나의 값이 바뀔때마다 브라우저에서 DOM을 변형한다면 성능 상 비효율이 발생할 수 있음
- React는 이러한 작업에 대한 최적화를 위해 virtual DOM을 사용.
- React 컴포넌트는 render를 다시 호출해 새로운 결과값을 return.
- return 값이 바로 DOM에 반영되지 않음.(브라우저에 렌더링 되지 않음)
- 새로운 결과값은 virtual DOM으로 만들어지고 현재 브라우저에서 표출되고 있는 DOM과 비교해 차이점을 탐색.
- 차이점만 DOM에 적용.
- 결과적으로 브라우저가 처리하는 연산의 양 감소
- 그렇다면 React가 DOM보다 빠르다?
- React의 목적은 유지보수가 가능한 어플리케이션을 만드는 것을 위한 라이브러리. React의 속도는 enough fast, 즉 유지보수가 가능한 앱 개발을 위한 충분한 속도를 제공하다는 것.
※유의 사항 : React가 무조건 효율적인 것은 아니다. 최적화 작업이 수반되지 않는다면 오히려 퍼포먼스가 떨어질 수 도 있음
1. Hello World
ReactDOM.render(
<h1>Hello world!</h1>,
document.getElementById('root')
);
Reference: