๐ CSS Module
CSS๋ฅผ ๋ถ๋ฌ์์ ์ฌ์ฉํ ๋ ํด๋์ค ์ด๋ฆ์ ๊ณ ์ ํ ๊ฐ, ์ฆ [ํ์ผ ์ด๋ฆ]_[ํด๋์ค ์ด๋ฆ]__[ํด์๊ฐ] ํํ๋ก ์๋์ผ๋ก ๋ง๋ค์ด์ ์ปดํฌ๋ํธ ์คํ์ผ ํด๋์ค ์ด๋ฆ์ด ์ค์ฒฉ๋๋ ํ์์ ๋ฐฉ์งํด ์ฃผ๋ ๊ธฐ์
โ๐ค CSS Module์ ์ฌ์ฉํ๋ ค๋ฉด?
๐ css-loader ์ค์ ์ ๋ณ๋๋ก ํด์ผ ํ์ง๋ง, v2 ๋ฒ์ ์ด์๋ถํฐ๋ ๋ฐ๋ก ์ค์ ํ ํ์ ์์ด .module.css ํ์ฅ์๋ก ํ์ผ์ ์ ์ฅํ๊ธฐ๋ง ํ๋ฉด CSS Module์ด ์ ์ฉ๋๋ค.
/* ์๋์ผ๋ก ๊ณ ์ ํด์ง ๊ฒ์ด๋ฏ๋ก ํํ ์ฌ์ฉ๋๋ ๋จ์ด๋ฅผ ํด๋์ค ์ด๋ฆ์ผ๋ก ๋ง์๋๋ก ์ฌ์ฉ ๊ฐ๋ฅ */
.wrapper {
background: black;
padding: 1rem;
color: white;
font-size: 2rem;
}
/* ๊ธ๋ก๋ฒ CSS๋ฅผ ์์ฑํ๊ณ ์ถ๋ค๋ฉด */
:global .something {
font-weight: 800;
color: aqua;
}CSS Module์ ์ฌ์ฉํ๋ฉด ํด๋์ค ์ด๋ฆ์ ์ง์ ๋ ๊ณ ์ ์ฑ์ ๋ํด ๊ณ ๋ฏผํ์ง ์์๋ ๋๋ค. ํํ ์ฌ์ฉํ๋ ๋จ์ด๋ก ์ด๋ฆ์ ์ง์ด๋ ๋ฌธ์ ๋์ง ์๋๋ค. ํด๋น ํด๋์ค๋ ๋ฐฉ๊ธ ๋ง๋ ์คํ์ผ์ ์ง์ ๋ถ๋ฌ์จ ์ปดํฌ๋ํธ ๋ด๋ถ์์๋ง ์๋ํ๊ธฐ ๋๋ฌธ!
๋ง์ฝ ํน์ ํด๋์ค๊ฐ ์น ํ์ด์ง์์ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๋ผ๋ฉด :global์ ์์ ์ ๋ ฅํ์ฌ ๊ธ๋ก๋ฒ CSS์์ ๋ช ์ํด ์ค ์ ์๋ค.
import styles from './CSSModule.module.css';
const CSSModule = () => {
return (
<div className={styles.wrapper}>
์๋
ํ์ธ์, ์ ๋ <span className="something">CSS Module!</span>
</div>
);
};
export default CSSModule;CSS Module์ด ์ ์ฉ๋ ์คํ์ผ ํ์ผ์ ๋ถ๋ฌ์ค๋ฉด ๊ฐ์ฒด๋ฅผ ํ๋ ์ ๋ฌ๋ฐ๊ฒ ๋๋๋ฐ CSS Module์์ ์ฌ์ฉํ ํด๋์ค ์ด๋ฆ๊ณผ ํด๋น ์ด๋ฆ์ ๊ณ ์ ํํ ๊ฐ์ด ํค-๊ฐ ํํ๋ก ๋ค์ด ์๋ค.
// ์: ์ ์ฝ๋์์ console.log(styles)๋ฅผ ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋จ.
{ wrapper: "CSSModule_wrapper__1SbdQ" }
์ฐ๋ฆฌ๊ฐ ์ง์ ํ ํด๋์ค ์ด๋ฆ ์๋ค๋ก ํ์ผ ์ด๋ฆ๊ณผ ํด์๊ฐ์ด ๋ถ์.
์ด ๊ณ ์ ํ ํด๋์ค ์ด๋ฆ์ ์ฌ์ฉํ๋ ค๋ฉด ํด๋์ค๋ฅผ ์ ์ฉํ๊ณ ์ถ์ JSX ์๋ฆฌ๋จผํธ์ className= {styles.[ํด๋์ค ์ด๋ฆ]} ํํ๋ก ์ ๋ฌํด ์ฃผ๋ฉด ๋๋ค. :global์ ์ฌ์ฉํ์ฌ ์ ์ญ์ ์ผ๋ก ์ ์ธํ ํด๋์ค์ ๊ฒฝ์ฐ ํ์์ ํด ์๋ ๊ฒ์ฒ๋ผ ๊ทธ๋ฅ ๋ฌธ์์ด๋ก ๋ฃ์ด์ค๋ค.
CSSModule ๊ด๋ จ ์ปดํฌ๋ํธ์ ์คํ์ผ์ ๋ชจ๋ ์์ฑํ๋ค๋ฉด App ์ปดํฌ๋ํธ์์ ๋ ๋๋งํด๋ณด์.
// App.js
import React, { Component } from 'react';
import CSSModule from './CSSModule';
class App extends Component {
render() {
return (
<div>
<CSSModule />
</div>
);
}
}
export default App;

