Create React App
Set up a modern web app by running one command.
Features
- WebPack 5 + JEst 27 + ESLint 8 + PostCSS 8
- Tailwind 지원
- Fast Refresh 개선
- yarn/npm 패키지 매니저 감지를 환경 변수로 하도록 변경
- Node 10/12 지원 안함
Categories
- eslint-config-react-app - eslint 만악의 근원
Libraries
- sourceMap 원 소스와 transpiling 된 코드를 둘다 로딩
- css-loader: css 파일 읽기
- style-loader: head 엘리먼트에 css 주입, css-loader 와 같이 사용
- postcss-loader: 자바스크립트 플러그인을 통해 css를 변환하는 툴, 플러그인 베이스의 자동화 툴로, 앞으로 표준이 될 css 눔법을 확장/지원하는 css 게의 Babel 이다.
- autoprefixer css vender-prefix 자동처리 플러그인
- post-css-color-function color modifier 지원
- postcss-simple-vars sass 형식 변수 지원
- postcss-nesting Nesting 문법 지원
- postcss-for for문 지원
- postcss-assets url내에 들어가는 파일의 경로 계산이나 이미지의 width 측정
- precss sass 처럼 사용하기 위한 플러그인 모음
- cssnext 아직 지원하지 않는 새로운 구문 지원
Templates
- [https://www.npmjs.com/search?q=cra-template- cra-template- - npm search]
Creating an App
You’ll need to have Node >= 14 on your local development machine (but it’s not required on the server). You can use nvm (macOS/Linux) or nvm-windows to switch Node versions between different projects.
npx
npx comes with npm 5.2+ and higher, see instructions for older npm versions
npm
npm init
<initializer> is available in npm 6+
Yarn
yarn create
is available in Yarn 0.25+
TypeScript 적용 방법
Sass/Scss 적용 방법
WARNING |
Node Sass를 포함하여 LibSass 및 그 위에 빌드된 패키지는 더 이상 사용되지 않습니다. Node Sass 사용자인 경우 package.json 파일의 node-sass를 sass로 바꾸거나 다음 명령을 실행하여 Dart Sass로 마이그레이션할 수 있습니다. |
또는
이렇게 하면 다음과 같은 가져오기를 수행할 수 있습니다.
@use 'styles/_colors.scss'; // assuming a styles directory under src/
@use '~nprogress/nprogress'; // loading a css file from the nprogress node module
환경변수
환경변수는 가급적 cross-env 패키지로 적용하자.
명령행에서 대화형 모드가 아닌 방법으로 테스트 하는 방법
CI=true
환경변수를 사용하면 된다.
명령행에서 브라우저 자동실행 막는 방법
BROWSER=none
환경변수를 사용하면 된다.
포트번호 변경 방법
PORT=8080
환경변수를 사용하면 된다.
devDependencies 가 없는 이유
Create React App 을 이용해서 프로젝트를 시작하게 되면 package.json 파일에 모든 패키지들이 dependencies에 추가되어 있습니다.
"dependencies": {
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2",
"@types/jest": "^24.0.0",
"@types/node": "^12.0.0",
"@types/react": "^16.9.0",
"@types/react-dom": "^16.9.0",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-scripts": "3.4.1",
"typescript": "~3.7.2"
},
왜 devDependencies
에 @testing-library/react
같은걸 넣지 않았을까요?
아래와 같이 CRA Github에 누군가 질문을 했는데, Dan Abramov이 이렇게 답변했습니다.
Node 앱이면 dependencies 와 devDependencies 를 나누는게 의미가 있는데, CRA의 경우 결과물 자체가 static bundle이고, build시에만 모든 package를 이용하기때문에 궅이 따지자면 모든 dependencies가 development dependencies 입니다.
둘 중 어느곳에 넣어도 상관은 없지만, 일부 배포 스크립트가 동작하지 않을 수도 있기에 의도적으로 모든 패키지를 dependencies 에 넣었다고 합니다. :)
CSS Modules
다음과 같이 사용하면 css-modules을 적용할 수 있다:
-
[name].module.css
-
[name].module.scss
-
[name].module.sass
Adding SVGs
- Adding Images, Fonts, and Files | Create React App # Adding SVGs
- How to use SVGs in React - LogRocket Blog
다음과 같이 사용하면 svg 를 파일에서 바로 인라인 한다. 즉 SVGSVGElement에 접근할 수 있다.
import { ReactComponent as Logo } from './logo.svg';
function App() {
return (
<div>
{/* Logo is an actual React component */}
<Logo />
</div>
);
}
lib/react-app.d.ts
/// <reference types="node" />
/// <reference types="react" />
/// <reference types="react-dom" />
declare namespace NodeJS {
interface ProcessEnv {
readonly NODE_ENV: 'development' | 'production' | 'test';
readonly PUBLIC_URL: string;
}
}
declare module '*.avif' {
const src: string;
export default src;
}
declare module '*.bmp' {
const src: string;
export default src;
}
declare module '*.gif' {
const src: string;
export default src;
}
declare module '*.jpg' {
const src: string;
export default src;
}
declare module '*.jpeg' {
const src: string;
export default src;
}
declare module '*.png' {
const src: string;
export default src;
}
declare module '*.webp' {
const src: string;
export default src;
}
declare module '*.svg' {
import * as React from 'react';
export const ReactComponent: React.FunctionComponent<React.SVGProps<
SVGSVGElement
> & { title?: string }>;
const src: string;
export default src;
}
declare module '*.module.css' {
const classes: { readonly [key: string]: string };
export default classes;
}
declare module '*.module.scss' {
const classes: { readonly [key: string]: string };
export default classes;
}
declare module '*.module.sass' {
const classes: { readonly [key: string]: string };
export default classes;
}