[템플릿]
타입 스크립트 기반 개발을 위해서 다음과 같이 템플릿 지정
yarn create react-app 프로젝트명 --template typescript
[코딩 서식]
2개의 플러그인을 설치
Prettier, ESLint
Prettier는 code formatter로 사용자의 코딩 스타일 설정이 가능
예) 탭을 눌렀을 때 깊이를 2로 설정
ESLint는 linter로 코딩 컨벤션에 위배되는 코드나 안티 패턴을 자동으로 검출
예) 사용 되지 않은 변수, 잘못 입력된 공백 또는 데이터 등을 검출
[ESLint 설정]
다음 명령어로 설정 커맨드 진행 가능
npx eslint --init
입력후 나오는 여러개의 선택지 중 다음 질문에 무조건 yes를 해야함(다른건 알아서)
Does your project use TypeScript? (y/N)
The config that you've selected requires the following dependencies:
@typescript-eslint/eslint-plugin@latest @typescript-eslint/parser@latest
Would you like to install them now with npm? (Y/n)
다음은 질문에서 Y 선택 시 자동 설치되는 부가 플러그인들
eslint-config-airbnb-base: 리액트를 제외 적용 규칙
eslint-config-airbnb: 리액트 관련 적용 규칙
eslint-plugin-react: React 규칙이 들어있는 플러그인
eslint-plugin-react-hooks: React Hook 규칙이 들어있는 플러그인
eslint-plugin-jsx-a11y: JSX 요소의 접근성 규칙에 대한 정적 검사 플러그인
eslint-plugin-import: ES6의 import, export 구문을 지원하는 플러그인
eslint-plugin-prettier: ESLint를 Prettier와 혼용하기 위한 플러그인
eslint-config-prettier: Prettier 규칙을 ESLint에 통합하여 Prettier와 상충되는 ESLint 설정을 비활성화
프로젝트에 추가 된 eslintrc.json파일을 다음과 같이 수정
module.exports = {
parser: '@typescript-eslint/parser', // 각 코드를 검사할 파서를 등록
plugins: ['@typescript-eslint', 'prettier'],
extends: [
'airbnb', // or airbnb-base
'plugin:react/recommended',
'plugin:jsx-a11y/recommended', // 설치 한경우
'plugin:import/errors', // 설치한 경우
'plugin:import/warnings', // 설치한 경우
'plugin:@typescript-eslint/recommended',
'plugin:prettier/recommended',
],
rules: {
'linebreak-style': 0,
'import/prefer-default-export': 0,
'import/extensions': 0,
'no-use-before-define': 0,
'import/no-unresolved': 0,
'react/react-in-jsx-scope': 0,
'import/no-extraneous-dependencies': 0, // 테스트 또는 개발환경을 구성하는 파일에서는 devDependency 사용을 허용
'no-shadow': 0,
'react/prop-types': 0,
'react/jsx-filename-extension': [
2,
{ extensions: ['.js', '.jsx', '.ts', '.tsx'] },
],
'jsx-a11y/no-noninteractive-element-interactions': 0,
'@typescript-eslint/explicit-module-boundary-types': 0,
},
settings: {
'import/resolver': {
node: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
},
},
},
};
프로젝트에 .prettierrc 파일을 추가하고 내용을 다음과 같이 작성
{
"singleQuote": true,
"semi": true,
"useTabs": false,
"tabWidth": 2,
"trailingComma": "all",
"printWidth": 80,
"arrowParens": "always",
"orderedImports": true,
"bracketSpacing": true,
"jsxBracketSameLine": false
}
prettier 플러그인 설정에서 config 파일을 open해 전역 설정을 다음과 같이 수정
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"window.zoomLevel": -1,
"editor.formatOnSave": true,
"[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
"[javascriptreact]":{ "editor.defaultFormatter": "esbenp.prettier-vscode" },
"[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
"[typescriptreact]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }
}
[프로젝트에 적용 될 디자인 패턴]
Atomic Design Pattern
참고용 github
https://github.com/diegohaz/arc
[패키지]
react-router-dom : 리엑트 라우팅을 위해 사용
redux: 전역 상태를 관리하기 위한 패키지
@reduxjs/toolkit: redux를 좀더 쉽게 사용하기 위해 도입
recoil: 리덕스의 단점을 보완해 리덕스를 대체해 전역 관리를 하기 위해 도입(리덕스
는 학습용으로 도입)
react-query: API 통신과 값 캐싱을 위해 도입
리덕스는 toolkit 사용시 API 요청을 미들웨어에서 하도록 강제하기에 구조 고민이 필요 없음.
recoil은 미들웨어 개념이 없기에 어디서 처리를 할지 구조적으로 고민을 해야함
리덕스로 정보를 다 접근하는 형식 대신, 일부 중요하지 않지만 다시 접근할 가능성이 있는 데이터의 경우 react-query를 통해 접근해 캐싱을 하면 다시 조회시 지연없이 조회 가능
[미들웨어]
redux-logger: 액션을 타고 일어난 리듀서 동작을 log로 보여줌
redux-thunk: 액션객체가 아닌 함수를 디스패치 할 수 있게 해줌
redux-devtools-extension: 크롬 개발자 도구에서 리액트 동작 상태를 확인 가능
redux-devtools-extension 사용을 위해 크롬 확장 프로그램에서 Redux DevTools 설치 필요
[ui]
@mui/material @mui/icons-material @emotion/react @emotion/styled
styled-components
[테스팅]
@testing-library/react
storybook