패스트캠퍼스 한 번에 끝내는 프론트엔드 개발(Online) 강의 정리
npx create-react-app tic-tac-toe
(npx : npm 5.2.0 이상부터 함께 설치된 CLI)
{
"name" : "tic-tac-toe",
"version" : "0.1.0",
"private" : true,
"dependencies" : {
"@testing-library/jest-dom" : "^5.12.0", // test용 라이브러리
"@testing-library/react" : "^11.2.6", // test용 라이브러리
"@testing-library/user-event" : "^12.8.3"m, // test용 라이브러리
"react" : "^17.0.2", // 핵심모듈 라이브러리
"react-dom" : "^17.0.2", // 핵심모듈 라이브러리
"react-scripts" : "4.0.3", // CRA의 라이브러리
"web-vitals" : "^1.1.2" // 구글 사이트경험 향상 측정/개선 라이브러리
},
"scripts" : {
"start" : "react-scripts start",
"build" : "react-scripts build",
"test" : "react-scripts test",
"eject" : "react-scripts eject"
}
}
module.exports = {
env: {
browser: true,
es2021: true,
},
extends: "eslint:recommneded",
parserOptions: {
ecmaVersion: 12,
},
rules: { // 프로젝트에 대한 규칙 생성 가능
semi: {"error", "always"} // 세미콜론 안 찍으면 항상 에러로 체크하도록
},
};
{
"eslintConfig" : {
"extends" : [
"react-app", // 앞에 "eslint-config"가 생략된 것
"react-app/jest"
]
}
}
node_modules/eslint-config-react-app에서도 변경 가능
https://tech.kakao.com/2019/12/05/make-better-use-of-eslint/
.prettierrc.json
{
"singleQuote" : true
}
{
"scripts" : {
"prepare" : "husky install",
"test": "echo \"Error: no test specified\" && exit 1"
},
"devDependencies" : {
"husky" : "^6.0.0"
}
}
#!\bin\sh
. "$(dirname "$0")/_/husky.sh"
npm test
https://www.huskyhoochu.com/npm-husky-the-git-hook-manager/
https://library.gabia.com/contents/8492/
{
"scripts": {
"precommit": "lint-staged"
},
"lint-staged" {
"*.js": [
"eslint --fix",
"git add"
]
}
}
{
"*.js": "eslint",
"**/*.js": "eslint",
"src/*.js": "eslint",
"src/**/*.js": "eslint",
}
커밋 워크플로우 훅을 사용하면 커밋을 할 때마다
반복적으로 해야 하는 일들을 손쉽게 자동화할 수 있습니다.commit workflow hook
- pre-commit 커밋 메시지를 작성하기 전에 호출됨
- prepare-commit-msg 커밋 메시지 생성 후 편집기 실행 전에 호출됨
- commit-msg 커밋 메시지와 관련된 명령을 넣을 때 호출됨
- post-commit 커밋이 완료되면 호출됨
https://www.huskyhoochu.com/how-to-use-lint-staged/
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
// main
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>
document.getElementById('root')
);
reportWebVitals();
import logo from "./logo.svg";
import "./App.css";
function App() {
return(
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a className="App-link" href="https://reactjs.org" target="_blank" rel="noopener noreferrer">Learn React</a>
</header>
</div>
);
}
React Developer Tools
를 사용하게 되면, 크롬 웹에서 개발자 모드로 컴포넌트(Components) 구조를 볼 수 있고 변경하면서 테스트하기 용이하다.
https://byul91oh.tistory.com/424
리액트에서 렌더링을 이해하는 것이 매우 중요
렌더링 : 리액트 엘리먼트를 html 형태로 변환하여 화면에 그려지는 것
(데이터를 화면에 그려주는 것)
왜 렌더링을 이해해야 할까?
1,000개의 데이터를 나열하는 컴포넌트와
100개의 데이터를 나열하는 컴포넌트가 있다고 가정해봅시다.
만약 100개의 데이터에 101개로 추가되어 다시 그려진다고 했을 때
1,000개의 데이터를 나열하는 컴포넌트는 변화가 없기 때문에
다시 렌더링할 필요가 없습니다.
만약 같이 렌더링이 된다면 낭비가 발생합니다.
이러한 이유 때문에 우리는 렌더링이 언제 일어나는지 반드시 알아야 하고
원하는 컴포넌트만 렌더링할 수 있도록 만들어야 합니다.
https://m.blog.naver.com/pjt3591oo/221907792621
(이전 ch의 컴포넌트의 라이프사이클 중 업데이트 개념 참조)
디버깅 툴을 통해 리액트의 데이터흐름을 볼 수 있는데, 이를 통해 우리가 리액트를 사용하여
스크립트로 작성한 컴포넌트의 구조 확인해 변경하면서 테스트하기 용이해짐