webpack
node.js
express server
source build
process.env.KEY
HMR
process.env.KEY : 환경설정, 환경 변수를 사용하는 방법ESBuild
Golang
koa server
module build
import.meta.env.KEY
HMR
import.meta.env.KEY : 환경 변수를 다룰 때도 차이가 있음npx create-react-app book-store-c --template typescript
# 설치 후 아래 명령 사용 시 개발 서버 실행됨
cd book-store-c
npm run start
위 명령어를 통해 프로젝트를 위한 기본 코드를 받아오고 node module도 설치함
이 과정에서 우리가 사용할 react와 react-dom, react-scripts 같은 프로젝트에서 사용하는 도구들을 같이 설치하게 됨
npm create vite@latest book-store-v -- --template react-ts
cd book-store-v
npm i
npm run dev
# 개발 서버 실행
필요에 따라 수정 또는 추가될 수 있음.
// 생략
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
}
//생략
start : npm run start 명령으로 개발 서버를 실행함
build : npm run build 명령을 실행하면 build라는 폴더가 생성됨
index.html : public 폴더 안에 있는 index.html 파일이 압축되고 필요없는 부분들이 제거된 파일이 제공됨. 이 파일 안에 만들 react application이 라우트 됨static : 라우트되는 함수 이하의 코드들이 저장됨js : 타입스크립트로 작성된 app을 자바스크립트로 컴파일하고 bundling해서 만들어진 파일들
test : npm run test 명령을 실행하면 app 안에 작성한 테스트 등의 파일을 구동시켜서 test 파일을 실행해줌
eject : 기존에 웹페이지를 만들어놓은 설정들을 탈출한다는 뜻
"typecheck": "tsc --noEmit --skipLibCheck"
우리는 현재 타입스크립트를 이용한 리액트를 쓰고 있다. 따라서 수시로 타입체크가 필요하다. script에 위 코드를 추가해준다
--skipLibCheck{
"compilerOptions": {
"target": "es5",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noFallthroughCasesInSwitch": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx"
},
"include": [
"src"
]
}
"target": "es5"사용자에게 일관적인 UI를 제공하기 위해서 header와 footer 같은 통일된 UI를 제공하는 것이 일반적인 레이아웃의 역할임. 그러나 많은 수의 웹 프로젝트들은 유동적인 레이아웃을 가지고 있음. 따라서 레이아웃 컴포넌트가 필요함. 이러한 레이아웃을 제공하는 전략은 두 가지가 있는데, 첫 번째는 화면마다 헤더와 푸터 등 공통된 컴포넌트들을 넣어주는 방법이다. 두 번째가 레이아웃을 만드는 방법이다.
import Footer from "../common/Footer";
import Header from "../common/Header";
interface LayoutProps {
children: React.ReactNode;
}
function Layout({children}: LayoutProps) {
return (
<>
<Header />
<main>{children}</main>
<Footer />
</>
)
}
export default Layout;
여기서 ReactNode라는 타입은 react로 만든 모든 컴포넌트들이 배치될 수 있다고 선언하는 것임.
npm install sanitize.css --save
save로 패키지에도 저장함
최근 가장 많이 사용되는 CSS in JS. 웹 개발을 하면서 CSS로 해결할 수 없는 몇 가지 문제가 있는데, 이를 위함
1️⃣
h1 {
font-size: 30px;
}
/* 모든 h1 엘리먼트에 적용됨 */
.box h1 {
font-size: 30px;
}
<div class="box">
<h1>Box Title</h1>
</div>
/* .box 하위에 있는 h1에만 적용됨 */
2️⃣
.wrapper h1 {
font-size: 50px;
}
<div class="wrapper">
<h1>Wraaper Title</h1>
<div class="box">
<h1>Box Title</h1>
</div>
</div>
/* 여기서 "Box Title"은 어떻게 렌더링 될까요? */
3️⃣
<div className="toggle ${isActive ? 'active' : ''}">
보여질 내용
</div>
/* 전달해야 할 상태가 여러개라면? */
.toggle {
display: none;
}
.toggle.active {
display: block;
}
4️⃣
<link rel="stylesheet" href="리셋.css" />
<link rel="stylesheet" href="라이브러리1.css" />
<link rel="stylesheet" href="라이브러리2.css" />
<link rel="stylesheet" href="우리프로젝트코드.css" />
/* 어떤 것이 우선일까? */
이렇듯 CSS만으로는 스타일의 상태를 적용하기가 어렵고, 의도하지 않은 결과들이 나올 수 있음
이러한 css의 이슈들을 해결하기 위해 CSS in JS를 사용함
Button, DATE Packer, Modal 등은 각각 JS, CSS, HTML이 같은 곳에 모여있거나 또는 영향을 주고 받는 상태를 캡슐화하여 상태 공유를 제한하는 것이 좋음
이 목적하에서 styled component 적용함
styled component를 아래 명령어로 설치한다
npm install styled-components --save
createContext를 이용하여 context 틀을 만듦. context는 wrapper로 생각하면 됨. Provider 하위의 컴포넌트들이 이를 구독하고 언제든지 꺼내쓸 수 있음. (useContext라는 hook을 사용함)