최소한의 변경으로 여러곳에서 재사용되며, 반복적으로 비슷한 형태를 띄는 코드
- React
- Typescript
- vite
- eslint
- prettier
- react-router-dom
- styled-components
- recoil
다음과 같은 기술스택을 가진 리액트 프로젝트 보일러플레이트를 생성하여 재사용성을 높여보자!
yarn create vite [프로젝트 명] --template react-ts
or
npm create vite@latest [프로젝트 명] --template react-ts
eslint, prettier, typescript 설치
npm install --save-dev eslint prettier typescript
typescript에서 eslint를 사용하기 위한 플러그인 설치
npm install --save-dev @typescript-eslint/eslint-plugin @typescript-eslint/parser
eslint, prettier를 동시에 사용하기 위한 플러그인 설치
npm install --save-dev eslint-config-prettier eslint-plugin-prettier
airbnb 스타일의 eslint 설정
npm install --save-dev eslint-config-airbnb-base # 리액트 관련 규칙 X
npm install --save-dev eslint-config-airbnb # 리액트 관련 규칙 O
리액트를 사용하는 경우 추가적인 플러그인 필요!
React 규칙이 들어있는 플러그인 : eslint-plugin-react
React Hooks 규칙이 들어있는 플러그인 : eslint-plugin-react-hooks
JSX 요소의 접근성 규칙에 대한 정적 검사 플러그인 : eslint-plugin-jsx-a11y
ES6의 import, export 구문을 지원하는 필수 플러그인 : eslint-plugin-import
// .prettierrc
{
"singleQuote": true,
"parser": "typescript",
"semi": true,
"useTabs": false,
"tabWidth": 2,
"trailingComma": "all",
"printWidth": 120,
"arrowParens": "always"
}
singleQuote : quote를 single로 사용할지, double로 사용할지 결정
semi : 명령문 마지막에 semiclons를 붙일지 말지의 여부
quoteProps : 객체 안에 key의 따옴표를 quote를 감싸지 않으면 안되는 문자가 있을때만 사용
useTabs : 공백 대신 탭으로 줄을 들여 쓸지에 대한 여부를 물어본다.
printWidth : 라인의 최대 길이 설정으로 120으로 설정했다.
tabWidth : 들여쓰기의 칸 수를 말하며 2칸으로 설정했다.
arrowParens : 화살표 함수에서 매개변수를 항상 괄호로 감싸도록 설정했다.
// .eslintrc.js
module.exports = {
parser: '@typescript-eslint/parser',
plugins: [
'@typescript-eslint',
//'react-hooks' // eslint-plugin-react-hooks 설치한 경우
],
extends: [
'airbnb-base', // or airbnb
// 'plugin:react/recommended', // eslint-plugin-react 설치한 경우
// 'plugin:jsx-a11y/recommended', // eslint-plugin-jsx-a11y 설치한 경우
// 'plugin:import/errors', // eslint-plugin-import 설치한 경우
// 'plugin:import/warnings', // eslint-plugin-import 설치한 경우
'plugin:@typescript-eslint/recommended',
'plugin:prettier/recommended',
],
rules: {
'prettier/prettier': 0,
},
settings: {
'import/resolver': {
node: {
extensions: [
'.js',
// '.jsx',
'.ts',
// '.tsx',
],
},
},
},
};
npm install react-router-dom @types/react-router-dom
import { BrowserRouter, Routes, Route } from 'react-router-dom';
function App() {
return (
<div>
<BrowserRouter>
<Routes>
<Route path="/" element={<div></div>}></Route>
</Routes>
</BrowserRouter>
</div>
);
}
export default App;
npm install styled-components @types/styled-components
npm install recoil
// .svg 확장자의 파일에서 ReactComponent의 존재를 인식시켜 주는 부분
declare module '*.svg' {
import React = require('react');
export const ReactComponent: React.FC<React.SVGProps<SVGSVGElement>>;
const src: string;
export default src;
}
npm i vite-plugin-svgr
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import svgr from 'vite-plugin-svgr';
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react(), svgr()],
});