/* ์๋์ผ๋ก ๊ณ ์ ํด์ง ๊ฒ์ด๋ฏ๋ก ํํ ์ฌ์ฉ๋๋ ๋จ์ด๋ฅผ ํด๋์ค ์ด๋ฆ์ผ๋ก ๋ง์๋๋ก ์ฌ์ฉ ๊ฐ๋ฅ */
.wrapper {
background: black;
padding: 1rem;
color: white;
font-size: 2rem;
}
.inverted {
color: black;
background: white;
border: 1px solid black;
}
/* ๊ธ๋ก๋ฒ CSS๋ฅผ ์์ฑํ๊ณ ์ถ๋ค๋ฉด */
:global .something {
font-weight: 800;
color: aqua;
} import styles from './CSSModule.module.css';
const CSSModule = () => {
return (
<div className={`${styles.wrapper} ${styles.inverted}`}>
์๋
ํ์ธ์, ์ ๋ <span className="something">CSS Module!</span>
</div>
);
};
export default CSSModule; 
์ ์ฝ๋์์๋ ES6 ๋ฌธ๋ฒ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด(Template Literal)์ ์ฌ์ฉํด ๋ฌธ์์ด์ ํฉํด ์คฌ๋ค. ์ด ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ฌธ์์ด ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ ํผ๋ฐ์ค๋ฅผ ์ฝ๊ฒ ๋ฃ์ด ์ค ์ ์๋ค.
const name = '๋ฆฌ์กํธ';
// const message = '์ ์ด๋ฆ์ ' + name + '์
๋๋ค.'
const message = `์ ์ด๋ฆ์ ${name}์
๋๋ค.`;
์ฌ๊ธฐ์ ์ฌ์ฉ๋๋ ๋ฌธ์๋ ๋ฐฑํฑ(Backtick)์ด๋ผ๊ณ ๋ถ๋ฅด๊ณ , ํค๋ณด๋์์ ์ซ์ํค 1 ์ผ์ชฝ์ ์๋ 'ํค์ด๋ค.
CSS Module ํด๋์ค๋ฅผ ์ฌ๋ฌ ๊ฐ ์ฌ์ฉํ ๋ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด ๋ฌธ๋ฒ์ ์ฌ์ฉํ๊ณ ์ถ์ง ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์๋ ์๋ค.
className={[styles.wrapper, styles.inverted].join(' ')}