React: CRA(create-react-app)

summereuna๐Ÿฅยท2022๋…„ 2์›” 17์ผ
0

React JS

๋ชฉ๋ก ๋ณด๊ธฐ
11/69

๐Ÿ“ CRA(create-react-app)


์—ฌํƒœ๊นŒ์ง€ ๋งŒ๋“  ๋ฆฌ์•กํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์Šคํฌ๋ฆฝํŠธ๋Š” importํ•ด์„œ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ๊ณ  ๋‹ค ์ง์ ‘ ํ–ˆ๋‹ค.

๋ฆฌ์•กํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ์ตœ๊ณ ์˜ ๋ฐฉ์‹ CRA!

create-react-app์„ ์‚ฌ์šฉํ•˜๋ฉด ReactJS ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š”๊ฒŒ ํ›จ์”ฌ ์‰ฌ์›Œ์ง„๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋งŽ์€ ์Šคํฌ๋ฆฝํŠธ์™€ ์‚ฌ์ „ ์„ค์ •์„ ์ค€๋น„ํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

create-react-app๋ฅผ ์ด์šฉํ•ด์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๋ฉด ๊ฐœ๋ฐœ ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜, ์ž๋™์œผ๋กœ ์ƒˆ๋กœ๊ณ ์นจ์„ ์‹œ์ผœ์ฃผ๊ฑฐ๋‚˜, ์ฆ‰๊ฐ์ ์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์— CSS๋ฅผ ํฌํ•จ์‹œ์ผœ ์ฃผ๋Š” ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.

๐Ÿ“ ์ค€๋น„


  1. nodejs ์„ค์น˜
    ์ถ”์ฒœํ•˜๋Š” ๊ฑธ๋กœ ๋‹ค์šด ๋ฐ›์œผ๋ฉด ๋œ๋‹ค.

  2. ํ„ฐ๋ฏธ๋„์—์„œ node -v ์ปค๋งจ๋“œ ํ™•์ธํ•ด์„œ nodeJS ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ

  3. ํ„ฐ๋ฉ”๋„์—์„œ npx ์ปค๋งจ๋“œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ

๐Ÿ“ CRA Publish


1. ํ„ฐ๋ฏธ๋„์—์„œ CRA๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑํ•˜๊ธฐ

npx create-react-app my-app(๋‚ด ํ”„๋กœ์ ํŠธ ์ด๋ฆ„===๋””๋ ‰ํ† ๋ฆฌ ๋ช…)

2. ํ„ฐ๋ฏธ๋„์—์„œ VSC์—์„œ ์ž‘์—…ํ•  ๋””๋ ‰ํ† ๋ฆฌ ์—ด๊ธฐ

์ž ๊น! code ๋ช…๋ น์–ด ์‚ฌ์šฉํ•ด์„œ VSC ์—ด ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๊ณ  ๊ฐ€์ž ..^ใ…‡^
1. VSC ์ฝ”๋“œ์—์„œ cmd+shift+p๋กœ ๋ช…๋ น ํŒ”๋ ˆํŠธ ์—ด๊ธฐ
2. Shell Command: Install 'code' command in PATH ์ฐพ์•„์„œ ์„ค์น˜

  1. code ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„

  2. package.json์„ ์—ด์–ด๋ณด๋ฉด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” scripts๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

3. npm start๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰

  1. npm start
  2. ๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœ์šฉ ์„œ๋ฒ„(development server)๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

    ์ด ๋ชจ์Šต์ด create-react-app์„ ์‚ฌ์šฉํ•ด์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ์ดˆ๊ธฐ๋ฒ„์ „์ด๋‹ค. ^3^~

๐Ÿ‘€ 4. ์‚ดํŽด๋ณด๊ธฐ

1. src ํด๋”

  • ์•ž์œผ๋กœ ๋งŒ๋“ค ํŒŒ์ผ์€ ๋ชจ๋‘ srcํด๋”์— ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

2. index.js ํŒŒ์ผ

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();

๋ณด๋‹ค์‹œํ”ผ ์ž๋™์œผ๋กœ ๋‹ค ์„ค์น˜๋˜์–ด ์žˆ๋‹ค.

create-react-app์€ index.js๊ฐ€ ๋‚ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜(App)์„ ๊ฐ€์ง€๊ณ  public/index.html ์•ˆ์— ๋„ฃ์–ด์ฃผ๋„๋ก ์ด๋ฏธ ์„ค์ •๋˜์–ด ์žˆ๋‹ค.

์ด๋ฏธ ์ž๋™์œผ๋กœ ๋‹ค ์„ค์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ๋ญ˜ ์•ˆํ•ด๋„ ๋œ๋‹ค ^^!

