책 '실전 리액트 프로그래밍'의 1장을 읽고 학습 목적으로 정리한 내용입니다.
3
- 리액트는 UI 기능만 제공한다.
- 따라서 전역 상태 관리, 라우팅, 빌드 시스템 등을 각 개발자가 직접 구축해야 한다.
- 진입장벽을 낮추기 위해, create-react-app을 이용하면 하나의 명령어로 리액트 개발 환경을 구축할 수 있다.
- 프런트엔드 라이브러리(또는 프레임워크)를 사용하는 이유는 무엇일까?
- 가장 큰 이유 중 하나는 UI를 자동으로 업데이트해주기 때문이다.
- UI = render(state)
- 이런 도구를 사용하지 않으면 브라우저의 돔을 직접 업데이트 해야 하고, 돔을 직접 업데이트하는 코드는 잘 관리하지 않으면 프로그램이 커질수록 복잡도가 기하급수적으로 커진다.
- 리액트의 장점
- 가상 돔을 통해서 UI를 빠르게 업데이트한다는 점이다.
- 가상 돔
- 이전 UI 상태를 메모리에 유지해서, 변경될 UI의 최소 집합을 계산하는 기술이다. 가상 DOM 덕분에 불필요한 UI 업데이트는 줄고, 성능은 좋아진다.
- 함수형 프로그래밍을 적극적으로 활용한다
- render 함수는 순수함수로 작성한다
- 인수 state가 변하지 않으면 항상 같은 값을 반환해야 한다.
- state(리액트의 props와 state)는 불변 변수로 관리한다
- 컴포넌트의 상탯값을 수정할 때는 기존 값을 변경하는 게 아니라 새로운 객체를 생성해야 한다.
- 장점
- 이와 같이 하면 복잡도가 낮아지고, 찾기 힘든 버그가 발생할 확률이 줄어든다.
- 렌더링 성능을 크게 향상시킬 수 있다.
- 리액트 네이티브
- 리액트 개발 자바스크립트 파일 중 react.js는 플랫폼 구분 없이 리액트 네이티브 등을 통해 모바일에서도 공통으로 사용되는 리액트의 핵심기능을 담고 있으며, react-dom.js는 웹에서만 사용되는 파일이다.
- 웹 앱을 개발할 때 사용되는 리액트 패키지(react.js)가 리액트 네이티브에서도 그대로 사용된다. 웹에서의 react-dom 역할을 하는 리액트 네이티브 코드가 별도로 존재한다.
- 다만, 인앱 구매나 푸시 알림과 같이 플랫폼에 종속적인 기능을 사용하기 위해서는 플랫폼별로 코드를 작성해야 한다.
- JavaScriptCore
- 이는 웹킷에 내장되었으며 C++로 작성된 자바스크립트 엔진이다.
- 리액트 네이티브는 모바일에서 자바스크립트를 실행하기 위해 JavaScriptCore를 사용한다.
- 대부분의 모바일 운영체제는 JavascriptCore를 앱 빌드 시 포함함으로써 Js 실행환경을 제공한다.
- 가상 돔
- 리액트의 가상 돔은 웹뿐만 아니라 리액트 네이티브에서도 동작한다.
- 가상 돔은 데이터가 변경됐을 대 UI에서 변경된 부분을 빨리 찾기 위해 사용되는
범용적인 자료구조
다.- 바벨
- 바벨은 자바스크립트 코드를 변환해 주는 컴파일러다.(JS를 입력으로 받아 다른 JS 파일을 출력)
- 바벨을 사용하면 최신 JS 문법을 지원하지 않는 환경에서도 최신 문법을 사용할 수 있다.
- 코드에서 주석을 제거하거나 코드를 압축하는 용도로 사용될 수도 있다.
- 리액트에서는 JSX 문법을 사용하기 위해 바벨을 사용한다. 바벨이 JSX 문법으로 작성된 코드를 createElement 함수를 호출하는 코드로 변환해 준다.
- 파일을 변환해주는 작업은
플러그인
단위로 이루어진다.
- 두 번의 변환이 필요하면 두 개의 플러그인을 사용한다. 하나의 목적을 위해 여러 개의 플러그인이 필요할 수 있는데, 이러한 플러그인의 집합을
프리셋(preset)
이라고 한다.@babel/cli
에는 커맨드 라인에서 바벨을 실행할 수 있는 바이너리 파일이 들어 있다.@babel/preset-react
는 리액트 애플리케이션을 만들 때 필요한 플러그인을 모아 놓은 프리셋이다.- createElement 함수
```jsx
React.createElement(componenet, props, ...children) => ReactElement
```
1. component는 문자열이나 리액트 컴포넌트다. 문자열이면 HTML 태그에 해당하는 돔 요소가 생성된다.
2. props는 컴포넌트가 사용하는 데이터를 나타낸다.
3. children은 해당 컴포넌트가 감싸고 있는 내부의 컴포넌트를 가리킨다.
속성값
을 작성하는 방법에 있다.npm install webpack webpack-cli
npx webpack
명령어를 실행한다.serviceWorker.register();
코드를 넣으면 된다.src폴더
밑에 있어야 한다.npm start
HTTPS=true npm start
set HTTPS=true && npm start
npm run build
npx serve -s build
npm test
__tests__
폴더 밑 JS 파일, 파일명이 .test.js
또는 .spec.js
로 끝나는 파일CI=true npm test
set "CI=true" && npm test
npm run eject
process.env.{환경 변수 이름}
으로 접근할 수 있다.NODE_ENV
환경변수의 값은 다음과 같이 결정된다.development
test
production
REACT_APP_
접두사를 붙여야 한다.process.env.REACT_APP_
형태로 접근한다.셸
에서 입력하거나 .env
파일을 이용해 입력할 수 있다.REACT_APP_API_URL=api.myapp.com npm start
set "REACT_APP_API_URL=api.myapp.com" && npm start
컴포넌트
를 중심으로 생각하는 게 좋다. UI는 컴포넌트의 조합으로 표현되며, 컴포넌트 하나를 잘 만들어서 여러 곳에 재사용하는 게 좋다. 그렇게 하기 위해서 각 컴포넌트는 서로 간의 의존성을 최소화하면서 내부적으로는 응집도
를 높여야 한다.응집도
가 높은 컴포넌트를 작성하기 위해 CSS 코드
도 컴포넌트 내부
에서 관리하는 게 좋다.css-module
, css-in-js
등이 있다.{이름}.module.css
자바스크립트에서
브라우저로 페이지 전환 요청(pushState)을 보낼 수 있다. 단, 브라우저는 서버로 요청을 보내지 않아야 한다.브라우저
의 뒤로 가기(popState)와 같은 사용자 페이지 전환 요청을 자바스크립트에서 처리할 수 있다. 이때도 브라우저는 서버로 요청을 보내지 않아야 한다.pushState
, replaceState
함수와 popState
이벤트를 사용한다. 브라우저에는 히스토리에 state를 저장하는 스택이 존재한다.
Have a good day