์ฌํ๊น์ง ๋ง๋ ๋ฆฌ์กํธ ์ดํ๋ฆฌ์ผ์ด์ ์ ์คํฌ๋ฆฝํธ๋ importํด์ ๋ง๋ค์ด์ผ ํ๊ณ ๋ค ์ง์ ํ๋ค.
create-react-app์ ์ฌ์ฉํ๋ฉด ReactJS ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋๊ฒ ํจ์ฌ ์ฌ์์ง๋ค. ์๋ํ๋ฉด ๋ง์ ์คํฌ๋ฆฝํธ์ ์ฌ์ ์ค์ ์ ์ค๋นํด ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
create-react-app๋ฅผ ์ด์ฉํด์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๋ฉด ๊ฐ๋ฐ ์๋ฒ์ ์ ๊ทผํ๊ฑฐ๋, ์๋์ผ๋ก ์๋ก๊ณ ์นจ์ ์์ผ์ฃผ๊ฑฐ๋, ์ฆ๊ฐ์ ์ผ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์์ CSS๋ฅผ ํฌํจ์์ผ ์ฃผ๋ ๋ฑ์ ๊ธฐ๋ฅ์ ํ๋ค.
nodejs ์ค์น
์ถ์ฒํ๋ ๊ฑธ๋ก ๋ค์ด ๋ฐ์ผ๋ฉด ๋๋ค.
ํฐ๋ฏธ๋์์ node -v
์ปค๋งจ๋ ํ์ธํด์ nodeJS ์ฌ์ฉ๊ฐ๋ฅํ์ง ํ์ธ
ํฐ๋ฉ๋์์ npx
์ปค๋งจ๋ ์ฌ์ฉ๊ฐ๋ฅํ์ง ํ์ธ
npx create-react-app my-app(๋ด ํ๋ก์ ํธ ์ด๋ฆ===๋๋ ํ ๋ฆฌ ๋ช
)
์ ๊น! code ๋ช ๋ น์ด ์ฌ์ฉํด์ VSC ์ด ์ ์๋๋ก ์ค์ ํ๊ณ ๊ฐ์ ..^ใ ^
1. VSC ์ฝ๋์์cmd+shift+p
๋ก ๋ช ๋ น ํ๋ ํธ ์ด๊ธฐ
2.Shell Command: Install 'code' command in PATH
์ฐพ์์ ์ค์น
code ๋๋ ํ ๋ฆฌ ์ด๋ฆ
package.json์ ์ด์ด๋ณด๋ฉด ์คํํ ์ ์๋ scripts๊ฐ ์๋์ผ๋ก ์์ฑ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
npm start
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
๋ณด๋ค์ํผ ์๋์ผ๋ก ๋ค ์ค์น๋์ด ์๋ค.
์ด๋ฏธ ์๋์ผ๋ก ๋ค ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ง์ ๋ญ ์ํด๋ ๋๋ค ^^!
์ฌ์ง์ด auto-reload๋ ๋๋ค. ๊ทธ๋์ js์์ ์์ ํ๊ณ ์ ์ฅํ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ์๋ก๊ณ ์นจ ์ํด๋ ์๋ ์๋ก๊ณ ์นจ ๋์ด์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ ํธํ๋ค.
App()์ ํจ์ ์ปดํฌ๋ํธ๋ก ๋ฃ์ด์ ธ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํจ์ ์์๋ jsx๋ก ๋ญ๋ ์ข ์จ ์๋ค.
reportWebVitals ๋ถ๋ถ ์ญ์
reportWebVitals๋ ๋ฆฌ์กํธ ์ฑ๋ฅ ์ธก์ ์ ์ํ ํ์ผ๋ก ๊ฐ๋ฐํ ๋ ์ด ํ์ผ ์ฐ๋ ์ผ์ ๊ฑฐ์ ์๋ค๊ณ ํ๋ค.
index.css ์ญ์
์ด๋ ๊ฒ ๊ธฐ๋ณธ๋ง ์์ผ๋ฉด ๋๋ค.
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById("root")
);
function App() {
return (
<div>
<h1>Welcome back!</h1>
</div>
);
}
export default App;
ํ์ฌ nodeJS๋ก ์์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ํ์ผ์ ๊ฐ๊ฐ ๋ถ๋ฆฌํ๋๊ฒ ๊ฐ๋ฅํ๋ค.
ํ ํ์ผ๋น ํ ์ปดํฌ๋ํธ๋ฅผ ์์ ํ๋ฉด ๋๊ณ , ๊ทธ๋ฌ๊ณ ๋์ index.js์ import ๋์ด ์๋ App.js์์ ์์ ํ ์ปดํฌ๋ํธ๋ฅผ import ํ๋ฉด ๋๋ค.
CRA์ ์ต์ํด ์ง๊ธฐ ์ํด ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ๋ณด์.
์์์ ์ธ๊ธํ๋ฏ์ด ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๋ ๊ฐ๊ฐ์ ํ์ผ๋ก ๋ถ๋ฆฌํด์ ๋ง๋ ํ index.js๋ก importํ๋ฉด ๋๋ค.
Button ์ปดํฌ๋ํธ prop์ผ๋ก text๋ฅผ ์ฃผ๊ธฐ ์ํด { text }
๋ฅผ ์ธ์๋ก ์์ฑํด ๋๋ฉด ๋๋ค.
function Button({ text }) {
return <button>{text}</button>;
}
export default Button;
import Button from "./Button";
function App() {
return (
<div>
<h1>PTD in SEOUL</h1>
</div>
);
}
export default App;
npm start
ํด๋ณด๋ฉด ์์ง Button์ ์ ์๋ ํ์ง๋ง ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ warning์ด ๋ฌ๋ค. Button์ importํด ์์ง๋ง ์์ง ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๋จ๋ ๊ฒฝ๊ณ ๋ฌธ์ด๋ค. ์ด์ฒ๋ผ CRA๋ ์ฝ๋๋ฅผ ๋ ์ ์์ฑํ ์ ์๋๋ก ์ผ์ข
์ ๋์์ ์ค๋ค.App.js๋ index.js๋ก export import ๋์ด ์๊ณ index.js์์ App์ ๋๋๋ง ํ๊ณ ์๋ค.
๋ฐ๋ผ์ Button ์ปดํฌ๋ํธ๋ฅผ ๋๋๋งํ๊ธฐ ์ํด App์ ๋ฃ์ผ๋ฉด ๋๋ค.
import Button from "./Button";
function App() {
return (
<div>
<h1>PTD in SEOUL</h1>
<Button />
</div>
);
}
export default App;
Button.js ์์ { text }
๋ฅผ ์ธ์๋ก ๋ณด๋ด๋ ค๊ณ ์์ฑํด ๋์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์๋ text๋ฅผ prop์ผ๋ก ์์ฑํ๋ฉด ๋๋ค.
import Button from "./Button";
function App() {
return (
<div>
<h1>PTD in SEOUL</h1>
<Button text={"HEY"} />
</div>
);
}
export default App;
๐ VSC๋ ์น์ ํ๊ฒ๋ ์ปดํฌ๋ํธ์ prop์ ์์ฑํ๊ธฐ ์ํด prop ์ด๋ฆ์ ์ ์๋ ค๊ณ ํ๋ฉด ์๋์ฒ๋ผ ํ์ํ ๊ฒ ๊ฐ์ prop์ ๋ณด์ฌ์ค๋ค.
๐ CRA๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ข์ ์ ์ด ๊ฐ๋ฐ ํ๊ฒฝ์ด ํจ์ฌ ์ข๋ค๋ ์ ์ด๋ค.
๋ง์ฐ์ค๋ฅผ Button ์ปดํฌ๋ํธ ์์ ์ฌ๋ ค๋์ผ๋ฉด Button ์ปดํฌ๋ํธ์ ์ด๋ค prop์ด ํ์ํ์ง๋ ์๋ ค์ค๋ค.
์ฝ์ ์ด์ด์ PropTypes installํ๊ธฐ
npm i prop-types
Button.js ํ์ผ์ prop-types๋ก ๋ถํฐ PropTypes importํ๊ธฐ
import PropTypes from "prop-types";
Button ์ปดํฌ๋ํธ์ PropTypes ์ค์ ํ๊ธฐ
import PropTypes from "prop-types";
function Button({ text }) {
return <button>{text}</button>;
}
//๐ฅ Button์ propTypes = { text: PropTypes์ string์ด๊ณ ํ์์ฌ์ผ ํ๋ค.}
Button.propTypes = {
text: PropTypes.string.isRequired,
};
export default Button;
๐ ๊ทธ๋ ๋ค ๋ณด๋ ํน์ ์ปดํฌ๋ํธ๋ฅผ ์ํ CSSํ์ผ์ ๋ง๋ค ์ ์๋ค.
ํ ๊ฐ์ CSSํ์ผ(styles.css) ๋ง๋ค๊ธฐ
styles.css ํ์ผ์ CSS ์์ฑ
๋ฒํผ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ปฌ๋ฌ๊ฐ ํ ๋งํ ์์ด ๋๋๋ก ์์ฑํด ๋ณด์.
button {
color: white;
background-color: tomato;
}
import "./styles.css"
CSSํ์ผ์ index.js์ import ํ์ง ์๊ณ ๋ CSS๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ง์ฝ ์ด๋ค ํน์ ํ button์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ปฌ๋ฌ๊ฐ ๋ธ๋ฃจ์ด๊ธธ ์ํ๋ค๋ฉด,
๋ชจ๋ ๋ฒํผ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ปฌ๋ฌ๋ฅผ ํ ๋งํ ์์ผ๋ก ๋ฐ๊พธ๋ styles.css
๋ฅผ ์ฌ์ฉํ์ง๋ ์์ ๊ฑฐ๋ค.
import PropTypes from "prop-types";
function Button({ text }) {
return (
<button
style={{
backgroundColor: "skyblue",
color: "white",
}}
>
{text}
</button>
);
}
Button.propTypes = {
text: PropTypes.string.isRequired,
};
export default Button;
ํ์ง๋ง global(์ ์ญ์ ์ธ) CSS style์ ์ํ์ง ์๋๋ค๊ณ ์ด๋ฐ์์ผ๋ก js ํ์ผ ์์๋ค๊ฐ style ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ฉด... ์์ฐ.. ์ ์ง๋ณด์ํ๊ธฐ์ ์ฝ์ง ์์ ๊ฑฐ๋ค.
CSS ํ์ผ์ด ์ ์ฉํ๋ ค๊ณ ํ๋ ํ์ผ์ ๋ชจ๋ ๋ถ๋ถ์ import ๋๋ ๊ฒ์ ์ํ์ง ์์ง๋ง ์ง์ ์ ์ผ๋ก style ์ฝ๋๋ ๋ฃ๊ธฐ ์ซ๋ค๋ฉด ์ด๋ป๊ฒ ํ๋ฉด ์ข์๊น?
CSS modules์ ์ฌ์ฉํ๋ฉด ๋๋ค!
Button.module.css
ํ์ผ ์์ฑ
CSS ๋ชจ๋ ๋์์ ํ์ฑํํ๋ ค๋ฉด 'ํ์ผ์ด๋ฆ.module.css'์ด๋ผ๊ณ ์ด๋ฆ์ ์ง์ ํด์ผ ํ๋ค.
์ด ํ์ผ ๋ด์์ btn ์ด๋ผ๋ ํด๋์ค ๋ง๋ค๊ธฐ
.btn {
color: white;
background-color: tomato;
}
Button.module.css
ํ์ผ์ Button.js์ import ํ๊ธฐ
import styles from "./Button.module.css";
Button.module.css ํ์ผ์ index.js์ import ํ๋ ๊ฒ์ด ์๋๋ผ Button ์ปดํฌ๋ํธ๊ฐ ์๋ Button.js ํ์ผ์ import ํด์ค๋ค.
button์ ํด๋์ค๋ค์์ ์
๋ ฅํ๋ค.
className={styles.btn}
import PropTypes from "prop-types";
import styles from "./Button.module.css";
function Button({ text }) {
return <button className={styles.btn}>{text}</button>;
}
Button.propTypes = {
text: PropTypes.string.isRequired,
};
export default Button;
Button.module.css
ํ์ผ์ ์ ์ ์ฝ๋๊ฐ styles
์ด๋ผ๋ ์ด๋ฆ์ JS ์ค๋ธ์ ํธ๋ก ๋ณํ๋์๊ธฐ ๋๋ฌธ์,
styles.btn
์ด๋ผ๊ณ ์์ฑํ๋ฉด Button.module.css
ํ์ผ์ ์ ์ด ๋์ btn
ํด๋์ค์ CSS ์ฝ๋๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํ ์ ์๋ค.
์์ฐ ์ง์ง ์ด๋ฉ์ด์ง...๐๐๐
๋์ style๋ค๋ modular(๋ชจ๋๋ฌ)๊ฐ ๋ ์ ์๋ ๋งค์ง!!!
์๋ class ์ด๋ฆ์ ๋ณด๋ฉด ์๋ค์ํผ ๋ด๊ฐ ์ ์ btn์ด ์๋๊ฒ์ ํ์ธ ํ ์ ์์ ^3^..
๊ทธ๋์ ๋์ผํ class ์ด๋ฆ์ ๋ค๋ฅธ ํ์ผ ๋ด์์ ์ฌ์ฉํด๋ ์ค๋ฅ๊ฐ ์๋ค.
ํด๋์ค ์ด๋ฆ ๊ธฐ์ตํ ํ์๊ฐ ์๋ค. ๋๋คํ๊ฒ ์์์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค!
์์ฐ ์ง์ง ์ด๋ฉ์ด์ง...๐๐๐
App์ ์ ์ฉํ css ๋ชจ๋์ ๋ง๋ค์ด ๋ณด์.
App.module.css ํ์ผ ์์ฑ
์ฌ์ดํธ ์ ๋ชฉ์ ์ํ css ์ฝ๋ ์์ฑ
.title {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
font-size: 18px;
}
import ํ๊ธฐ
import styles from "./App.module.css";
h1์ className ์ ์ฉํ๊ธฐ
import Button from "./Button";
import styles from "./App.module.css";
function App() {
return (
<div>
<h1 className={styles.title}>PTD in SEOUL</h1>
<Button text={"HEY"} />
</div>
);
}
export default App;
์์ฐ! ๋ ์ ๊ธฐํ ๐