๐ ๊ธฐ์ตํ๊ณ ์ถ์ ๋ด์ฉ
๐ Javascript ํ๋ก์ ํธ์ React ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ
- React๋ ์ฒ์๋ถํฐ ์ ์ง์ ์ผ๋ก ๋์
ํ ์ ์๊ฒ ์ค๊ณ๋์๊ณ , ํ์ํ ๋งํผ๋ง ์ฌ์ฉํ๋ฉด ๋๋ค.
- ๋น๋ ๋๊ตฌ ์์ด ๋ช ์ค์ ์ฝ๋๋ง์ผ๋ก React๋ฅผ ๋์
ํ ์ ์๋ค.
- HTML ํ์ผ์ DOM ์ปจํ
์ด๋ ์ค์นํ๊ธฐ
<div id="like_button_container"></div>
- React์ React DOM์ ๋ถ๋ฌ์ค๋ script ํ๊ทธ ์ถ๊ฐํ๊ธฐ
<script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
- React ์ปดํฌ๋ํธ ํ์ผ์ ๋ง๋ค์ด script ํ๊ทธ๋ก ๋ถ๋ฌ์ค๊ธฐ
<script src="like_button.js"></script>
React.createElement()
document.createElement(tagName[, options])
ํจ์๋ ์ง์ ํ tagName์ HTML ์์๋ฅผ ๋ง๋ค์ด ๋ฐํํ๊ณ , React.createElement(component, props, ...children)
ํจ์๋ ReactElement๋ฅผ ๋ฐํํ๋ค.
- ์ฒซ ๋ฒ์งธ ์ธ์์ธ component์๋ ๋ฌธ์์ด ๋๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ๋ฃ์ ์ ์๋ค.
- ๋ฌธ์์ด์ผ ๋๋ HTML ํ๊ทธ๋ฅผ ์๋ฏธํ๋ค.
- ๋ ๋ฒ์งธ ์ธ์์ธ props์๋ compoenent๊ฐ ๊ฐ์ง ์ ์๋ ์ต์
์ ๊ฐ์ฒด์ ํํ๋ก ๋ฃ์ ์ ์๋ค.
- ์) style, calssName ๋ฑ
- ์ธ ๋ฒ์งธ ์ธ์์๋ compoenent๊ฐ ๊ฐ์ธ๊ณ ์๋ ๋ด๋ถ ์ปดํฌ๋ํธ๋ฅผ ๋ฃ์ ์ ์๋ค.
- ํ
์คํธ
- ๋ฆฌ์กํธ ์ปดํฌ๋ํธ
- React.createElement() ํจ์๋ก ๋ง๋ ์ปดํฌ๋ํธ
ReactDOM.render()
- ReactElement๋ฅผ ๋ฃจํธ์ DOM ๋
ธ๋์ ๋ ๋๋ง ํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
- React DOM์ ReactElement์ ์ผ์นํ๋๋ก DOM์ ์
๋ฐ์ดํธํ๋ค.
๐ CRA
- Node 14.0.0 ํน์ ์์ ๋ฒ์ ๋ฐ npm 5.6 ํน์ ์์ ๋ฒ์ ์ด ํ์ํ๋ค.
npx create-react-app my-app
cd my-app
npm start
๐ CRA ์์ด React ์ฑ ๋ง๋๋ ๋ฐฉ๋ฒ
Bable์ด JSX๋ฅผ Javascript๋ก ํธ๋์คํ์ผ๋ง ํด์ฃผ๋ ๊ฒ์ ์ง์ ํ์ธํด๋ณด์ !
react, react-dom ์ค์
npm init --y
npm i react react-dom
public/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
src/index.js
import React from "react";
import ReactDOM from "react-dom";
const domContainer = document.querySelector("#root");
Babel ์ค์
npm i -D @babel/core @babel/cli @babel/preset-react @bable/preset-env
- @babel/preset-react ํจํค์ง๋ React์ ๊ด๋ จ๋ ์ฝ๋๋ฅผ ์ปดํ์ผ ํด์ค๋ค.
- @babel/cli ํจํค์ง๋ ํฐ๋ฏธ๋ ๋ช
๋ น์ด๋ฅผ ํตํด Babel์ ์ ์ฉ์ํฌ ์ ์๋๋ก ๋์์ค๋ค.
- @babel/core ํจํค์ง๋ Babel์ ์ฌ์ฉํ๊ธฐ ์ํด ํ์์ ์ผ๋ก ์ค์นํด์ผ ํ๋ค.
- -D ์ต์
์ devDependencies์ ์ค์นํ๋ค.
- preset์ ๊ต์ฅํ ๋ค์ํ๋ฐ, ๋งค๋ฒ ์ ์ฉํ preset์ ๋ชจ๋ ์์ฑํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋กญ๋ค. ๊ทธ๋์ babel.config.js๋ผ๋ ๋ณ๋์ ํ์ผ์ ๋ง๋ค์ด Babel์ ๊ด๋ จ๋ ์ค์ ์ ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
babel.confing.js
module.exports = function (api) {
api.cache(true);
const presets = ["@babel/preset-env", "@babel/preset-react"];
const plugins = [];
return {
presets,
plugins,
};
};
npx babel {ํ์ผ๋ช
}
Webpack ์ค์
- Webpack์ ๋ฒ๋ค๋ฌ(Bundler)๋ฅผ ์๋ฏธํ๋๋ฐ, ๋ฒ๋ค๋ฌ๋ ๋ถ๋ฆฌ๋ Javascript์ CSS ๋ชจ๋ ์ฝ๋๋ฅผ ๋ธ๋ผ์ฐ์ ์ ์ต์ ํ๋ ์ฌ๋ฌ ๊ฐ์ ํ์ผ๋ก ๊ฒฐํฉํ๋ค.
npm i -D webpack webpack-cli html-webpack-plugin babel-loader
- html-webpack-plugin์ bundle.js๋ฅผ index.html์ ์ ์ฉํด ์ต์ข
์ ์ธ html ํ์ผ๋ก ๋ง๋ค์ด ์ฃผ๋ ์ญํ ์ ํ๋ค.
webpack.config.js
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
mode: "development",
entry: "./src/index.js",
module: {
rules: [{ test: /\.js$/, use: "babel-loader" }],
},
plugins: [
new HtmlWebpackPlugin({
template: "./public/index.html",
}),
],
optimization: { minimizer: [] },
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js",
},
};
HMR ์ค์
- Hot Module Replacement(HMR)์ ๋ชจ๋ ์ ์ฒด๋ฅผ ๋ค์ ๋ก๋ํ์ง ์๊ณ , ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋๋ ๋์ ๋ณ๊ฒฝํด๋ ์ฆ์ ์
๋ฐ์ดํธ๋๋ค.
npm i -D webpack-dev-server
webpack.config.js
...
devServer: {
static: "./dist",
hot: true,
},
};
npx webpack serve
๐ ์๊ฐํ ์๊ฐ & ๋ ์ค๋ฅด๋ ์๊ฐ
- babel๊ณผ webpack์ ์ค์ ํ ๋ ์ ์ด๋ฐ ์ต์
๋ค์ ์ฃผ๋์ง ํท๊ฐ๋ ธ๋๋ฐ, ์ด๋ฒ ๊ฐ์๋ฅผ ํตํด์ ํ์คํ๊ฒ ์ดํดํ๊ณ ๋์ด๊ฐ ์ ์์๋ค. ๋ฏ์ค์ด์ ์ด๋ ต๊ฒ ๋ค๊ฐ์์ ๋ฟ ์ดํดํ๊ณ ๋๋ ๊ทธ๋ ๊ฒ ์ด๋ ค์ด ๋ด์ฉ์ ์๋์๋ค.
๐ ์ฐธ๊ณ ๋ํผ๋ฐ์ค