๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/React

[React] CSS ๋Œ€์‹  SASS ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

by Connecting-the-dots 2022. 3. 25.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

๐Ÿ’œ node-sass ์„ค์น˜ํ•˜๊ธฐ

  • CSS ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๋Š” ๊ฒฝ์šฐ SASS ๋ผ๋Š” preprocessor ๋ฅผ ์ด์šฉํ•˜๋ฉด ์กฐ๊ธˆ ๋” ์‰ฝ๊ณ  ์งง๊ฒŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ฒ˜๋Ÿผ CSS ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์‰ฝ๊ฒŒ ๋งํ•ด SASS ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ณ€์ˆ˜, ๋ฐ˜๋ณต๋ฌธ, ํ•จ์ˆ˜ ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฌธ๋ฒ•์œผ๋กœ CSS ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • SASS ๋กœ ์ž‘์„ฑํ•œ ๋’ค์— CSS ๋กœ ์ปดํŒŒ์ผ๋งŒ ํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์€ node-sass ๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์„ค์น˜ํ•ด์ฃผ๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค.

๐Ÿค node-sass ์„ค์น˜ํ•˜๊ธฐ

// npm ์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ
npm install node-sass

// yarn ์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ
yarn add node-sass
  • ํ„ฐ๋ฏธ๋„์— ์œ„ ์ฝ”๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด node-sass ๊ฐ€ ์„ค์น˜๋œ๋‹ค.

๐Ÿ“Œ node-sass ์„ค์น˜ ์‹œ ๋ธŒ๋ผ์šฐ์ € ๋ฏธ๋ฆฌ๋ณด๊ธฐ์—์„œ ์—๋Ÿฌ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ฐธ๊ณ ํ•˜๊ธฐ

  • nodejs 14 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด node-sass ๋ฅผ ์ง€์› ๋‹ค๊ฐ€ 4.14 ๋ฒ„์ „์œผ๋กœ ์„ค์น˜ํ•ด์ค€๋‹ค.
// ์„ค์น˜๋œ node-sass ์ง€์šฐ๊ธฐ (์•„๋ž˜ ๋‘ ์ฝ”๋“œ ์ค‘ ํƒ 1)
npm uninstall node-sass
yarn remove node-sass

// node-sass 4.14 ๋ฒ„์ „ ์„ค์น˜ํ•˜๊ธฐ
npm install node-sass@4.14
  • nodejs 16 ๋ฒ„์ „ ์ด์ƒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰ํ•ด์ค€๋‹ค.
// 1. node-sass ๋กœ 6 ๋ฒ„์ „ ์„ค์น˜ํ•˜๊ธฐ (์•„๋ž˜ ๋‘ ์ฝ”๋“œ ์ค‘ ํƒ 1)
npm install node-sass@6
yarn add node-sass@6 

// 2. node_modules ํด๋”๋ž‘ yarn.lock ํ˜น์€ package-lock.json ๋ณด์ด๋Š”๊ฑธ ๋‹ค ์‚ญ์ œํ•˜๊ธฐ 

// 3. ํ„ฐ๋ฏธ๋„์—์„œ node_modules ํด๋” ์žฌ์„ค์น˜ ํ•ด์ฃผ๊ธฐ (์•„๋ž˜ ๋‘ ์ฝ”๋“œ ์ค‘ ํƒ 1)
npm install 
yarn install

๐Ÿค SASS ํŒŒ์ผ ์ƒ์„ฑํ•œ ํ›„ import ํ•ด๋ณด๊ธฐ

  • ๊ธฐ์กด์— css ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ import ํ•˜๋˜ ๋ฐฉ์‹๋Œ€๋กœ ํ•˜๋˜ ํŒŒ์ผ๋ช…๋งŒ scss ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
import './Detail.scss';
  • ๋‚˜์˜ ๊ฒฝ์šฐ Detail.scss ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค€ ํ›„ Detail.js ํŒŒ์ผ์— import ํ•ด์ฃผ์—ˆ๋‹ค.
  • ์ด์ œ scss ํŒŒ์ผ ๋‚ด์—์„œ SASS ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ €์žฅํ•˜๋ฉด ์ž๋™์œผ๋กœ css ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ๋œ๋‹ค.

๐Ÿ’œ SASS ๋ฌธ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

๐Ÿค $ ๋ณ€์ˆ˜ ๋ฌธ๋ฒ•

  • scss ํŒŒ์ผ์—์„œ๋Š” ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
$main-color : #484848;

.darkgrey {
  color : $main-color;
}
  • $๋ณ€์ˆ˜๋ช… : ์ง‘์–ด๋„ฃ์„ ๊ฐ’;
  • ์œ„์™€ ๊ฐ™์ด ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์›ํ•˜๋Š” ์ž๋ฆฌ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ณ€์ˆ˜๋ช…์€ ํ•œ๊ธ€๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ƒ‰์ƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ px๊ฐ’, %๊ฐ’ ๋“ฑ ๋‹ค์–‘ํ•˜๊ฒŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿค @import ๋ฌธ๋ฒ•

  • ์‚ฌ์‹ค css ๋ฌธ๋ฒ•์œผ๋กœ, css ํŒŒ์ผ ๊ฐ„ import ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ด๋‹ค.
import './Detail.css';
  • import ๋’ค์— ๋”ฐ์˜ดํ‘œ๋ฅผ ๋„ฃ์–ด ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

