CRA, CSS 기초
1. 리액트란
2. create-react-app
3. 리엑트 작성 방법 결정하기
1. 리액트란
2. create-react-app
1) 프로젝트 만들기
$ npx create-react-app {PROJECT NAME}
$ yarn create react-app my-app
2) scripts 명령어 종류
- package.json
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
start : 개발모드로 실행할 때 사용
따라서 여러가지 최적화가 되지 않은 상태로 실행이 되기 때문에 배포할 때 사용하면 안된다. http로 실행 된다.
https로 실행하고 싶을 때는 HTTPS=true npm start
명령어 입력.
build: 배포할 때 사용하는 명령어
빌드를 하게 되면 정적 파일이 생성된다. 서버에서는 이렇게 생성된 build 폴더 안에 있는 내용들을 정적 파일로 서비스만 하면 된다.
별도로 서버에 애플리케이션을 실행을 하지 않기 때문에 서버사이드 렌더링으로 동작할 수 없는 것이다.
로컬에서 정적 파일을 서비스 하기 위해서 serve 패키지를 사용하고 build 폴더를 대상으로 정적 파일을 서비스한다. react developer tools 크롬 익스텐션을 이용해서 실행된 페이지가 배포용 파일로 실행 된 것이라는 것을 알 수 있다. npx serve -s build
test
npm test
: 테스트 실행 명령어
기본적으로 App.test.js
파일이 있는데 이 파일 명을 App.spec.js
로 변경해도 테스트가 잘 된다.
__tests__
라는 폴더를 만들면 이 폴더 밑에 있는 모든 파일이 테스트 파일이 된다.
하지만 폴더로 관리하는 것 보다는 .test.js
라는 이름으로 관리하는 게 좋다고 생각하는데, 그 이유는 테스트 하려는 파일이랑 붙어 있으면 여러모로 관리하기가 편리하기 때문.
eject: react-scripts
를 사용하지 않고 모든 설정 파일을 추출하는 명령어
CRA를 기반으로 직접 개발 환경을 구축하고 싶을 때 사용
추출하지 않으면 CRA의 기능이 추가됐을 때 단순히 react-scripts 버전만 올리면 되는데 추출을 하면 수동으로 설정 파일을 수정해야 하는 단점이 있다. 따라서 꼭 필요한 경우가 아니라면 관리를 위해서 추출을 하지 않는 것을 추천.
3. 리엑트 작성 방법 결정하기
1) 일반적인 css파일 작성
2) css-module로 작성하기
import Style from './Button.module.css';
<button className={`${Style.button} ${Style.big}`}>큰 버튼</button>
npm i classnames
로 설치)<button className={cn(Style.Button, Style.big)}>버튼</button>
<button
className={cn(Style.Button, {
[Style.big]: isBig,
[Style.small]: !isBig,
})}
>
{isBig ? '큰 버튼' : '작은 버튼'}
</button>
3) styled-components로 작성하기
$ npm i styled-components
import React from 'react';
import styled from 'styled-components';
const BoxCommon = styled.div`
height: 50px;
backgrouhnd-color: #aaaaaa;
`;
const BoxBig = styled(BoxCommon)`
width: 200px;
`
const BoxSmall = styled(BoxCommon)`
width: 100px;
`
export default function Box({ size }) {
if (size === 'big') {
return <BoxBig>큰 박스</BoxBig>;
} else {
return <BoxSmall>작은 박스</BoxSmall>;
}
}
const BoxCommon = style.button`
width: ${props => (props.isBig ? 100 : 50)}px;
height: 30px;
background-color: yellow;
`;
export default function Box({ size }) {
const isBig = size === 'big';
const label = isBig ? '큰 버튼' : '작은 버튼';
return <BoxCommon isBig={isBig}>{label}</BoxCommon>;
}