๐Ÿ‘จโ€๐Ÿ’ป

Create-React-App ์—†์ด ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์„ธํŒ…ํ•˜๊ธฐ

2021-08-08 ย  | ย  ๊ฐœ๋ฐœ React

post-img

Create-React-App ์—†์ด ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•ํ•˜๊ธฐ

์ง์ ‘ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด๋ณด๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ

CRA๋Š” ๋ถ„๋ช…ํžˆ ๋น ๋ฅธ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ข‹์€ ๋„๊ตฌ์ž„์—๋Š” ํ‹€๋ฆผ์—†๋‹ค. CRA๋ฅผ ํ†ตํ•ด์„œ ํ”„๋กœ์ ํŠธ ์ž์ฒด๋ฅผ ๋นŒ๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค. CRA๊ฐ€ ๋‚˜์˜๋‹ค๋Š” ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๋ ค๊ณ  ์ด ๊ธ€์„ ์ ๋Š” ๊ฒƒ์ด ์•„๋‹˜์„ ์‹œ์ž‘์— ๊ฐ•์กฐํ•œ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋‚ด๊ฐ€ ์ด ๊ธฐ๋ก์„ ๋‚จ๊ธฐ๋Š” ์ด์œ ๋Š” ๋„ˆ๋ฌด ๋งน๋ชฉ์ ์ธ CRA๋ฅผ ๋‚จ๋ฐœํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•จ์ด๋‹ค. ์›นํŒฉ์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์ถ•ํ•ด๋ณด๋ฉด์„œ ์–ด๋–ค ํ”Œ๋Ÿฌ๊ทธ์ธ, ๋กœ๋”๋ฅผ ์ ์†Œ์— ์ ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•จ์ด๋‹ค. ๋ฐ”๋ฒจ์„ ํ†ตํ•ด์„œ ์–ด๋–ป๊ฒŒ ์–ธ์–ด์˜ ๋ฌธ๋ฒ•๊ฐ„ ํ˜ธํ™˜์„ฑ์„ ์ง€์ผœ์•ผ ํ•˜๋Š”์ง€๋ฅผ ๊ณต๋ถ€ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

๊ทธ๋ž˜๋„ ๋‚˜๋Š” ์—ฌ์ „ํžˆ CRA๊ฐ€ ๋„ˆ๋ฌด ํŽธํ•˜๊ณ  ์ข‹๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด CRA๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์“ฐ๋Š” ๊ฒƒ๋„ ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค.

์‹œ์ž‘์€ ํ•„์š”ํ•œ ๋ชจ๋“ˆ ์„ค์น˜๋กœ๋ถ€ํ„ฐ

๋‚˜๋Š” yarn์œผ๋กœ ๋…ธ๋“œ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค. ์กฐ๊ธˆ ๋” ๋น ๋ฅด๋‹ค๋Š” ๋Š๋‚Œ๋„ ์žˆ๊ณ , ํ„ฐ๋ฏธ๋„์—์„œ ๋ชจ๋“ˆ์„ ๋ฐ›์•˜์„๋•Œ ๋‚˜์˜ค๋Š” ๋ฌธ๊ตฌ๋„ ์กฐ๊ธˆ ๋” ์„ธ๋ จ๋œ ๊ฒƒ ๊ฐ™์•„์„œ ๊ทธ๋ ‡๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ๋ก์˜ ๋Œ€๋ถ€๋ถ„์€ yarn add๋กœ ๊ตฌ์„ฑ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์šฐ์„ , ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ํด๋”๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  yarn init -y๋กœ ๋…ธ๋“œ ํ”„๋กœ์ ํŠธ์ž„์„ ๋“œ๋Ÿฌ๋‚ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ์•กํŠธ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•œ๋‹ค. yarn add react react-dom react-dom์€ react์™€ dom์„ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ์ด๋‹ค.

Babel