๐Ÿค nesting ๋ฌธ๋ฒ•

  • css ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋ฉด ํŠน์ • ์…€๋ ‰ํ„ฐ์˜ ํ•˜์œ„ ์…€๋ ‰ํ„ฐ์— ์Šคํƒ€์ผ๋ง์„ ์ฃผ๊ธฐ ์œ„ํ•ด ๊ธธ๊ณ  ๋ณต์žกํ•œ ์…€๋ ‰ํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
  • ๊ทธ๋ž˜์„œ scss ํŒŒ์ผ ์•ˆ์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
// css ํŒŒ์ผ์—์„œ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ
.my-alert {
	background: #eee;
	padding: 15px 20px;
	max-width: 500px;
	width: 100%;
	margin: auto;
}
 
.my-alert p {
	margin-bottom: 0;
}


// scss ํŒŒ์ผ์—์„œ nesting ๋ฌธ๋ฒ• ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ

.my-alert {
	background: #eee;
	padding: 15px 20px;
	max-width: 500px;
	width: 100%;
	margin: auto;

	p {
		margin-bottom: 0;
	}
}
  • ์œ„์™€ ๊ฐ™์ด ๊ธฐ์กด์˜ css ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์…€๋ ‰ํ„ฐ๋ฅผ ์ƒ์œ„ ์…€๋ ‰ํ„ฐ ํ•˜์œ„ ์…€๋ ‰ํ„ฐ๋ฅผ ์˜†์œผ๋กœ ๊ธธ๊ฒŒ ๋‚˜์—ดํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค๋ฉด, scss ์—์„œ๋Š” ์ƒ์œ„ ์…€๋ ‰ํ„ฐ ์•ˆ์ชฝ์— ํ•˜์œ„ ์…€๋ ‰ํ„ฐ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์…€๋ ‰ํ„ฐ์˜ ํ•ด์„์ด ์‰ฝ๊ณ  ๊ด€๋ จ๋œ class ๋ผ๋ฆฌ ํ•œ ๋ฉ์–ด๋ฆฌ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

๐Ÿค @extend ๋ฌธ๋ฒ•

.my-alert {
	background: #eee;
	padding: 15px 20px;
	max-width: 500px;
	width: 100%;
	margin: auto;

	p {
		margin-bottom: 0;
	}
}

 

function Detail(){
  return (
    <div className="container">
      <div className="my-alert">
        <p>์žฌ๊ณ ๊ฐ€ ์–ผ๋งˆ ๋‚จ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค</p>
      </div>
    </div>
  )
}
  • ์œ„์™€ ๊ฐ™์ด Detail.sccs ํŒŒ์ผ๊ณผ Detail.js ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋ฉด ํšŒ์ƒ‰ ์•Œ๋ฆผ์ฐฝ์ด ํ•˜๋‚˜ ์ƒ์„ฑ๋œ๋‹ค. 
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋Ÿฌํ•œ ์•Œ๋ฆผ์ฐฝ์„ ๋ฐฐ๊ฒฝ์ƒ‰๋งŒ ๋‹ค๋ฅด๊ฒŒ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?
  • .my-alert ๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐํ•˜์—ฌ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ทธ๋ณด๋‹ค ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์€ @extends ๋ฌธ๋ฒ•์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
.my-alert {
	background: #eee;
	padding: 15px 20px;
	max-width: 500px;
	width: 100%;
	margin: auto;

	p {
		margin-bottom: 0;
	}
}

.my-alert-gold {
	@extend .my-alert;
	background: gold;
}
  • ์œ„์™€ ๊ฐ™์ด ์ƒˆ๋กœ ๋งŒ๋“  ํด๋ž˜์Šค ์•ˆ์— @extend ๋ณต์‚ฌํ•ด์˜ฌ ํด๋ž˜์Šค๋ช… ์„ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์˜จ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ˆ˜์ •ํ•  ๋ถ€๋ถ„๋งŒ ์ƒˆ๋กœ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋ฎ์–ด์“ฐ๊ธฐ๊ฐ€ ๋˜์–ด gold ์ƒ‰์˜ ๋ฐฐ๊ฒฝ์„ ๊ฐ€์ง„ ์•Œ๋ฆผ์ฐฝ์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

๐Ÿค @mixin / @include ๋ฌธ๋ฒ•

  • mixin ์€ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๋ฌธ๋ฒ•์ด๋‹ค.
  • ์›๋ž˜ ํ•จ์ˆ˜ ๋ฌธ๋ฒ•์€ ์ฝ”๋“œ๋ฅผ ์ถ•์•ฝํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฐ SASS ์—์„œ๋Š” function ์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ ๋Œ€์‹ ์— @mixin ํ•จ์ˆ˜๋ช…() ์ด๋ผ๊ณ  ์ ์€ ํ›„ ์ค‘๊ด„ํ˜ธ ์•ˆ์— ์ถ•์•ฝํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ๋Š” @include ํ•จ์ˆ˜๋ช…() ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
@mixin alert() {
	background: #eee;
	padding: 15px 20px;
	max-width: 500px;
	width: 100%;
	margin: auto;
}

.my-alert {
	@include alert();

	p {
		margin-bottom: 0;
	}
}

.my-alert-gold {
	@extend .my-alert;
	background: gold;
}
  • ๋‹จ, JavaScript ๋ฌธ๋ฒ•๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ํ•จ์ˆ˜๋ช…์ด ์œ„์— ์„ ์–ธ์ด ๋˜์–ด์žˆ์–ด์•ผ ๋ฐ‘์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • JavaScript ์—์„œ์™€ ๋™์ผํ•˜๊ฒŒ ํ•จ์ˆ˜์— ํŒŒ๋ผ๋ฏธํ„ฐ๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ณ  ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

728x90
๋ฐ˜์‘ํ˜•