์‹ฌ์ง€์–ด auto-reload๋„ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ js์—์„œ ์ˆ˜์ •ํ•˜๊ณ  ์ €์žฅํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ƒˆ๋กœ๊ณ ์นจ ์•ˆํ•ด๋„ ์ž๋™ ์ƒˆ๋กœ๊ณ ์นจ ๋˜์–ด์„œ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋˜๋‹ˆ ํŽธํ•˜๋‹ค.

4. App.js ํŒŒ์ผ

App()์€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋„ฃ์–ด์ ธ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•จ์ˆ˜ ์•ˆ์—๋Š” jsx๋กœ ๋ญ๋„ ์ข€ ์จ ์žˆ๋‹ค.

โŒ 5. ์ด์ œ ๊ธฐ๋ณธ ์ฝ”๋“œ ๋ช‡ ๊ฐ€์ง€์™€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ํŒŒ์ผ์„ ์ง€์›Œ๋ณด์ž.

index.js ํŒŒ์ผ์—์„œ ์ฝ”๋“œ ์‚ญ์ œํ•˜๊ธฐ

  1. reportWebVitals ๋ถ€๋ถ„ ์‚ญ์ œ
    reportWebVitals๋Š” ๋ฆฌ์•กํŠธ ์„ฑ๋Šฅ ์ธก์ •์„ ์œ„ํ•œ ํŒŒ์ผ๋กœ ๊ฐœ๋ฐœํ•  ๋Œ€ ์ด ํŒŒ์ผ ์“ฐ๋Š” ์ผ์€ ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ํ•œ๋‹ค.

  2. index.css ์‚ญ์ œ

  3. ์ด๋ ‡๊ฒŒ ๊ธฐ๋ณธ๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค.

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById("root")
);

App.js์—์„œ ์ฝ”๋“œ ์‚ญ์ œํ•˜๊ธฐ

  1. ๋กœ๊ณ  ์‚ญ์ œ
  2. App.css ์‚ญ์ œ
  3. ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ jsx ๋ถ€๋ถ„ ์‚ญ์ œ
  4. ์ด๋ ‡๊ฒŒ ๊ธฐ๋ณธ๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค.
function App() {
  return (
    <div>
      <h1>Welcome back!</h1>
    </div>
  );
}

export default App;

ํ˜„์žฌ nodeJS๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ํŒŒ์ผ์„ ๊ฐ๊ฐ ๋ถ„๋ฆฌํ•˜๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
ํ•œ ํŒŒ์ผ๋‹น ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์—…ํ•˜๋ฉด ๋˜๊ณ , ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ index.js์— import ๋˜์–ด ์žˆ๋Š” App.js์—์„œ ์ž‘์—…ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ import ํ•˜๋ฉด ๋œ๋‹ค.

์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ํŒŒ์ผ ์‚ญ์ œํ•˜๊ธฐ

  1. App.css ํŒŒ์ผ ์‚ญ์ œ
  2. App.text.js ํŒŒ์ผ ์‚ญ์ œ
  3. index.css ํŒŒ์ผ ์‚ญ์ œ
  4. logo.svg ํŒŒ์ผ ์‚ญ์ œ
  5. reportWebVitals.js ํŒŒ์ผ ์‚ญ์ œ
  6. setupTests.js ํŒŒ์ผ ์‚ญ์ œ

src ํด๋”์—๋Š” App.js ํŒŒ์ผ๊ณผ index.js ํŒŒ์ผ๋งŒ ๋‚จ๊ธฐ๋ฉด ๋œ๋‹ค.

๐Ÿ“ CRA ๊ตฌ๊ฒฝํ•˜๊ธฐ


CRA์— ์ต์ˆ™ํ•ด ์ง€๊ธฐ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž.

๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐ๊ฐ์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๋งŒ๋“  ํ›„ index.js๋กœ importํ•˜๋ฉด ๋œ๋‹ค.

1. src/Button.js ๋งŒ๋“ค๊ธฐ

2. Button.js ํŒŒ์ผ์— Button ์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

Button ์ปดํฌ๋„ŒํŠธ prop์œผ๋กœ text๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด { text }๋ฅผ ์ธ์ž๋กœ ์ž‘์„ฑํ•ด ๋‘๋ฉด ๋œ๋‹ค.

function Button({ text }) {
  return <button>{text}</button>;
}

export default Button;

3. App.js์— Button import ํ•˜๊ธฐ

import Button from "./Button";

function App() {
  return (
    <div>
      <h1>PTD in SEOUL</h1>
    </div>
  );
}

