|
| 1 | +# CSS Modules |
| 2 | + |
| 3 | +> requires ^9.8.0 |
| 4 | +
|
| 5 | +[CSS Modules](https://github.com/css-modules/css-modules)์ CSS์ ๋ชจ๋ํํ๊ณ ๊ตฌ์ฑํ๋๋ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์์คํ
์
๋๋ค. `vue-loader`๋ ์ค๋ฎฌ๋ ์ดํธ๋ ๋ฒ์ CSS์ ๋์์ผ๋ก CSS Modules์ ํจ๊ป first-class intergration์ ์ ๊ณตํฉ๋๋ค. |
| 6 | + |
| 7 | +### ์ฌ์ฉ๋ฒ |
| 8 | + |
| 9 | +`<style>`์ `moudle` ์์ฑ์ ์ฝ์
ํ๋๋ค. |
| 10 | + |
| 11 | +``` html |
| 12 | +<style module> |
| 13 | +.red { |
| 14 | + color: red; |
| 15 | +} |
| 16 | +.bold { |
| 17 | + font-weight: bold; |
| 18 | +} |
| 19 | +</style> |
| 20 | +``` |
| 21 | + |
| 22 | +์ด๋ ๊ฒํ๋ฉด `css-loader`์ ๋ํ CSS Modules ๋ชจ๋๊ฐ ์ผ์ง๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ํด๋์ค ์๋ณ์ ์ค๋ธ์ ํธ๋ `$style` ์ด๋ฆ์ ๊ณ์ฐ๋ ์์ฑ์ผ๋ก ์ปดํฌ๋ํธ์ ์ฃผ์
๋ฉ๋๋ค. ๋น์ ์ ๋์ ํด๋์ค ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ์ฌ ํ
ํ๋ฆฟ์์ ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
| 23 | + |
| 24 | +``` html |
| 25 | +<template> |
| 26 | + <p :class="$style.red"> |
| 27 | + ์ด๊ฒ์ ๋นจ๊ฐ์์ด์ผ |
| 28 | + </p> |
| 29 | +</template> |
| 30 | +``` |
| 31 | + |
| 32 | +๊ทธ๊ฒ์ ๊ณ์ฐ๋ ์์ฑ์ด๊ธฐ ๋๋ฌธ์ `:class`์ ์ค๋ธ์ ํธ/๋ฐฐ์ด ๋ฌธ๋ฒ์๋ ์๋ํฉ๋๋ค. |
| 33 | + |
| 34 | +``` html |
| 35 | +<template> |
| 36 | + <div> |
| 37 | + <p :class="{ [$style.red]: isRed }"> |
| 38 | + ๋๋ ๋นจ๊ฐ์์ด์ผ? |
| 39 | + </p> |
| 40 | + <p :class="[$style.red, $style.bold]"> |
| 41 | + ๋๋ ๋นจ๊ฐ์์ด๋ฉด์ ๋ณผ๋์ผ |
| 42 | + </p> |
| 43 | + </div> |
| 44 | +</template> |
| 45 | +``` |
| 46 | + |
| 47 | +๋ํ JavaScript์์๋ ์ ๊ทผํ ์ ์์ต๋๋ค. |
| 48 | + |
| 49 | +``` html |
| 50 | +<script> |
| 51 | +export default { |
| 52 | + created () { |
| 53 | + console.log(this.$style.red) |
| 54 | + // -> "_1VyoJ-uZOjlOxP7jWUy19_0" |
| 55 | + // ํ์ผ ์ด๋ฆ๊ณผ className์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ ์๋ณ์ |
| 56 | + } |
| 57 | +} |
| 58 | +</script> |
| 59 | +``` |
| 60 | + |
| 61 | +[global exceptions](https://github.com/css-modules/css-modules#exceptions)๊ณผ [composition](https://github.com/css-modules/css-modules#composition) ๊ฐ์ ์์ธํ ์ ๋ณด๋ [CSS Modules ์คํ](https://github.com/css-modules/css-modules)์ ์ฐธ๊ณ ํ์ธ์. |
| 62 | + |
| 63 | +### ์์ฑ ์ด๋ฆ ์ปค์คํฐ๋ง์ด์ง |
| 64 | + |
| 65 | +ํ๋์ `*.vue` ์ปดํฌ๋ํธ ๋ด์ ํ๋ ์ด์์ `<style>` ํ๊ทธ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ฝ์
๋ ์คํ์ผ์ด ์๋ก ๋ฎ์ด ์ฐ์ง ์๊ฒํ๋ ค๋ฉด `module` ์์ฑ์ ๊ฐ์ ์ง์ ํ์ฌ ๊ณ์ฐ๋ ์์ฑ์ ์ด๋ฆ์ ์ปค์คํฐ๋ง์ด์งํ ์ ์์ต๋๋ค. |
| 66 | + |
| 67 | +``` html |
| 68 | +<style module="a"> |
| 69 | + /* a๋ก ์ฃผ์
๋ ์๋ณ์ */ |
| 70 | +</style> |
| 71 | + |
| 72 | +<style module="b"> |
| 73 | + /* b๋ก ์ฃผ์
๋ ์๋ณ์ */ |
| 74 | +</style> |
| 75 | +``` |
| 76 | + |
| 77 | +### `css-loader` ์ฟผ๋ฆฌ ์ค์ |
| 78 | + |
| 79 | +CSS Modules๋ [css-loader](https://github.com/webpack/css-loader)๋ฅผ ํตํด ์ฒ๋ฆฌ๋ฉ๋๋ค. `<style module>`์ ์ฌ์ฉํ๋ฉด `css-loader`์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ์ ์ธ ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. |
| 80 | + |
| 81 | +``` js |
| 82 | +{ |
| 83 | + modules: true, |
| 84 | + importLoaders: true, |
| 85 | + localIdentName: '[hash:base64]' |
| 86 | +} |
| 87 | +``` |
| 88 | + |
| 89 | +๋น์ ์ vue-loader์ `cssModules` ์ต์
์ ์ฌ์ฉํ์ฌ `css-loader`์ ์ถ๊ฐ์ ์ธ ์ฟผ๋ฆฌ ์ต์
์ ์ ๊ณตํ ์ ์์ต๋๋ค. |
| 90 | + |
| 91 | +``` js |
| 92 | +// webpack 1 |
| 93 | +vue: { |
| 94 | + cssModules: { |
| 95 | + // ๋ก์ปฌ ID๊ฐ์ ๋ฎ์ด์์๋๋ค. |
| 96 | + localIdentName: '[path][name]---[local]---[hash:base64:5]', |
| 97 | + // enable camelCase |
| 98 | + camelCase: true |
| 99 | + } |
| 100 | +} |
| 101 | + |
| 102 | +// webpack 2 |
| 103 | +module: { |
| 104 | + rules: [ |
| 105 | + { |
| 106 | + test: '\.vue$', |
| 107 | + loader: 'vue', |
| 108 | + options: { |
| 109 | + cssModules: { |
| 110 | + localIdentName: '[path][name]---[local]---[hash:base64:5]', |
| 111 | + camelCase: true |
| 112 | + } |
| 113 | + } |
| 114 | + } |
| 115 | + ] |
| 116 | +} |
| 117 | +``` |
0 commit comments