๊ทธ ๋‹ค์Œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์„œ๋กœ๋‹ค๋ฅธ ๋ฌธ๋ฒ•๊ฐ„์˜ ์˜ค๋ฅ˜๋ฅผ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•ด์ค„ ๋ฐ”๋ฒจ์˜ ๋ชจ๋“ˆ๋“ค์„ ์„ค์น˜ํ•œ๋‹ค. JSX์™€ ES6 ์ด์ƒ์˜ ๋ฌธ๋ฒ•์„ ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ES5 ๋ฌธ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค. yarn add @babel/core @babel/preset-react @babel/preset-env

๋ฐ”๋ฒจ์˜ ๋ชจ๋“ˆ์€ ์•ž์— '@' ๋งˆํฌ๊ฐ€ ๋ถ™๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. ๋ฐ”๋ฒจ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ์ด์ „ TIL์— ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์ถ•์˜ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๊ฒƒ์ด ์žˆ๋‹ค. ๊ทธ ๋ถ€๋ถ„์„ ํ•จ๊ป˜ ์ฐธ๊ณ ํ•˜์ž. ๊ฐœ๋ฐœํ™˜๊ฒฝ ์ดํ•ดํ•˜๊ธฐ - Babel

  • @babel/preset-react : ๋ฆฌ์•กํŠธ์˜ JSX ๋ฌธ๋ฒ•์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.
  • @babel/preset-env : ES6 ์ด์ƒ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์„ ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ ธ์—์„œ๋„ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•˜๋„๋ก ES5๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ํ”„๋ฆฌ์…‹์ด๋‹ค.

Webpack and Loader

ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•์˜ ํ•ต์‹ฌ์ธ ์›นํŒฉ๊ณผ ๊ด€๋ จ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•œ๋‹ค.
yarn add -D webpack webpack-cli webpack-dev-server babel-loader css-loader style-loader

  • webpack-dev-server : ์ด๋ฆ„์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๊ฐœ๋ฐœ ๋ชจ๋“œ์— ํ•„์š”ํ•œ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™ํ•ด์ค€๋‹ค. ์ปดํ“จํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋นŒ๋ ค ์›นํŒฉ์„ ๊ตฌ๋™ํ•˜๊ณ  ์ž„0์‹œ ์„œ๋ฒ„๋ฅผ ๋„์šฐ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • css-loader, style-loader : css ๋ฌธ๋ฒ•์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. / css-loader๊ฐ€ ๋ณ€ํ™˜ํ•œ ํŒŒ์ผ์„ index.html์˜ <style> ํƒœ๊ทธ์— ๋„ฃ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๊ทธ ๋‹ค์Œ, ๋ฒˆ๋“ค๋ง ํŒŒ์ผ์— ์ ์šฉํ•  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•œ๋‹ค.
yarn add -D html-webpack-plugin clean-webpack-plugin

  • html-webpack-plugin: htmlํŒŒ์ผ์— ๋ฒˆ๋“ค๋ง๋œ ๋ฆฌ์•กํŠธ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  dist ํด๋”์— ๋ฒˆ๋“ค๋ง๋œ ํŒŒ์ผ์„ ์˜ฎ๊ฒจ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • clean-webpack-plugin : ๋ฒˆ๋“ค๋ง์ด ์™„๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค ์ด์ „์˜ ๋ฒˆ๋“ค๋ง ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ฑฐํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ด์ œ ๋ฐ”๋ฒจ, ์›นํŒฉ ์„ค์ • ํŒŒ์ผ์„ ๋งŒ๋“ค๋ฉด์„œ ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ ์™„์„ฑํ•ด๋ณด์ž.

babel.config.js

๋ฐ”๋ฒจ ์„ค์ • ํŒŒ์ผ์—๋Š” ํ”„๋ฆฌ์…‹์„ ์ž˜ ์ ์šฉํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ํ”„๋ฆฌ์…‹์€ ๋ฐ”๋ฒจ์˜ ์—ญํ• ๋“ค์„ ๋ชจ์•„๋‘” ๋„๊ตฌ ์ƒ์ž๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค. .babelrc ์ด๋ฆ„์œผ๋กœ ํŒŒ์ผ ์ด๋ฆ„์„ ์ง€์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ํ”„๋ฆฌ์…‹์„ presets ํ•ญ๋ชฉ์— ๋ฐฐ์—ด๋กœ ๋„ฃ์–ด์ฃผ๋ฉด๋œ๋‹ค.