export default App;
  • ๐ŸŒŸ ์—ฌ๊ธฐ์„œ npm start ํ•ด๋ณด๋ฉด ์•„์ง Button์„ ์ •์˜๋Š” ํ–ˆ์ง€๋งŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— warning์ด ๋œฌ๋‹ค. Button์„ importํ•ด ์™”์ง€๋งŒ ์•„์ง ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋œจ๋Š” ๊ฒฝ๊ณ ๋ฌธ์ด๋‹ค. ์ด์ฒ˜๋Ÿผ CRA๋Š” ์ฝ”๋“œ๋ฅผ ๋” ์ž˜ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ผ์ข…์˜ ๋„์›€์„ ์ค€๋‹ค.

4. Button ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉํ•˜๊ธฐ

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;
  • ๐ŸŒŸ ๋ณด๋‹ค์‹œํ”ผ CRA๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด์„œ React ๋™์ž‘ ๋ฐฉ์‹์—์„œ ๋‹ค๋ฅธ ๊ฒƒ์€ ์—†๋‹ค.
    CRA๋Š” ์‚ฌ์ „ ์„ค์ •์„ ์ข€ ๋” ํŽธํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

5. Button ์ปดํฌ๋„ŒํŠธ์— prop ์‚ฌ์šฉํ•˜๊ธฐ

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์ด ํ•„์š”ํ•œ์ง€๋„ ์•Œ๋ ค์ค€๋‹ค.

6. Checking the PropTypes

  1. ์ฝ˜์†” ์—ด์–ด์„œ PropTypes installํ•˜๊ธฐ
    npm i prop-types

  2. Button.js ํŒŒ์ผ์— prop-types๋กœ ๋ถ€ํ„ฐ PropTypes importํ•˜๊ธฐ
    import PropTypes from "prop-types";

  3. 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;
  • ๐ŸŒŸ ์ด์ฒ˜๋Ÿผ props์„ ๋ฐ›์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•๋„ ๊ทธ๋ƒฅ ๋ฆฌ์•กํŠธ ์‚ฌ์šฉํ•  ๋•Œ๋ž‘ ๋˜‘๊ฐ™๋‹ค.
    CRA๋กœ ์ž‘์—…ํ•˜๋ฉด ์ข‹์€ ์ ์€ ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ๊ฐ์˜ ํŒŒ์ผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

๐ŸŒŸ ๊ทธ๋ ‡๋‹ค ๋ณด๋‹ˆ ํŠน์ • ์ปดํฌ๋„ŒํŠธ๋ฅผ ์œ„ํ•œ CSSํŒŒ์ผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“ CRA๋กœ CSS ์ž‘์—…ํ•˜๊ธฐ

CSS๋กœ ์ž‘์—…ํ•˜๋Š” ๊ธฐ์กด์˜ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ๋‹ค.


์ฒซ ๋ฒˆ์งธ ์˜ต์…˜

  1. ํ•œ ๊ฐœ์˜ CSSํŒŒ์ผ(styles.css) ๋งŒ๋“ค๊ธฐ

  2. styles.css ํŒŒ์ผ์— CSS ์ž‘์„ฑ
    ๋ฒ„ํŠผ์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ปฌ๋Ÿฌ๊ฐ€ ํ† ๋งˆํ†  ์ƒ‰์ด ๋˜๋„๋ก ์ž‘์„ฑํ•ด ๋ณด์ž.

button {
  color: white;
  background-color: tomato;
}
  1. index.js์—์„œ CSSํŒŒ์ผ import ํ•ด์˜ค๊ธฐ
    import "./styles.css"
    ๊ทธ๋Ÿฌ๋ฉด ์ „์ฒด ๋ฒ„ํŠผ์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ปฌ๋Ÿฌ๊ฐ€ ํ† ๋งˆํ†  ์ƒ‰์œผ๋กœ ๋ณ€ํ•œ๋‹ค.

๋‘ ๋ฒˆ์งธ ์˜ต์…˜

CSSํŒŒ์ผ์„ index.js์— import ํ•˜์ง€ ์•Š๊ณ ๋„ CSS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๋งŒ์•ฝ ์–ด๋–ค ํŠน์ •ํ•œ button์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ปฌ๋Ÿฌ๊ฐ€ ๋ธ”๋ฃจ์ด๊ธธ ์›ํ•œ๋‹ค๋ฉด,
๋ชจ๋“  ๋ฒ„ํŠผ์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ปฌ๋Ÿฌ๋ฅผ ํ† ๋งˆํ†  ์ƒ‰์œผ๋กœ ๋ฐ”๊พธ๋Š” styles.css๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์„ ๊ฑฐ๋‹ค.

  1. style prop์„ ์‚ฌ์šฉํ•œ๋‹ค.
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์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค!

