React 프로젝트를 생성하면 자동으로 생성되는 폴더들이 있다.
지금까지는 별 생각없이 기본 파일들을 대부분 지워 버리고 시작했었는데, 지우더라도 최소한 무엇인지 알고 어디에 필요한지 판단할 수 있도록 그 폴더와 파일들의 역할과 내용을 자세히 정리해보려고 한다.
다음 폴더 구조는 타입스크립트 템플릿과 함께 설치한 리액트 프로젝트이다.
리액트앱에서 화면이 그려지는 파일이다.
index.html 내 메타 태그들을 정리해보면 다음과 같다.
<meta name="theme-color" content="000000"/>
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}
short_name
: 공간이 부족한 경우 이름을 짧게 표시하기 위해서 만들어주는 옵션이다. 보통 메인화면에서 아이콘의 이름으로 표시된다.name
: 아이콘에 표시될 이름을 의미한다. 보통 설치 배너에 표시되며, 검색 키워드로 쓰인다.icons
: 홈 화면에 추가할 때 사용할 이미지start_url
: 웹앱 실행 시 시작되는 URL 주소display
: 디스플레이 유형 (fullscreen
-화면 전체 사용, standalone
-상단 URL바 제거, minimal-ui
-standalone에서 일부 UI가 추가로 보여짐, browser
-일반적, URL bar 보여짐 / 중에 설정)theme_color
: 상단 툴바의 색상background_color
: 스플래시 화면 배경 색상orientation
: 특정 방향을 강제로 지정 (landscape
(가로), portrait
(세로) 중 설정)robots.txt
는 검색로봇에게 사이트 및 웹페이지를 수집할 수 있도록 허용하거나 제한하는 국제 권고안이다.
추후에 SEO 최적화를 위한 정보들을 같이 추가해주면 좋을 것 같다.
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:
✨ 작성 팁
/
를 붙여야 한다.User-agent: 제어할 로봇의 User-Agent
Allow: /foo/bar/
User-agent: 제어할 로봇의 User-Agent
Disallow: /foo/bar/
User-agent: *
Allow: /
User-agent: *
Disallow: /
User-agent: *
Disallow: /
Allow: /$
우리가 실질적으로 작업하는 공간이다.
App.css
, index.css
파일
App.tsx
Index.tsx
안의 컴포넌트들에 대한 CSS 파일.
SCSS를 사용하려면 확장자를 .scss
로 변경하여 사용한다.
DOM을 테스트하기 위한 도구이다.
React Testing Library나 Jest 등 테스트 라이브러리를 사용한다.
import React from 'react';
import { render, screen } from '@testing-library/react';
import App from './App';
test('renders learn react link', () => {
render(<App />);
const linkElement = screen.getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
});
CRA가 제공해주는 기본 예제가 들어있는 파일. 내부 컴포넌트들을 과감히 정리해준다.
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>
);
}
export default App;
// 👉 정리
import './App.css';
function App() {
return (
<div>Hello World!</div>
);
}
export default App;
App.tsx
에 모인 컴포넌트들을 public/index.html
과 연결해주는 파일
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
❓ React StrictMode
React.StrictMode는 내부 구성 요소가 권장 사항 중 일부 방법을 따르고 있는지 확인하고 없는 경우 콘솔에 경고한다.
또한 사용되지 않는 메서드가 사용되고 있지 않은지 확인하고, 엄격한 모드를 사용하면 콘솔에서 경고한다.
마지막으로 잠재적인 위험을 식별하여 부작용을 예방할 수 있도록 도와준다. 이 과정에서 경고를 위해 두 번 렌더링을 하게 된다.
App.tsx의 기본 예제에 사용되는 React 로고. 삭제해주자
TypeScript 타입 선언을 참조한다.
bmp, gif, jpeg, jpg, png 등의 리소스 파일 가져오기에 대한 지원을 추가한다.
또한, .module.css
, module.scss
확장자를 가진 CSS 모듈 가져오기에 대한 지원을 추가한다.
/// <reference types="react-scripts" />
React 프로젝트의 성능을 측정하기 위한 파일.
index.tsx
에 reportWebVitals(console.log)
, reportWebVitals(구글 애널리틱스로 보내는 함수)
등으로 사용할 수 있다.
import { ReportHandler } from 'web-vitals';
const reportWebVitals = (onPerfEntry?: ReportHandler) => {
if (onPerfEntry && onPerfEntry instanceof Function) {
import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
getCLS(onPerfEntry);
getFID(onPerfEntry);
getFCP(onPerfEntry);
getLCP(onPerfEntry);
getTTFB(onPerfEntry);
});
}
};
export default reportWebVitals;
React 프로젝트에서 테스트를 실행하기 위한 설정 파일.
// jest-dom adds custom jest matchers for asserting on DOM nodes.
// allows you to do things like:
// expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom';
GitHub, GitLab 등 레포지토리에 저장되지 않길 원하는 파일을 지정할 수 있다.
설치한 패키지들의 정보가 담긴 파일.
node_modules
를 통째로 올리고 복사하는 것은 비효율적이기 때문에 설치한 패키지들의 정보와 버전 등을 기록하고 다른 사람이 레포지토리를 통해 설치할 때 이 파일에 근거해 패키지를 설치한다.
npm 으로 설치하면 package-lock.json
이 생성된다.
이 파일이 생성된 시점의 의존성 트리에 대한 정보를 가지고 있다.
타입스크립트를 컴파일하는데 필요한 루트 파일과 컴파일 옵션을 지정하는 파일.
{
"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"
]
}
출처