Less to Learn
You don't need to learn and configure many build tools. Instant reloads help you focus on development. When it's time to deploy, your bundles are optimized automatically.
๋ฆฌ์กํธ๋ฅผ ๋น๋กฏํด ๋๋ถ๋ถ์ ๋ค๋ฅธ ํ๋ ์์ํฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ํ js๋ง์ผ๋ก ์ด๋ฃจ์ด์ ธ์์ง ์๋ค.
ํ์ง๋ง ๋ธ๋ผ์ฐ์ ๋ ์์ํ js, html, css๋ง์ ์ฝ์ ์ ์๋ค.
์ด๋ด ๋ ์ฐ๋ฆฌ๋ ์์ ํ๋ ํ์ผ๋ค์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฝ์ ์ ์๋ ํํ๋ก ๋ณํํด์ผ ํ๋ค.
๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด babel-loader์ ํ์ํ ํ๋ฌ๊ทธ์ธ๋ค์ ํตํด ์ด๋ฐ ๊ณผ์ ์ ์ํํ ์ ์๊ณ , ํน์ babel์ ์ง์ ์คํ์์ผ ๋ณํํ ์๋ ์๋ค.
ํ์ง๋ง ์ง์ ๋ฒ๋ค๋ฌ์ config ํ์ผ์ ์กฐ์ ํ๊ฑฐ๋ ํ์ํ ํจํค์ง๋ค์ ๋งค๋ฒ ์ค์นํ๊ธฐ๋ ์ฌ๊ฐ ๋ฒ๊ฑฐ๋ก์ด ์ผ์ด ์๋๋ค.
์ด๋ฅผ ๊ฐํธํ๊ฒ ํด์ฃผ๋ ๋๊ตฌ๊ฐ CRA์ด๋ค. ๊ฐ๋จํ๊ฒ ๋งํ๋ฉด react ํ๊ฒฝ์ ์ํ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ผ๊ณ ๋ณผ ์๋ ์๊ฒ ๋ค.
npx create-react-app my-app
yarn create react-app my-app
๋ณธ์ธ์ ํ๊ฒฝ์ ๋ง๊ฒ CRA ๋ช ๋ น์ด๋ฅผ ํธ์ถํ๋ฉด ๋๋ค.
yarn create react-app my-app --template typescript
๋ค์๊ณผ ๊ฐ์ด ํน์ ์ค์ ์ ์ถ๊ฐํ ์๋ ์๋ค. ์ด๋ ๊ฒ ์์ฑ๋ ํ๋ก์ ํธ๋ ์นํฉ ๊ธฐ๋ฐ์ผ๋ก ์ค์ ๋๋ค.
my-app/
README.md
node_modules/
package.json
public/
index.html
favicon.ico
src/
App.css
App.js
App.test.js
index.css
index.js
logo.svg
์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํด๋ ๊ตฌ์กฐ๊ฐ ์์ฑ๋๋๋ฐ, public ํด๋ ๋ด์ index.html์ ์นํฉ์ template, index.js๋ ์ํธ๋ฆฌํฌ์ธํธ ์ญํ ์ ํ๋ค.
plugins: [
// Generates an `index.html` file with the <script> injected.
new HtmlWebpackPlugin(
Object.assign(
{},
{
inject: true,
template: paths.appHtml,
},
ํ๋ก์ ํธ์ node_modules/react-scripts/config๋ฅผ ํ์ธํด๋ณด๋ฉด ์นํฉ์ ๋น๋กฏํ ๋ค์ํ config ์ค์ ์ ๋ณผ ์ ์๋ค.
{
"name": "first_app",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^13.0.0",
"@testing-library/user-event": "^13.2.1",
"@types/jest": "^27.0.1",
"@types/node": "^16.7.13",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
"react": "^18.1.0",
"react-dom": "^18.1.0",
"react-scripts": "5.0.1",
"typescript": "^4.4.2",
"web-vitals": "^2.1.0"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
CRA๋ฅผ ์์ฑํ์ ๋ ๋ง๋ค์ด์ง๋ package.json ํ์ผ์ด๋ค.
์ด๋์๋ ์นํฉ์ด๋ ๋ก๋, ํ๋ฌ๊ทธ์ธ ๋ฑ์ด ๋ณด์ด์ง ์๋๋ค. ์ด๊ฒ CRA์ ๊ฐ์ ์ค ํ๋๋ค.
CRA๋ devDependencies๋ค์ ์จ๊ฒจ์ค๋ค. ์ด ์จ๊ฒจ์ง ํ์ผ๋ค์ ์ฌ์ฉ์์ ํธ์๋ฅผ ์ํด ๊ฐ์ข config๋ค์ด ์๋์ผ๋ก ์ค์ ๋์ด ์๊ณ ๊ฐ๋ฐ์๋ ๊ทธ์ scripts์ ์๋ ๋ช ๋ น์ด๋ง ์ ๋ ฅํ๋ฉด ๋๋ค.
๋ง์ฝ config๋ฅผ ์ธ์ธํ๊ฒ ์กฐ์ ํด์ผ ํ ํ์๊ฐ ์๋ค๋ฉด eject ๋ช ๋ น์ ์คํํ๋ฉด ๋๋ค.
eject ๋ช ๋ น์ ์คํํ๋ฉด ์จ๊ฒจ์ง ์ค์ ๋ค์ด ๋๋ฌ๋๊ณ ๊ทธ๊ฒ์ ์์ ํ ์ ์๋ค.
๊ตณ์ด CRA๋ฅผ ์ด์ฉํ์ง ์์๋ ๋๋ค. ํ์ง๋ง ๊ทธ๋ด ๊ฒฝ์ฐ ๊ฐ์ข ํจํค์ง์ ํ๋ฌ๊ทธ์ธ ์ค์ ๋ฑ์ ์ผ์ผ์ด ๋ค ์กฐ์ ํด์ผ ํ๋ค๋ ๋ถํธ์ด ์๋ค.
๊ทธ๋ ๋ค๋ฉด CRA๊ฐ ํญ์ ์ ๋ต์ผ๊น?
์กฐ์ฌ์ค๋ฝ๊ฒ ์๊ฐํด๋ณด๋ ๊ฑด๋ฐ ๊ทธ๊ฑด ๋ ์๋ ๊ฒ ๊ฐ๋ค. ํ๋ก์ ํธ์ ์ข ๋ฅ์ ๋ฐ๋ผ CRA๊ฐ ์ด์ธ๋ฆฌ์ง ์๋ ํ๋ก์ ํธ๋ ๋ถ๋ช ์กด์ฌํ ๊ฒ์ด๋ค.
ํธ๋ฆฌํจ์ ๊ทธ๋งํผ ์ถ๊ฐ์ ์ธ ๋น์ฉ์ด ๋ค๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฌผ๋ก ์์ง ๋ฐฐ์ฐ๋ ์ ์ฅ์ธ ๋ด๊ฒ CRA๋งํผ ๊ฐํธํ๊ณ ์์คํ ๋๊ตฌ๊ฐ ์๋ค.
์์ฆ์ CRA๋ฅผ ํตํ ์นํฉ ๋ฒ๋ค๋ง๋ณด๋ค vite๋ผ๋ ๋ฒ๋ค๋ฌ๊ฐ ์ ํ์ด๋ผ๋๋ฐ?