CSS modules ์‚ฌ์šฉํ•˜๊ธฐ

  1. Button.module.css ํŒŒ์ผ ์ƒ์„ฑ
    CSS ๋ชจ๋“ˆ ๋™์ž‘์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด 'ํŒŒ์ผ์ด๋ฆ„.module.css'์ด๋ผ๊ณ  ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

  2. ์ด ํŒŒ์ผ ๋‚ด์—์„œ btn ์ด๋ผ๋Š” ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ

.btn {
  color: white;
  background-color: tomato;
}
  1. Button.module.css ํŒŒ์ผ์„ Button.js์— import ํ•˜๊ธฐ
    import styles from "./Button.module.css";
    Button.module.css ํŒŒ์ผ์„ index.js์— import ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Button ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋Š” Button.js ํŒŒ์ผ์— import ํ•ด์ค€๋‹ค.

  2. 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;

๐ŸŒŸ CRA๋Š” CSS์ฝ”๋“œ๋ฅผ JS ์˜ค๋ธŒ์ ํŠธ๋กœ ๋ณ€ํ™˜์‹œ์ผœ์ค€๋‹ค.

Button.module.cssํŒŒ์ผ์— ์ ์€ ์ฝ”๋“œ๊ฐ€ styles์ด๋ผ๋Š” ์ด๋ฆ„์˜ JS ์˜ค๋ธŒ์ ํŠธ๋กœ ๋ณ€ํ™˜๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—,
styles.btn์ด๋ผ๊ณ  ์ž‘์„ฑํ•˜๋ฉด Button.module.cssํŒŒ์ผ์— ์ ์–ด ๋†“์€ btnํด๋ž˜์Šค์˜ CSS ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์™€์šฐ ์ง„์งœ ์–ด๋ฉ”์ด์ง•...๐Ÿ‘๐Ÿ‘๐Ÿ‘
๋‚˜์˜ style๋“ค๋„ modular(๋ชจ๋“ˆ๋Ÿฌ)๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๋งค์ง!!!

๐ŸŒŸ ๊ทธ๋ฆฌ๊ณ  class ์ด๋ฆ„์ด ๋žœ๋คํ•˜๊ฒŒ ์ž‘์„ฑ๋œ๋‹ค.

์•„๋ž˜ class ์ด๋ฆ„์„ ๋ณด๋ฉด ์•Œ๋‹ค์‹œํ”ผ ๋‚ด๊ฐ€ ์ ์€ btn์ด ์•„๋‹Œ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Œ ^3^..
๊ทธ๋ž˜์„œ ๋™์ผํ•œ class ์ด๋ฆ„์„ ๋‹ค๋ฅธ ํŒŒ์ผ ๋‚ด์—์„œ ์‚ฌ์šฉํ•ด๋„ ์˜ค๋ฅ˜๊ฐ€ ์—†๋‹ค.
ํด๋ž˜์Šค ์ด๋ฆ„ ๊ธฐ์–ตํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋žœ๋คํ•˜๊ฒŒ ์•Œ์•„์„œ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!

์™€์šฐ ์ง„์งœ ์–ด๋ฉ”์ด์ง•...๐Ÿ‘๐Ÿ‘๐Ÿ‘

CSS module ์—ฐ์Šตํ•˜๊ธฐ

App์— ์ ์šฉํ•  css ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์–ด ๋ณด์ž.

  1. App.module.css ํŒŒ์ผ ์ƒ์„ฑ

  2. ์‚ฌ์ดํŠธ ์ œ๋ชฉ์„ ์œ„ํ•œ css ์ฝ”๋“œ ์ž‘์„ฑ

.title {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
    Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
  font-size: 18px;
}
  1. import ํ•˜๊ธฐ
    import styles from "./App.module.css";

  2. 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;
  • ์ด์ œ ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์œ„ํ•œ CSS๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ธฐ์–ตํ•˜๊ธฐ ์œ„ํ•ด ์• ์“ธ ํ•„์š”๋„ ์—†๋‹ค! ํด๋ž˜์Šค ์ด๋ฆ„ ๊ฒน์น˜๊ฒŒ ์‚ฌ์šฉํ•ด๋„ CRA๊ฐ€ ์•Œ์•„์„œ ๋žœ๋คํ•˜๊ฒŒ ์ด๋ฆ„ ๋ฐ”๊ฟ”์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๋„ ์—†๋‹ค!

์›Œ์šฐ! ๋„˜ ์‹ ๊ธฐํ˜€ ๐Ÿ˜‡

profile
Always have hope๐Ÿ€ & constant passion๐Ÿ”ฅ

0๊ฐœ์˜ ๋Œ“๊ธ€