// babel.config.js module.exports = { presets: ['@babel/preset-env', '@babel/preset-react'] };

webpack.config.js

๊ฐ€์žฅ ์ค‘์š”ํ•œ ์„ค์ •์€ ์›นํŒฉ ์„ค์ •์ด๋‹ค. ์‹ค์งˆ์ ์œผ๋กœ ์›นํŒฉ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฒˆ๋“ค๋ง์„ ํ•˜๋Š”์ง€์— ๋”ฐ๋ผ์„œ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์™„์ „ํžˆ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. webpack.config.jsํŒŒ์ผ์„ ๊ตฌ์ถ•ํ•˜๋ฉด์„œ ๊ผผ๊ผผํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž.

// webpack.config.js const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); const dotenv = require('dotenv').config();

์„ค์ •์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ ๋ชจ๋“œ/ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ  ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ ํฌํŠธ ๋ณ€ํ˜ธ๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ dotenv๋ฅผ ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.

module.exports = { mode: process.env.mode, entry: './src/index.js', output: { path: __dirname + '/dist', filename: 'bundle.[hash].js', publicPath: '/' }, resolve: { // path.resove ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. // ๊ทธ๋Ÿฌ๋ฉด node์˜ ๊ธฐ๋ณธ ๋ชจ๋“ˆ 'path'๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•œ๋‹ค. extensions: ['.js', '.jsx'] } };

๋ฒˆ๋“ค๋ง์ด ์‹œ์ž‘๋  ๊ณณ์€ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ ๋ณดํ†ต ๋ฆฌ์•กํŠธ ๋”์— ๋žœ๋”๋ง์„ ๊ฑฐ๋Š” index.js๋กœ ์ •ํ–ˆ๋‹ค. ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ์•„์„œ ์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ๋ฒˆ๋“ค๋ง ๊ฒฐ๊ณผ๋Š” ๋ณดํ†ต dist ํด๋”์— ํ•ด์‰ฌ๊ฐ€ ๋œ์ฑ„๋กœ ์ €์žฅ๋œ๋‹ค. ๋ฒˆ๋“ค๋ง์„ ํ•  ํŒŒ์ผ์€ '.js, .jsx'์˜ ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ํŒŒ์ผ์ด๋‹ค. ๋‚˜๋Š” ๋ณดํ†ต ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๊ฒฝ์šฐ ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ๋ช…์„ '.jsx' ํ™•์žฅ์ž๋กœ ์ง“๋Š”๋‹ค.

module.exports = { ..., module: { rules: [ { test: /\.(js|jsx)$/, exclude: '/node_modules/', loader: 'babel-loader' }, { test: /\.css$/, use: [{ loader: 'style-loader' }, { loader: 'css-loader' }] } ] }, }

๋กœ๋”๋Š” rules ํ•ญ๋ชฉ์—์„œ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ค‘์ ์ ์œผ๋กœ ์‹ ๊ฒฝ์จ์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๋กœ๋”์˜ ์ˆœ์„œ๋‹ค. ์›นํŒฉ์€ ๋“ฑ๋กํ•œ ๋กœ๋”์˜ ๋ฐฐ์—ด์—์„œ ๋’ค์˜ ์š”์†Œ๋ถ€ํ„ฐ ๋ฒˆ๋“ค๋ง์— ๋ฐ˜์˜ํ•œ๋‹ค. css๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ style ํƒœ๊ทธ์— ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ์ˆœ์„œ๋ฅผ ๊ฐ€์ง„๋‹ค. ๋˜ํ•œ node_modules ํด๋”์˜ ๋ชจ๋“  ๋ชจ๋“ˆ๋“ค์„ ๋‹ค ๋ฒˆ๋“ค๋ง ํ•  ํ•„์š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฑธ ์ œ์™ธํ•ด์ฃผ๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜๋‹ค.

module.exports = { ..., plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ template: 'public/index.html' }), new webpack.DefinePlugin({ mode: process.env.mode, port: process.env.port }) ], devServer: { host: 'localhost', port: process.env.port, open: true, historyApiFallback: true, hot: true } }

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ฐ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ ์šฉํ•œ๋‹ค. DefinePlugin์˜ ๊ฒฝ์šฐ ์›นํŒฉ์˜ ๊ธฐ๋ณธ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋ผ์„œ webpack์œผ๋กœ ๋ถ€ํ„ฐ ๊ฐ€์ง€๊ณ  ์™”๋‹ค. .env ํŒŒ์ผ์— ๋“ฑ๋กํ•œ ๊ฐœ๋ฐœ ๋ชจ๋“œ์™€ ํฌํŠธ ๋„˜๋ฒ„๋ฅผ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

