이번 수업을 통해 최신 웹 기술과 도구에 대해 이해를 할 수 있었고, 특히 리액트 관련 성능 최적화 방법에 대해 깊이 있게 배웠다. 내일부터 본격적으로 배우게 될 Tailwind와 리액트가 기대된다.
Node.js의 기본 패키지 관리자
📍패키지(package): 소프트웨어 개발에서 재사용할 수 있도록 묶어놓은 코드의 집합, 특정 기능이나 기능 세트를 구현한 라이브러리, 프레임워크, 도구 등을 포함할 수 있음
.npmrc
파일을 통해 설정 가능package-lock.json
파일을 사용하여 패키지 버전을 고정Node 패키지를 실행하는 도구
📍개발 의존성(Development Dependency): 개발 과정에서 필요한 도구와 라이브러리로, 애플리케이션의 실제 배포 및 실행에는 필요하지 않음, 개발 의존성을 줄이는 것은 프로젝트의 복잡성을 줄이고, 빌드 및 배포 과정을 최적화하며, 보안을 강화하고, 유지보수 비용을 절감하는 데 중요한 역할을 함
페이스북에서 개발한 패키지 매니저
최신 패키지 매니저 중 Bun과 PNPM이라는 것도 있음
출처: NPM vs Yarn vs PNPM: Which Package Manager is Right for You?
package-lock.json
파일은 npm install
시 자동으로 생성 되므로 .gitignore
파일에 추가 하자npm install
: package.json
파일을 참고해서 node_modules
, package-lock.json
을 자동으로 생성함가장 고전적인 방법, 더이상 권장되지 않음
npx create-react-app my-app
-> (npm 레지스트리의 최신 버전 실행)
npm install -g creact-react-app
-> (npm 레지스트리의 최신 버전 설치)
create-react-app my-app
-> (설치 당시의 버전 실행)
create-react-app
버전이 시간이 지남에 따라 최신 상태가 아닐 수 있으므로 수동 업데이트하지 않는 한 새로운 버그 수정이나 기능 업데이트를 놓칠 수 있음근래에 가장 주목 받고 있는 프로젝트 생성 방법
npm create vite@latest
npm create
명령어는 내부적으로 npx 패키지를 활용하여 프로젝트를 생성해주기 때문에 항상 최신의 버전의 패키지를 사용함node_modules/
:
npm install
명령어 통해 package.json
파일에 명시된 모든 의존성을 이 폴더에 설치함public/
:
src/
:
assets/
: 이미지, 폰트 등의 정적 자산을 포함할 수 있는 폴더, public/
과 달리 웹팩의 영향을 받음App.jsx
: 메인 애플리케이션 컴포넌트 파일, React 컴포넌트 구조의 시작점main.jsx
: 애플리케이션의 진입점 파일, ReactDOM
을 사용하여 App
컴포넌트를 HTML에 렌더링함index.html
:
public/
또는 최상위 디렉토리에 있는 HTML파일package.json
vite.config.ts
리액트를 가장 인기있는 프레임워크로 만들어 준 핵심 기능
React는 SPA 구조에서 빈번한 DOM 조작으로 인한 성능 문제를 해결하기 위해 가상 돔을 사용함
웹 페이지가 사용자에게 표시되기까지의 과정. CRP는 페이지 로드 성능에 중요한 영향을 미침
HTML 파싱 및 DOM 생성: 브라우저는 HTML 문서를 파싱하여 DOM(Document Object Model)을 생성함
CSS 파싱 및 CSSOM 생성: CSS 스타일시트를 파싱하여 CSSOM(CSS Object Model)을 생성함
JavaScript 실행: JavaScript는 DOM이나 CSSOM을 수정할 수 있으며, 이를 통해 렌더링에 영향을 줄 수 있음
렌더 트리 생성: DOM과 CSSOM을 결합하여 렌더 트리를 생성, 이 트리는 실제로 렌더링할 요소만 포함함
레이아웃: 렌더 트리를 기반으로 각 요소의 크기와 위치를 계산함
페인팅: 최종적으로 계산된 정보를 사용하여 화면에 픽셀을 그림
Reflow와 Repaint: 페이지 이동이나 JavaScript 조작으로 CRP가 다시 발생하며, Reflow와 Repaint는 성능 비용이 큼. 따라서 이를 최적화하는 것이 중요함
<li>
요소를 추가할 때마다 Reflow와 Repaint가 1000번 발생함 -> 성능 저하<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script>
function createDOM() {
console.time();
const ulEl = document.querySelector('ul');
for (let i = 0; i < 1000; i++) {
ulEl.innerHTML += `<li>${i}</li>`;
}
console.timeEnd();
}
</script>
</head>
<body>
<button onClick="createDOM()">추가</button>
<ul></ul>
</body>
</html>
<li>
요소를 한 번에 추가하여 Reflow와 Repaint를 한 번으로 줄임<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script>
function createDOM() {
console.time();
const ulEl = document.querySelector('ul');
let liEl = '';
for (let i = 0; i < 1000; i++) {
liEl += `<li>${i}</li>`;
}
ulEl.innerHTML = liEl;
console.timeEnd();
}
</script>
</head>
<body>
<button onClick="createDOM()">추가</button>
<ul></ul>
</body>
</html>
JavaScript만으로 최적화하는 과정은 복잡하고 어렵기 때문에 React와 같은 프레임워크가 등장함
프레임워크는 이런 최적화를 자동으로 처리할 수 있으며, React는 Virtual DOM을 사용하여 효율적으로 DOM을 조작함
출처: What is Diffing Algorithm ? - GeeksforGeeks
Batch Update는 무엇인가?
Virtual DOM도 성능 비용이 있으며 React는 내부적으로 이러한 성능을 최적화하지만, 모든 경우에 완벽한 최적화를 보장하지는 않음
createElement
함수를 사용해서 모든 React 컴포넌트와 엘리먼트 생성 가능createElement
를 사용해 모든 요소를 수동으로 작성함import React from 'react';
import ReactDOM from 'react-dom';
// React.createElement를 사용하여 컴포넌트 정의
const element = React.createElement(
'div', // 태그 이름
{ className: 'greeting' }, // 속성
'Hello, world!' // 자식 요소(내용)
);
// 해당 컴포넌트를 DOM에 렌더링
ReactDOM.render(
element,
document.getElementById('root')
);
createElement
를 사용하는 방식은 번거롭고 가독성이 떨어짐
페이스북 팀은 개발자들이 더 익숙한 HTML과 유사한 문법을 사용해 React 컴포넌트를 작성할 수 있는 JSX를 도입
JSX는 개발 편의성을 크게 높였고, React의 채택을 가속화하는 데 중요한 역할을 함
JSX는 브라우저에서 직접 실행할 수 없는 문법이기 때문에, Babel과 같은 트랜스파일러가 필요함
React.createElement
호출로 변환하므로 JSX와 React.createElement
는 서로 상호 보완적인 관계에 있음react-scripts
패키지(스크립트 모음으로, 프로젝트를 설정하고 관리하는 데 필요한 웹팩, 바벨과 같은 스크립트가 포함되어 있음)@vitejs/plugin-react(-swc)
(웹 팩과 바벨의 역할을 하는 패키지)주요 문법 특징
<React.Fragment>
또는 <></>
를 사용할 수 있음{}
를 사용하여 JavaScript 표현식을 포함할 수 있음 예를 들어, <h1>Count: {10 * 2}</h1>
와 같이 작성할 수 있음리액트에서 컴포넌트에 CSS 스타일을 적용하는 방법에는 여러 가지가 있음
컴포넌트의 JSX 내에서 style
속성을 통해 직접 스타일을 지정하는 방법
const App = () => {
return (
<div>
<h1 style={{ fontSize: "30px", color: "#ed4848", textDecoration: "line-through" }}>
Hello World!
</h1>
</div>
);
};
export default App;
별도의 CSS 파일에 CSS 코드를 작성하고, 리액트 컴포넌트 파일과 연결해서 사용하는 방법
main.tsx
와 같은 파일에 import
함각 클래스 이름을 로컬 범위로 한정시켜 스타일 충돌을 방지하는 방법
.module.css
확장자를 사용하며, 컴포넌트에서 import
하여 사용함대표적인 Atomic CSS 라이브러리, 클래스 이름만으로 스타일을 적용할 수 있음
CSS-in-JS는 자바스크립트 파일 내에서 스타일을 정의하고, 컴포넌트와 밀접하게 결합하여 사용하는 방법
리액트에서 말하는 서버는 뭘까?
런타임 오버헤드란?
dependency vs devDependency
——————————————————————————
본 후기는 본 후기는 [유데미x스나이퍼팩토리] 프로젝트 캠프 : Next.js 2기 과정(B-log) 리뷰로 작성 되었습니다.