devServer๋Š” ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์—ด์–ด์ฃผ๋Š” ์šฉ๋„๋‹ค. 'hot' ํ‚ค์›Œ๋“œ๋ฅผ true ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์„œ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฐ”๋กœ ๋ฒˆ๋“ค๋ง์ด ๋ฐœ๋™๋˜๊ณ  ์„œ๋ฒ„์— ๋ฐ˜์˜๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ด์ฃผ๋ฉด ์šฐ๋ฆฌ๊ฐ€ react ํ”„๋กœ์ ํŠธ์—์„œ ๋Š˜ ๋ดค๋˜ 'yarn start'๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๋ฌผ๋ก  ์Šคํฌ๋ฆฝํŠธ์— ๋“ฑ๋ก์„ ํ•ด์•ผํ•œ๋‹ค.

package.json ํŒŒ์ผ์— ์Šคํฌ๋ฆฝํŠธ ๋“ฑ๋กํ•˜๊ณ  ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ ์‹œ์ž‘ํ•˜๊ธฐ

"scripts": { "start": "webpack serve --progress --mode development", "build": "webpack" }

"start" ๋ช…๋ น์–ด์— 'webpack-dev-server'๋ฅผ ๋“ฑ๋กํ•ด์„œ ๋ฆฌ์•กํŠธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•œ๋‹ค. 'hot' ํ‚ค์›Œ๋“œ๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ๊ธฐ๋•Œ๋ฌธ์— ํ”„๋กœ์ ํŠธ๋Š” ๋ฆฌ์•กํŠธ์˜ ์‚ฌ์†Œํ•œ ๋ณ€ํ™”๋ฅผ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. "build" ๋ช…๋ น์–ด๋ฅผ ๋™์ž‘ํ•˜๋ฉด dist ํด๋”์— ๋ฒˆ๋“ค๋ง๋œ ํŒŒ์ผ๋“ค์ด ์ƒ์„ฑ๋  ๊ฒƒ์ด๋‹ค.

์ด์ œ ์šฐ๋ฆฌ์—๊ฒŒ ๋‚จ์€ ๊ฒƒ์€ public/index.html์„ ์ƒ์„ฑํ•˜๊ณ  src/index.js์— ๊ฐ€๋ฒผ์šด ๋ฆฌ์•กํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฌผ๋ก  yarn start ๋ช…๋ น์–ด๋กœ ์›นํŒฉ์„ ๋Œ๋ฆฌ๊ณ  3000๋ฒˆ ํฌํŠธ(.env์— ์„ค์ •ํ•ด์ค€)์—์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๋ค์ด๋‹ค.

<!-- public/index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=divice-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>react-twittler</title> </head> <body> <div id="root"></div> </body> </html>

// index.js import React from 'react'; import ReactDom from 'react-dom'; const App = () => { return <div>hello hankyeol</div>; }; ReactDom.render(<App />, document.getElementById('root'));

๋ถ€๋„๋Ÿฝ์ง€๋งŒ.. ํšŒ์‚ฌ์—์„œ ํ•ด๋‹น ๋‚ด์šฉ์œผ๋กœ ๊ธฐ์ˆ  ๋ฐœํ‘œ ์˜์ƒ์„ ์ฐ์—ˆ๋‹ค.


๋ชฉ์ฐจ

์ด์–ด์ง€๋Š” ๊ธ€,