Next.js: [RFC] CSS ์ง€์›

์— ๋งŒ๋“  2019๋…„ 09์›” 04์ผ  ยท  60์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: vercel/next.js

๋ชฉํ‘œ

  • ์ „์—ญ CSS ํšจ๊ณผ ์ง€์› (์˜ˆ : Bootstrap, Normalize.css, UX ์ œ๊ณต ๋“ฑ)
  • ์•ˆ์ •์ ์ธ ๊ตฌ์„ฑ ์š”์†Œ ์ˆ˜์ค€ CSS ์ง€์›
  • ๊ฐœ๋ฐœ ์ค‘ ํ•ซ ๋ฆฌ๋กœ๋“œ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ (ํŽ˜์ด์ง€ ์ƒˆ๋กœ ๊ณ ์นจ ๋˜๋Š” ์ƒํƒœ ์†์‹ค ์—†์Œ)
  • ํ”„๋กœ๋•์…˜์—์„œ ์ค‘์š”ํ•œ CSS ์ถ”์ถœ์„์œ„ํ•œ ์ฝ”๋“œ ๋ถ„ํ•  ๊ฐ€๋Šฅ
  • ์ด๋ฏธ ์ต์ˆ™ํ•œ ๊ธฐ์กด ๊ทœ์น™์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : Create React App).
  • ๊ธฐ์กด styled-jsx ์ง€์› ์œ ์ง€, ์ž ์žฌ์ ์œผ๋กœ ๋” ์ตœ์ ํ™” ๋จ

๋ฐฐ๊ฒฝ

CSS๋ฅผ JavaScript ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์€ Webpack๊ณผ ๊ฐ™์€ ํ˜„๋Œ€ ๋ฒˆ ๋“ค๋Ÿฌ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๊ด€ํ–‰์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ CSS ๊ฐ€์ ธ ์˜ค๊ธฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๊นŒ๋‹ค ๋กญ์Šต๋‹ˆ๋‹ค. JavaScript์™€ ๋‹ฌ๋ฆฌ ๋ชจ๋“  CSS๋Š” ์ „์—ญ ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฒˆ๋“ค๋ง์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์Šคํƒ€์ผ์ด ํŽ˜์ด์ง€ ๋‹น CSS ํŒŒ์ผ์—์„œ ๋ถ„๋ฆฌ๋˜๊ณ ๋กœ๋“œ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€ ๊ฐ„์˜ ๋ฒˆ๋“ค๋ง์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ์ธก์ •์œผ๋กœ Next.js์˜ 50 % ์ด์ƒ ์‚ฌ์šฉ์ž๋Š” ๋ฒˆ๋“ค๋กœ ์›นํŒฉ์„ ์‚ฌ์šฉํ•˜์—ฌ .css , ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ†ตํ•ด @zeit/next-css , @zeit/next-sass , @zeit/next-less , ๋˜๋Š” ๋งž์ถค ์„ค์ •. ์ด๊ฒƒ์€ ๊ธฐ์—…๊ณผ์˜ ๋Œ€ํ™”๋ฅผ ํ†ตํ•ด ๋”์šฑ ๊ฒ€์ฆ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” CSS ๊ฐ€์ ธ ์˜ค๊ธฐ๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์Šคํƒ€์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๋‹ค๋ฅธ ์ผ๋ถ€๋Š” ์ „์—ญ ์Šคํƒ€์ผ์— ์‚ฌ์šฉํ•˜๊ณ  CSS-in-JS ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์Šคํƒ€์ผ๋งํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ CSS๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜์žˆ๋Š” ์„ธ ๊ฐ€์ง€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์ง€๋งŒ CSS ์ˆœ์„œ ๋ฐ ํŠน์ •๋กœ๋“œ ๋ฌธ์ œ์— ๊ณตํ†ต์  ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” @zeit/next-css ๊ฐ€ ์ „์—ญ ์Šคํƒ€์ผ์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ธ€๋กœ๋ฒŒ CSS๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ / JavaScript ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ CSS๋ฅผ ๋” ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก CSS ๊ฐ€์ ธ ์˜ค๊ธฐ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ œ๊ณต ์ง€์›์„ ๋„์ž… ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋นŒ๋“œ ์‹œ๊ฐ„ ๋˜๋Š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ ํ—ค๋“œ๊ฐ€์—†๋Š” styled-jsx ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋…ธ๋ ฅ์„ ํ†ตํ•ด ์†”๋ฃจ์…˜์˜ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„  ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ ์ฒญ

Next.js๋Š” ์ตœ์‹  CSS๋ฅผ ์ง€์›ํ•˜๊ณ  ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ํ•˜์œ„ ์ˆ˜์ค€์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ตœ์‹  JavaScript๋ฅผ ์ง€์›ํ•˜๊ณ ์ด๋ฅผ ES5๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ์ค‘์— JavaScript ํ•ซ ๋ฆฌ๋กœ๋”ฉ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ CSS ํŽธ์ง‘์ด ์ž๋™์œผ๋กœ ์ ์šฉ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๋•์…˜์—์„œ ๋ชจ๋“  CSS๋Š” JavaScript ๋ฒˆ๋“ค์—์„œ ์™„์ „ํžˆ ์ถ”์ถœ ๋˜์–ด .css ํŒŒ์ผ๋กœ ๋‚ด๋ณด๋‚ด ์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ์ด .css ๋Š” ์ฝ”๋“œ ๋ถ„ํ•  (๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ)์ด์–ด์•ผ ํŽ˜์ด์ง€๋กœ๋“œ์‹œ ์ค‘์š” ๊ฒฝ๋กœ CSS ๋งŒ ๋‹ค์šด๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

์ „์—ญ CSS

Next.js๋Š” ์‚ฌ์šฉ์ž ์ •์˜ pages/_app.js ๋‚ด์—์„œ๋งŒ ์ „์—ญ CSS ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์—ญ CSS ๋ฅผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์–ด๋Š ๊ณณ์—์„œ๋‚˜ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ CSS์˜ ๊ณ„๋‹จ์‹ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ์ฝ”๋“œ๊ฐ€ ๋ถ„ํ•  ๋  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ ์ด๋Š” ๋งค์šฐ ์ค‘์š”ํ•œ ์ฐจ์ด์  (๋ฐ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„ ์›Œํฌ์˜ ๋””์ž์ธ ๊ฒฐํ•จ)์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์˜๋„์  ์ธ ์ œ์•ฝ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ „์—ญ CSS๋ฅผ ๊ฐ€์ ธ ์˜ค๋ฉด ํ•œ ํŽ˜์ด์ง€์—์„œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ

/* styles.css */
.red-text {
  color: red;
}
// pages/_app.js
import '../styles.css'

export default () => <p className="red-text">Hello, with red text!</p>

๊ตฌ์„ฑ ์š”์†Œ ์ˆ˜์ค€ CSS

Next.js๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ˆœ์ˆ˜ํ•œ CSS ๋ชจ๋“ˆ์„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์–ด๋Š ๊ณณ์—์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ ์ˆ˜์ค€ CSS๋Š” CSS ๋ชจ๋“ˆ ์‚ฌ์–‘ ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์˜๋„๋ฅผ ๋‚˜ํƒ€ ๋‚ด๊ธฐ ์œ„ํ•ด CSS ํŒŒ์ผ .module.css ๋ช…๋ช… ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผํ•ฉ๋‹ˆ๋‹ค.

:global() CSS ๋ชจ๋“ˆ ์ง€์ •์ž๋Š” ๋กœ์ปฌ ํด๋ž˜์Šค ์ด๋ฆ„ (์˜ˆ : .foo :global(.bar) { ... } ๊ณผ ๊ฒฐํ•ฉ ๋  ๋•Œ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ

/* components/button.module.css */
.btnLarge {
  padding: 2rem 1rem;
  font-size: 1.25rem;
}

.foo :global(.bar) {
  /* this is allowed as an escape hatch */
  /* (useful when controlling 3rd party libraries) */
}

:global(.evil) {
  /* this is not allowed */
}
/* components/button.js */
import { btnLarge } from './button.module.css'

// import '../styles.css'; // <-- this would be an error

export function Button({ large = false, children }) {
  return (
    <button
      className={
        large
          ? // Imported from `button.module.css`: a unique class name (string).
            btnLarge
          : ''
      }
    >
      {children}
    </button>
  )
}

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ํ•˜๋“  ์šฐ๋ฆฌ๋Š” @zeit/next-css ์™€ ๊ฐ™์ด ์‚ฌ์šฉ์ž ์ •์˜ PostCSS ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด์— ๋Œ€ํ•œ ์ง€์›์„ ์žƒ๋Š”๋‹ค๋ฉด ์ •๋ง ๋ถ€๋„๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค. CRA๋Š”์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Tailwind CSS์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์—์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • Autoprefixer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ธ‰ ์—…์ฒด๋ณ„ ์ ‘๋‘์‚ฌ๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ (๋ ˆ๊ฑฐ์‹œ Flexbox ์ง€์› ์—†์Œ)
  • ๋™๋“ฑํ•œ ๊ธฐ๋Šฅ์œผ๋กœ Stage 3+ CSS ๊ธฐ๋Šฅ์„ ํด๋ฆฌ ํ•„ ๋˜๋Š” ์ปดํŒŒ์ผ
  • ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์•Œ๋ ค์ง„ "flexbugs"๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ •

...์ด ๋ชจ๋“  ์ž‘์—…์€ PostCSS๋กœ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— PostCSS ํ”Œ๋Ÿฌ๊ทธ์ธ ์ˆœ์„œ๋Š” ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ์„ธ ๊ฐ€์ง€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ postcss.config.js ํŒŒ์ผ์„ ์ œ๊ณตํ•˜์—ฌ ๊ธฐ๋ณธ PostCSS ๊ตฌ์„ฑ์„ ์™„์ „ํžˆ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ˆ˜๋™์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•˜์ง€๋งŒ ์ œ ์ƒ๊ฐ์—๋Š” ๊ทธ ์ˆ˜์ค€์˜ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

TL; DR์€ ์‚ฌ์šฉ์ž๊ฐ€ PostCSS๋ฅผ ์™„์ „ํžˆ ์ œ์–ด ํ•  ์ˆ˜์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๋„๋ก์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค. ๋ฌธ์ž ๊ทธ๋Œ€๋กœ CRA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ Next๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋งค์šฐ ์Šฌํ”•๋‹ˆ๋‹ค.

๋ชจ๋“  60 ๋Œ“๊ธ€

.module.scss ๋„ ์ž‘๋™ํ•˜๋Š” ํ˜„์žฌ ์ง€์›๋˜๋Š” CSS ๋ชจ๋“ˆ ๋ฒ„์ „์œผ๋กœ ์ด๋ฏธ ์ž‘์—…์ค‘์ธ @zeit/next-sass ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์ถ”์ธกํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด "์ˆœ์ˆ˜ํ•œ CSS ๋ชจ๋“ˆ"์ด .module.css ๋งŒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

Sass ์ง€์›์€ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์ค‘๋‹จํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด RFC (๋‚ด์žฅ ์ง€์›)๋ฅผ ์œ„ํ•ด @zeit/next-css/sass/less/stylus ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ sass๊ฐ€ ์ฝ”์–ด์™€ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ผ๋ถ€๊ฐ€ ๋  ์ •๋„์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ํ˜„์žฌ ์ƒ๊ฐ์€ node-sass ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด sass ์ง€์›์ด ํ™œ์„ฑํ™”๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. TypeScript์—์„œํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ข…์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๊ธฐ๋ณธ ๋ฐ”์ธ๋”ฉ ๋“ฑ์œผ๋กœ ์ธํ•ด ์„ค์น˜ ์†๋„๊ฐ€ ๋งค์šฐ ํฌ๊ณ  ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์‹ ๋‚œ๋‹ค! ๋‚˜๋Š” ์˜ค๋Š˜์ฒ˜๋Ÿผ ์ถฉ๋Œํ•˜๋Š” CSS ํด๋ž˜์Šค ์ด๋ฆ„์— ๊ฑธ๋ ค ๋„˜์–ด์กŒ๋‹ค!

์งˆ๋ฌธ, TypeScript์™€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ CSS-๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•˜์ง€ ์•Š์€ ํ•œ ๊ฐ€์ง€ ์ด์œ ๋Š” ์ฆ‰, CSS ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์€ ๋ชจ๋“  ๊ฐ์ฒด ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (๊ฐ™์€, ์–ด์ฉŒ๋ฉด ์•ฝ๊ฐ„์˜ ๋งˆ๋ฒ•์„ .foo-bar ํ•„๋“œ๊ฐ€ ํ˜ธ์ถœ ๋  ๊ฒƒ์ด๋‹ค fooBar ?) TS ์นœํ™”์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Next๋Š” ์ด์ œ ๊ธฐ๋ณธ์ ์œผ๋กœ TS์ด๋ฏ€๋กœ์ด ๋ฌธ์ œ์—์„œ ๋” ์ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

"์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์•Œ๋ ค์ง„ ํ”Œ๋ ‰์Šค ๋ฒ„๊ทธ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ •"ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

css ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” npm์˜ ํƒ€์‚ฌ ๊ตฌ์„ฑ ์š”์†Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ํ™˜๊ฒฝ (์˜ˆ : create-react-app)๊ณผ nextjs ํ™˜๊ฒฝ์—์„œ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ๋ ๋‚ ๊นŒ ๋‘๋ ต์Šต๋‹ˆ๋‹ค.

@TheHolyWaffle์€ ์•Œ๋ ค์ง„ flexbug๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๋” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋™์ž‘์„ ์ƒ์„ฑํ•˜๋ฉฐ Create React App์ดํ•˜๋Š” ์ผ์ด๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค.

@zenozen CSS ๋ชจ๋“ˆ ์‚ฌ์–‘์— ๋”ฐ๋ผ camelcase์— ๋Œ€ํ•œ ๋ฉ‹์ง„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹œ ( class-name )์™€ ํ•จ๊ป˜ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ์ฒด์—์„œ ๋ช…์‹œ ์ ์œผ๋กœ ์•ก์„ธ์Šคํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ

import Everything from './file.module.css'

// later on

Everything['class-name']

TS์˜ ๊ฒฝ์šฐ ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋งˆ๋ฒ•์„ ๊ณ„ํšํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌ ํ•  TS ์œ ํ˜•์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

declare module '*.module.css' {
  const classes: { readonly [key: string]: string };
  export default classes;
}

declare module '*.module.scss' {
  const classes: { readonly [key: string]: string };
  export default classes;
}

declare module '*.module.sass' {
  const classes: { readonly [key: string]: string };
  export default classes;
}

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ํ•˜๋“  ์šฐ๋ฆฌ๋Š” @zeit/next-css ์™€ ๊ฐ™์ด ์‚ฌ์šฉ์ž ์ •์˜ PostCSS ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด์— ๋Œ€ํ•œ ์ง€์›์„ ์žƒ๋Š”๋‹ค๋ฉด ์ •๋ง ๋ถ€๋„๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค. CRA๋Š”์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Tailwind CSS์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์—์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • Autoprefixer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ธ‰ ์—…์ฒด๋ณ„ ์ ‘๋‘์‚ฌ๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ (๋ ˆ๊ฑฐ์‹œ Flexbox ์ง€์› ์—†์Œ)
  • ๋™๋“ฑํ•œ ๊ธฐ๋Šฅ์œผ๋กœ Stage 3+ CSS ๊ธฐ๋Šฅ์„ ํด๋ฆฌ ํ•„ ๋˜๋Š” ์ปดํŒŒ์ผ
  • ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์•Œ๋ ค์ง„ "flexbugs"๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ •

...์ด ๋ชจ๋“  ์ž‘์—…์€ PostCSS๋กœ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— PostCSS ํ”Œ๋Ÿฌ๊ทธ์ธ ์ˆœ์„œ๋Š” ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ์„ธ ๊ฐ€์ง€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ postcss.config.js ํŒŒ์ผ์„ ์ œ๊ณตํ•˜์—ฌ ๊ธฐ๋ณธ PostCSS ๊ตฌ์„ฑ์„ ์™„์ „ํžˆ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ˆ˜๋™์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•˜์ง€๋งŒ ์ œ ์ƒ๊ฐ์—๋Š” ๊ทธ ์ˆ˜์ค€์˜ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

TL; DR์€ ์‚ฌ์šฉ์ž๊ฐ€ PostCSS๋ฅผ ์™„์ „ํžˆ ์ œ์–ด ํ•  ์ˆ˜์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๋„๋ก์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค. ๋ฌธ์ž ๊ทธ๋Œ€๋กœ CRA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ Next๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋งค์šฐ ์Šฌํ”•๋‹ˆ๋‹ค.

Seconding @ adamwathan- ์—ฌ๊ธฐ์—์„œ postcss ์˜ต์…˜ ์‚ฌ์šฉ์ž ์ •์˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์–ป๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. postcss.config.js ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ด postcss ๊ตฌ์„ฑ์„ ์ˆ˜์ •ํ•  ์ˆ˜์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์œผ๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ๊ณต์œ  ๋œ ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ ํŒŒ์ผ์—†์ด ์‰ฝ๊ฒŒ ์‚ฝ์ž… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  CSS ๊ฐ€์ ธ ์˜ค๊ธฐ ( .module ์ ‘๋ฏธ์‚ฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ)์— ๋Œ€ํ•ด CSS ๋ชจ๋“ˆ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ธ€๋กœ๋ฒŒ๋กœ ๋งŒ๋“ค๊ณ ์žํ•˜๋Š” ๊ฒƒ์€ .global ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ง€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

CSS ๋ชจ๋“ˆ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์œ ์ง€ ์ƒ๊ฐ *.module.(css|scss) ๊ฐ€์™€ ์ •๋ ฌ์ฒ˜๋Ÿผ ์‚ฌ์–‘์ด๋˜์–ด ๋ฒŒ๊ธˆ์„ create-react-app , ํƒ€์ดํ”„ ๋ผ์ดํ„ฐ typings ์ˆ˜ ์žˆ๋„๋ก, ์ƒˆ๋กœ์šด Next.js์— ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์‰ฝ๊ฒŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ๊ฐ€๋Šฅ

typescript๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด typed-css-modules ๋ฐ typed-scss-modules๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  *.(css|scss) ํŒŒ์ผ์— ๋Œ€ํ•ด *.d.ts ์ž…๋ ฅ์„ ์ƒ์„ฑํ•˜์—ฌ CSS ๋ชจ๋“ˆ ์ž…๋ ฅ์„ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค *.(css|scss) ์—ฌ์ „ํžˆ ์ž๋™ ์™„์„ฑ์„ ์›ํ•˜๋ฉด ๋‹ค์Œ VS Code ํ™•์žฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://marketplace.visualstudio.com/items?itemName=clinyong.vscode-css-modules

@adamwathan ์€ PostCSS ๊ตฌ์„ฑ์„ ํ—ˆ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. _exact_ ๊ตฌํ˜„์ด ์•„์ง ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€ ํ™•์‹  ํ•  ์ˆ˜ ์—†์ง€๋งŒ CSS ํ’€ ์š”์ฒญ์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‚˜ํƒ€๋‚˜์•ผํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋‹จํ•ฉ๋‹ˆ๋‹ค !! ์ด์— ๋Œ€ํ•œ ํƒ€์ž„ ๋ผ์ธ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ฌํ•ด๋„ ์ผ์–ด๋‚˜๋‚˜์š”?

@andreisoare ์šฐ๋ฆฌ๋Š”์ด RFC์˜ ์ „์ฒด ์ ˆ๋ฐ˜์„ ๋ณ‘ํ•ฉํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค : https://github.com/zeit/next.js/pull/8710

์šฐ๋ฆฌ๋Š” CSS ๋ชจ๋“ˆ ์ง€์› ASAP๋ฅผ ๊ณ„์†ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

@adamwathan @Timer ๋Š” ์šฐ๋ฆฌ๊ฐ€ next-sass ๋กœ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ์—์„œ ๊ธฐ์กด์˜ postcss.config.js ํŒŒ์ผ์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ํ•ต์‹ฌ์ด๋˜๋Š” ๊ฒƒ์„ ๋ณด๋‹ˆ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์ด RFC์—์„œ AMP ์ค‘์š” ๊ฒฝ๋กœ ๋ Œ๋”๋ง์„ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ?

๊ธฐ๋ก์„ ์œ„ํ•ด, ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด styled-jsx๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. CSS, html, js๋ฅผ ํ•˜๋‚˜์˜ ์•„์ด๋””์–ด, ์ปดํฌ๋„ŒํŠธ๋กœ ์บก์Šํ™” ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ์ด๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด (์ด๊ฒƒ์€ ๋ฉ”์ธํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹Œ next.js ์‚ฌ์šฉ์ž๋ฅผ์œ„ํ•œ ๋ฉ”๋ชจ์ž…๋‹ˆ๋‹ค) ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ๊ณผ ๊ฐ™์€ ์ „์ฒด CSS UI ํ‚คํŠธ๋ฅผ ๊ตฌ๋งคํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. 1 ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ํ•„์š”์— ๋งž์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์™ธ๋ถ€ CSS ์˜์กด์„ฑ์˜ ์ง์„ ๋‹ค๋ฃฐ ๋ถ€๋‹ด์—†์ด ๊ทธ๊ฒƒ์„ ๋˜์ ธ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

CSS๋Š” ์ข…์ข… ์˜คํ•ด๋ฅผ ๋ฐ›๊ฑฐ๋‚˜ ๋‚˜์ค‘์— ์ƒ๊ฐํ•˜๊ณ  ์ข…์ข… ๊ฐœ๋ฐœ์ž ์ž‘์—…์˜ ๊ณจ์นซ๊ฑฐ๋ฆฌ๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์—์ด ์ง€์‹์„ ์ „ํŒŒํ•˜๋Š” ๊ฒƒ๋„ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ์ ˆํ•œ ์ถ”์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ œ๋กœ ์ถ”๋ก ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

"๋งŽ์€ ์‚ฌ๋žŒ๋“ค"์ด CSS๋ฅผ ๊ฐ€์ ธ ์™”๋‹ค๊ณ ํ•ด์„œ ์ข‹์€ ์ƒ๊ฐ์€ ์•„๋‹™๋‹ˆ๋‹ค.

react์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ์  ์ค‘ ํ•˜๋‚˜๋Š” CSS, HTML ๋ฐ JS๋ฅผ ์บก์Šํ™”ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. CSS๋ฅผ ์‚ฌ์ด๋“œ๋กœ๋“œ (๊ฐ€์ ธ ์˜ค๊ธฐ)ํ•˜๋ฉด ๋ฆฌ ์•กํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ก์„ ์œ„ํ•ด : CSS-in-CSS (๋˜๋Š” HTML)๋Š” ์Šคํƒ€์ผ์„์œ„ํ•œ ํ›จ์”ฌ ๋” ํšจ์œจ์ ์ธ ์ „์†ก ๊ณ„์ธต์ด๋ฉฐ, js์™€ ์Šคํƒ€์ผ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด ํ•˜๋‚˜์˜ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋”์šฑ์ด-๋งˆ์ง€๋ง‰ ์„ธ๋Œ€์˜ CSS-in-JS์˜ ๋Œ€๋ถ€๋ถ„์€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๋นŒ๋“œ์‹œ CSS๋ฅผ CSS๋กœ ์ถ”์ถœํ•˜๋ฏ€๋กœ ์ •์  CSS์˜ ์ ์ ˆํ•œ ๊ด€๋ฆฌ๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜-์ด๋Ÿฌํ•œ ์ถ”์ถœ์ด Next์—์„œ ์ง€์›๋˜๋Š” ๋ฐฉ์‹์€ ์•„์ง ๊ณต๊ฐœ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ก์„ ์œ„ํ•ด : smile :: Bootstrap๊ณผ ๊ฐ™์€ ํ”„๋ ˆ์ž„ ์›Œํฌ์—์„œ SASS, LESS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ค‘์š”ํ•˜๋ฉฐ ์ •๋ง ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ์บก์Šํ™”๋Š” JS ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. BEM์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

@timer ์ด๊ฒƒ์˜ ์ „๋ฐ˜๋ถ€ (https://github.com/zeit/next.js/pull/8710)๋Š” ์ด์ œ CSS์˜ ๊ฒฝ๋กœ ๋ถ„ํ• ์ด ์ž‘๋™ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์•„์ง ์˜ค์ง€ ์•Š์„๊นŒ์š”?

(๊ด€๋ จ, https://github.com/zeit/next-plugins/issues/190)

์ „์—ญ CSS๋Š” ๊ฒฝ๋กœ ๋ถ„ํ• ์ด ๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์•„๋‹ˆ์š”. CSS ๋ชจ๋“ˆ (๊ตฌ์„ฑ ์š”์†Œ ์ˆ˜์ค€์—์„œ ๊ฐ€์ ธ์˜จ) ๋งŒ ๊ฒฝ๋กœ ๋ถ„ํ• ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ‘

์ด๊ฒƒ์ด ๋ฌธ์ œ # 9392 ๋ฐ # 9385์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์„ค๋ช…์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋’ค์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด. ๊ทธ๋ž˜์„œ ๋‚ด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”. ์šฐ๋ฆฌ๋Š” ์ฃผ๋กœ ํ›Œ๋ฅญํ•œ ๋„๊ตฌ์™€ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด React ์•ฑ์„ next.js๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ์—๊ฒŒ CSS ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ์–ด๋ ค์šด ์š”๊ตฌ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” CSS ์šฉ ๋‹ค์Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ # 9392 # 9385 ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋กœ ํ˜ผ๋ž€์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค.

CSS ๋ชจ๋“ˆ ์ง€์›์— ๋Œ€ํ•œ ETA๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ (์‹คํ—˜์  ์ผ์ง€๋ผ๋„)? ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ ‡๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ ์ˆ˜์ค€์—์„œ CSS๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋  ๋•Œ๊นŒ์ง€ ์ง€๊ธˆ ๋ฐ”๋กœ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ css ๋ฌธ์ œ ์—์„œ ๋‹น์‹ ์—๊ฒŒ ๋งž๋Š” ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์–ด๋ฆฌ์„์€ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ๋ฏธ์•ˆํ•ฉ๋‹ˆ๋‹ค : ๊ธ€๋กœ๋ฒŒ CSS๊ฐ€ ์ง„ํ–‰๋˜๋Š” ํ•œ, ์ด๊ฒƒ์ด ๋‹จ์ˆœํžˆ ๋งํฌ๋ฅผ ๋จธ๋ฆฌ์— ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ๋ณด๋‹ค ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฑฐ ๋‚˜ ๋” ๋‚ซ์Šต๋‹ˆ๊นŒ?

@otw ์ „์—ญ CSS๋ฅผ ๊ฐ€์ ธ ์˜ค๋ฉด ๋‚˜๋จธ์ง€ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋นŒ๋“œ ํŒŒ์ดํ”„ ๋ผ์ธ์„ ํ†ตํ•ด ์ตœ์†Œํ™”๋˜๋ฏ€๋กœ next.js ๋นŒ๋“œ ๋ฐ ์ถœ๋ ฅ์˜ ์ผ๋ถ€๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ์žฅ์ ์ธ์ง€ ๋‹น์‹ ์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ํŠน์ • ๊ตฌ์„ฑ ์š”์†Œ์— ํ•„์š”ํ•œ CSS๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€๋กœ๋“œ ๋  ๋•Œ๋งŒ๋กœ๋“œ๋˜๋„๋ก CSS ๋ชจ๋“ˆ์„ ๊ณ ๋Œ€ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋งฅ๋ฝ์„ ๋“ค์–ด, ์šฐ๋ฆฌ๋Š” ์ง€๋‚œ 2 ๋…„ ๋™์•ˆ NextJS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐ ๋‹จ๊ณ„์˜ ์Šคํƒ€ํŠธ ์—…์„์œ„ํ•œ ๊ฑฐ์˜ 40 ๊ฐœ์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ• ํ•œ ๊ฐœ๋ฐœ์ž ํŒ€์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ํ˜„์žฌ ์š”๊ตฌ ์‚ฌํ•ญ, ๋ฌธ์ œ์ , ์ง๋ฉด ํ•œ ์ผ๋ถ€ ํ•„์ˆ˜ npm์— ๋Œ€ํ•œ ๊ฒฝ๊ณ  ๋ฐ ์ œ์•ˆ ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์šฐ๋ ค ์‚ฌํ•ญ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ„๋žตํžˆ ์„ค๋ช…ํ•˜๊ณ ์žํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ตฌํ˜„

  • ์šฐ๋ฆฌ๋Š” ๋งŽ์€ ํ•ต์‹ฌ ์•ฑ ๊ธฐ๋Šฅ์ด ์‚ฌ์ „ ๊ตฌ์ถ• ๋œ "์Šคํƒ€ํ„ฐ ํ‚คํŠธ"์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ๋งŽ์€ ํ™•์žฅ ๋œ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ž‘์ ์œผ๋กœ ๋ณต์ œ๋ฉ๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ๋””์ž์ธ ์‹œ์Šคํ…œ์˜ ๊ธฐ์ดˆ๋กœ Bootstrap ๊ณผ Reactstrap ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ผ๊ด€๋œ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋””์ž์ธ ์‹œ์Šคํ…œ ์„ ํ™•์žฅํ•˜๊ณ  ์ถ”๊ฐ€ ๊ตฌ์„ฑ ์˜ต์…˜, ๋ฏน์Šค ์ธ, ๊ธฐ๋Šฅ ๋“ฑ์˜ ํ˜•ํƒœ๋กœ ์ž์ฒด ์ถ”๊ฐ€ ์‚ฌํ•ญ์„ ํ†ตํ•ฉ http://prntscr.com/qc8r0g.
  • ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ์—์„œ ํ™•์žฅ ๋œ ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ ์„ค์ •์—์„œ ์ œ๊ณตํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์Šคํƒ€์ผ๋ง์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜ˆ์™ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ์˜ ๊ฒฝ์šฐ styled-jsx์™€ ํ•จ๊ป˜ SASS ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. SASS ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋””์ž์ธ ์‹œ์Šคํ…œ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ธ€๋กœ๋ฒŒ์—์„œ ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ๋ฐ ๋ฏน์Šค ์ธ์„ ๊ฐ€์ ธ ์˜ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ styled-jsx๋กœ ๊ฐ€์ ธ ์˜ค๋Š” "jsx-helper"๋ผ๋Š” ํŠน๋ณ„ํ•œ import๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ ์ƒท : http://prntscr.com/qc8xbr.
  • html, body ๋ฐ root div ํƒœ๊ทธ๋ฅผ ํ„ฐ์น˜ํ•ด์•ผํ•˜๋Š” ์ผ๋ถ€ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ ์š”์†Œ, ์ž์ฒด ๋งˆํฌ ์—…์„ ์ƒ์„ฑํ•˜๋Š” ์ผ๋ถ€ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋˜๋Š” ํฌํ„ธ์„ ์‚ฌ์šฉํ•˜๊ณ  CSS๊ฐ€ ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์•ก์„ธ์Šค ํ•  ์ˆ˜์—†๋Š” ๋งˆํฌ ์—…์„ ํ„ฐ์น˜ํ•ด์•ผํ•˜๋Š” npms์˜ ๊ฒฝ์šฐ ์ „์—ญ ์˜ต์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -jsx. ์ด๊ฒƒ์€ ์ตœํ›„์˜ ์ˆ˜๋‹จ์ด์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ ์š”์†Œ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. http://prntscr.com/qc8yo6

ํ˜„์žฌ์˜ ๋‹จ์  / ๋ฌธ์ œ

  • ์ปดํฌ๋„ŒํŠธ์— ์‚ฝ์ž… ๋œ SASS ์ฝ”๋“œ (IDE ๋ฌธ์ œ ๋ฐ ์‚ฝ์ž… ๋œ ์–ธ์–ด์— ๋Œ€ํ•œ ์ง€์› ๋ถ€์กฑ)๋ฅผ ์‚ฌ์šฉ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด , ํ•„์š”ํ•œ ๊ฒฝ์šฐ styled-jsx์™€ ํ•จ๊ป˜ ์™ธ๋ถ€ sass ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. npm ์Šคํƒ€์ผ๋ฆฌ์Šค . ์ด ํ”„๋กœ์ ํŠธ๋Š” ํ˜„์žฌ ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฏ€๋กœ NextJS์—์„œ ์ œ์•ˆํ•œ ๋„๊ตฌ ์ฒด์ธ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค .
  • styled-jsx SASS๋กœ ๊ฐ€์ ธ์˜จ ๊ธ€๋กœ๋ฒŒ SCSS ๋ณ€์ˆ˜์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๊ฐ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์›นํŒฉ์ด ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ ์ „์—ญ ๋ณ€์ˆ˜์—์„œ ์ „ํŒŒ๋˜๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ•ซ ๋ฆฌ๋กœ๋“œ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ „์—ญ npm ๋ชจ๋“ˆ ์บ์‹œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด npm ci ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ „์ฒด node_modules ํด๋”๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ณ , ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ๋ฅผ ์ง€์šฐ๊ณ , ์บ์‹œ ์ง€์šฐ๊ธฐ ๊ฐ•์ œ ์ฝ˜์†” ๋ช…๋ น์€ ๋ชจ๋‘ ์—ฌ๊ธฐ์—์„œ ์ž‘๋™ํ•˜๋Š” ์ผ๋ถ€ ์ „์—ญ npm ์บ์‹œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํฌ๋„ŒํŠธ์— ์ ์šฉ๋œ CSS / SASS ๋ชจ๋“ˆ๋กœ ๊ฐ€์ ธ์˜จ ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ ํ•ซ ๋ฆฌ๋กœ๋”ฉ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋งค์šฐ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์š”์ปจ๋Œ€, ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๋ชจ๋“  SASS ์ฒ˜๋ฆฌ๋Š” ๊ฐ€์ ธ ์˜ค๊ธฐ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์‹œํ•˜๊ณ  ์ž‘์—… ํ•ซ ๋ฆฌ๋กœ๋“œ๋ฅผ ์œ ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด์ „ ๊ธ€ ๋จธ๋ฆฌ ๊ธฐํ˜ธ์— ์–ธ๊ธ‰ ๋œ ์›นํŒฉ ๋กœ๋” ์˜ต์…˜์œผ๋กœ ํ•ด๊ฒฐ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๊ธ€๋กœ๋ฒŒ SASS์™€ styled-jsx๊ฐ€ ๋ณ„๋„๋กœ ๊ตฌ์ถ• ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— PostCSS ๊ตฌ์„ฑ์„ ๋‘ ๊ฐœ์˜ ๋ณ„๋„ ์œ„์น˜๋กœ ๊ณต์œ ํ•˜๊ธฐ์œ„ํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ์•„์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์šฐ๋ ค

์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ html, body ๋ฐ root div ํƒœ๊ทธ์™€ ์ƒ์„ฑ ๋œ HTML์˜ ๊ฒฝ์šฐ๋ฅผ ํ„ฐ์น˜ํ•ด์•ผํ•˜๋Š” ์ผ๋ถ€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ CSS / SASS ๋ชจ๋“ˆ๋กœ ์ „์—ญ ์˜ต์…˜์„ ์ฐจ๋‹จํ•˜๋Š” ์•„์ด๋””์–ด์— ์•ฝ๊ฐ„ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํฌํ„ธ ๋“ฑ์„ ํ†ตํ•œ ๋ฐฐ์น˜๋กœ ์ธํ•ด ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด๋ถ€์— ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธ€๋กœ๋ฒŒ SASS ๋ฐ ์ผ๋ถ€ ์žฌ๊ตฌ์„ฑ์œผ๋กœ์ด ๋ฌธ์ œ ์ค‘ ์ผ๋ถ€๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŠน์ • ์ „์—ญ CSS๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด๋กœ๋“œ๋˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” PostCSS์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ œ์–ด๋ฅผ ์›ํ•˜๋ฉฐ ํŠน์ • ๊ธฐ๋ณธ๊ฐ’ ์ง‘ํ•ฉ์„ ๊ฐ•์ œ๋กœ ์ ์šฉํ•˜์ง€ ์•Š์•„๋„๋ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ธด ๋‹ต๋ณ€ ์ด์—ˆ์ง€๋งŒ ๊ณต์œ  ํ• ๋งŒํ•œ ํ†ต์ฐฐ๋ ฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์œผ๋ฉด ์–ธ์ œ๋“ ์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”. NextJS ํŒ€์ด ๋‹ค์Œ (์˜๋„ ํ•œ ๋ง์žฅ๋‚œ)์„ ๋‚ด๋†“์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค!

@Soundvessel ,

์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ html, body ๋ฐ root div ํƒœ๊ทธ์™€ ์ƒ์„ฑ ๋œ HTML์˜ ๊ฒฝ์šฐ๋ฅผ ํ„ฐ์น˜ํ•ด์•ผํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ปดํฌ๋„ŒํŠธ CSS / SASS ๋ชจ๋“ˆ๋กœ ์ „์—ญ ์˜ต์…˜์„ ์ฐจ๋‹จํ•˜๋Š” ์•„์ด๋””์–ด์— ์•ฝ๊ฐ„ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด๋ถ€์— ํ•„์š”ํ•˜์ง€ ์•Š์€

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค๋ฉด CSS ๋ชจ๋“ˆ์—์„œ :global ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด๋ฅผ ๋‹ฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค๋ฉด CSS ๋ชจ๋“ˆ์—์„œ :global ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด๋ฅผ ๋‹ฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋ฉ”๋ชจ ์ฐธ์กฐ

CSS ๋ชจ๋“ˆ ์ง€์ •์ž๋Š” ๋กœ์ปฌ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ๊ฒฐํ•ฉ ๋  ๋•Œ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฒฝ์šฐ ๋กœ์ปฌ ํด๋ž˜์Šค ์ด๋ฆ„ ์—†์ด <html> , <body> ๋ฐ ๋ฃจํŠธ div ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด ์ฃผ์ œ ์— :global ์˜ต์…˜์„ ์™„์ „ํžˆ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์–ธ๊ธ‰๋˜์—ˆ๋Š”๋ฐ , ์ด๋Š” ๊ฑด๋“œ๋ฆด ์ˆ˜์—†๋Š” ๋งˆํฌ ์—…์„ ์ƒ์„ฑํ•˜๋Š” ๋งŽ์€ ์ˆ˜์˜ npm ๋ฐ CMS API๋ฅผ ๊ณ ๋ คํ•  ๋•Œ ์ œ๊ฒŒ ์ดํ•ด๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ CSS ๋ชจ๋“ˆ๋ณ„๋กœ.

์•ˆ๋…•ํ•˜์„ธ์š” @Soundvessel- ์ด๊ฒƒ์€ ์ œ๊ฐ€ ์ œ ํŒ€์„ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ๋…นํ™” ํ•œ ์ œ ๋น„๋””์˜ค์ž…๋‹ˆ๋‹ค (์–ด๋–ป๊ฒŒ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ?). nextjs ํŒ€์˜ ๊ฒฌํ•ด๋ฅผ ์ง์ ‘ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š์œผ๋ฉฐ ์ œ์ž‘ ์ดํ›„ ์ตœ์‹  ์ •๋ณด๋ฅผ ๋ณด์žฅํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์‹คํ—˜ ๋‹จ๊ณ„์—์„œ. RFC๋ฅผ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ํ‘œ์ค€์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค ๐Ÿ˜

๋˜ํ•œ camelCased ์†์„ฑ ๋“ฑ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•œ CSS ์†”๋ฃจ์…˜์—์„œ ๋ณต์žกํ•œ JS๊ฐ€ ์•„๋‹Œ CSS / SASS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์†”๋ฃจ์…˜์„ ์ œ์•ˆ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. HTML / CSS๋กœ ์ง์ ‘ ์ž‘์—… ํ•œ ์ˆ˜๋…„๊ฐ„์˜ ๊ฒฝํ—˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ์—์„œ๋ณด๊ณ ์žˆ๋Š” ๋‚ด์šฉ์„ ํ™”๋ฉด์—์„œ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋‚ด์šฉ์œผ๋กœ ๋„ˆ๋ฌด ๊นŠ๊ฒŒ ์ „ํ™˜ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ ๋‚ด์šฉ์„ ๋†“์นœ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด Sass์˜ ์ž๋™ ๊ฐ์ง€ / ํ™œ์„ฑํ™”๋Š” ๋ฉ‹์ง€์ง€๋งŒ Sass API ์˜ต์…˜๋„ ์–ด๋”˜๊ฐ€์— ๋…ธ์ถœ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ์ ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. [email protected] ๋Š” ์‚ฌ์šฉ์ž๋Š” ์ ์šฉ ํ•  sass ์—”์ง„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์˜ต์…˜์€ 1 : 1 ์ด์ƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ...

CSS ๋ชจ๋“ˆ์˜ ํ™•์žฅ์„ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
.module.css ์ด์™ธ์˜ ํ•˜๋‚˜ ์ด์ƒ์˜ ํ™•์žฅ์„ ์ง€์›ํ•˜๋„๋ก ๋ฐฐ์—ด์„ ๋…ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์ผ๋ถ€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งŽ์€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€์žˆ์„ ๋•Œ .module.css ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  import "Component.module.css" .module.css ํŒŒ์ผ์„ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์•ฝ๊ฐ„ ๋ถ€ํ’€์–ด ์˜ค๋ฅธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚ด ๊ฒฝ์šฐ์—๋Š” ๋‚ด๊ฐ€ ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ํŒŒ์ผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋กํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค .m.css ๋งํ•  Component.m.css ์™€ ๊ฐ™์€ ๊ฐ€์ ธ import "Component.m.css"

Next.js ํŒ€์ด์ด๋ฅผ ๋ฐฉํ•ดํ•˜๋Š” ๊ธฐ์ˆ ์  ์–ด๋ ค์›€์ด ์žˆ๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š๋Š” ํ•œ.

๋ถˆํ•„์š”ํ•œ ํ’‹ ํ”„๋ฆฐํŠธ ์ฆ๊ฐ€์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ™•์žฅ ์ด๋ฆ„ ์ง€์ •์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์„ ์—ด์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ, ์ด๊ฒƒ์ด ๊ตฌํ˜„์˜ ์ผ๋ถ€์ธ ๊ฒฝ์šฐ .module.css ํ™•์žฅ์— ๋Œ€ํ•œ _need_์— ์˜๋ฌธ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

Next.js๋Š” ์‚ฌ์šฉ์ž ์ •์˜ pages / _app.js ๋‚ด์—์„œ ์ „์—ญ CSS๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ๋นŒ๋“œ๊ฐ€ CSS ๋ชจ๋“ˆ๋กœ ํŒŒ์‹ฑํ•ด์•ผํ•˜๋Š” ๊ฒƒ๊ณผํ•ด์„œ๋Š” ์•ˆ๋˜๋Š” ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ .module.css ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ _app.js ์™ธ๋ถ€์˜ ๊ตฌ์„ฑ ์š”์†Œ / ํŽ˜์ด์ง€์—์„œ ๋น„ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๋นŒ๋“œ๊ฐ€ ์ค‘๋‹จ๋˜๋ฉด _app.js ์™ธ๋ถ€์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ CSS ๋ชจ๋“ˆ์ด์–ด์•ผํ•˜๋ฏ€๋กœ ๋ช…๋ช… ๊ทœ์น™์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ์ˆœ์ „ํžˆ ๊ด€์Šต์œผ๋กœ ๊ฐ•์ œ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

module.css ํ˜‘์•ฝ์˜ ์„ ํƒ์€ https://github.com/css-modules/css-modules์—์„œ ์ด๋ฏธ ์„ค๋ฆฝ ํ•œ ์ˆ˜๋„์›๊ณผ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์— ์˜ˆ :
https://create-react-app.dev/docs/adding-a-css-modules-stylesheet/
๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ:
https://www.gatsbyjs.org/docs/css-modules/

์˜ˆ, ํ™•์žฅ์„ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด ํ•„์š” ์ด์ƒ์œผ๋กœ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ์–ด๋„ .module.css ์ƒ์ˆ˜ ํŒŒ์ผ์— ์ •์˜ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์›์ˆญ์ด ํŒจ์น˜๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์œ„์น˜์—์„œ ํ•˜๋“œ ์ฝ”๋”ฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก

์ด ์ œ์•ˆ ๋œ ๊ตฌํ˜„๊ณผ create-react-app ์˜ ์ฐจ์ด์ ์€ another-stylesheet.css ๋งํฌ ํ•œ ์˜ˆ์ œ์™€ ๊ฐ™์€ "์ผ๋ฐ˜ ์Šคํƒ€์ผ ์‹œํŠธ"๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์ด ์ „ํ˜€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ .module.css ๋Š” ๋นŒ๋“œ ๋„๊ตฌ์—์„œ ์–ด๋–ค ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

CSS ๋ชจ๋“ˆ ์‚ฌ์–‘์€ ๋ช…๋ช… ๊ทœ์น™์„ ์ „ํ˜€ ์„ค์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

CSS ๋ชจ๋“ˆ์ด ํŒŒ์ผ ํ™•์žฅ์ž์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฐ€๊ณ  ์‹ถ์€ ๊ณณ์ด๋‹ค .module.css Next.js ํŒ€์— ์˜ํ•ด ์„ ํƒ๋œ ๊ทœ์น™๊ณผ ๊ทธ๋“ค์ด "์ด‰์ง„"ํ•ด์•ผ ๊ทธ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์„ค์น˜ ํ›„ ๋ชจ๋“ˆ์„ ํ†ตํ•ด ๊ฒฝ์šฐ์—๋„ ๊ฐ€๋Šฅ์„ฑ์ด ์ผ๋ถ€ ์‚ฌ์šฉ์ž๊ฐ€์ด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ monkey patching

.module.css ์ด ์ฒซ ๋ฒˆ์งธ ๋ช…๋ช… ๊ทœ์น™ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅ. ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ๋‚˜๋ฅผ ๊ณ ์ณ์ฃผ์„ธ์š”.

module.css ํ˜‘์•ฝ์˜ ์„ ํƒ์€ ์ด๋ฏธ css-modules / css-modules๊ฐ€ ์„ค๋ฆฝ ํ•œ ์ˆ˜๋…€์›๊ณผ ์ถฉ๋Œ
์—ฌ๊ธฐ์— ์˜ˆ :
create-react-app.dev/docs/adding-a-css-modules-stylesheet
๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ:
gatsbyjs.org/docs/css-modules

์˜ˆ, ํ™•์žฅ์„ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด ํ•„์š” ์ด์ƒ์œผ๋กœ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ์–ด๋„ .module.css ์ƒ์ˆ˜ ํŒŒ์ผ์— ์ •์˜ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์›์ˆญ์ด ํŒจ์น˜๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์œ„์น˜์—์„œ ํ•˜๋“œ ์ฝ”๋”ฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๊ท€ํ•˜์˜ ์š”์ ๊ณผ ๋ชจ์ˆœ๋ฉ๋‹ˆ๋‹ค. .module.css ๋Š” ๋™์ผํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด create-react-app ๋ฐ gatsby์—์„œ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ™•๋ฆฝ ๋œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ช…๋ช… ๊ทœ์น™์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ํ™•๋ฆฝ ๋œ ํŒจํ„ด์ด ์•„๋‹ˆ๋ฉฐ Next.js์—์„œ ํ—ˆ์šฉ ํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

.module.css๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋ช…๋ช… ๊ทœ์น™์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. | Next.Js์— ์˜ํ•ด ๋ถ€๊ณผ ๋œ ํ™•์žฅ. ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ๋‚˜๋ฅผ ๊ณ ์ณ์ฃผ์„ธ์š”.

Next.js๋Š” ๊ตฌ์„ฑ ์˜ต์…˜์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ :

  • pages ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๊ฒฝ๋กœ๊ฐ€ ๋จ
  • pages/api ๋Š” API ๊ฒฝ๋กœ ์ž„
  • .js .tsx .tsx

์•ˆ๋…•ํ•˜์„ธ์š” @timneutkens

ํŒจํ„ด์€ CSS Modules CSS ํŒŒ์ผ์„ JS ๊ฐ์ฒด๋กœ ๊ฐ€์ ธ ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ CSS ์ด๋ฆ„์€ ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ ์—์„œ Next.js๋Š” ์ƒˆ๋กœ์šด ๊ตฌํ˜„์—์„œ ํŠน์ • ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Gatsby ๋ฐ CRA์—์„œ์™€ ๊ฐ™์€ CSS Modules ๋Š” ์ด์ „์— Next์—์„œ ์ด๋ฏธ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค : https://github.com/zeit/next-plugins/tree/master/packages/next-css

CRA ๋ฐ Gatsby ์‚ฌ์šฉ์ž๋ฅผ CSS Modules ์™€ ํ˜ผ๋™ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ  ์žˆ๋”๋ผ๋„ ์‚ฌ์šฉ ๋œ ๊ทœ์น™ ์ธ .module.css ์˜๋ฌธ์„ ์ œ๊ธฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์ด๋ฆ„์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ•ญ์ƒ ํ–‰๋ณตํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

.m.css ๊ทœ์น™์ด ๋” ์งง๊ณ  (ํ™•์žฅ์— ๋” ์ ํ•ฉ ํ•จ) ์ค‘๋ณต์ด ์ ๊ธฐ ๋•Œ๋ฌธ์— (import ๋ฌธ์ด ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ๋จ) ๋” ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ์ด ์ ์„ ๊ณ ๋ คํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทœ์น™์„ ์ •์˜ํ•˜๊ณ  ์ƒ์ˆ˜ ํŒŒ์ผ์—์„œ ํŠน์ • .module.css ๋ฅผ ์ •์˜ํ•˜๋ฉด ํŒจ์น˜๋ฅผ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  CSS ๋ชจ๋“ˆ์— ๋งŽ์€ ์ถ•ํ•˜๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ต‰์žฅํ•œ ์ผ์„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ "๊ฑฐ์˜"๋ถˆ๊ฐ€๋Šฅํ•œ ์ผ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

๋ช…๋ช… ๊ทœ์น™์— 2 ์„ผํŠธ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ปดํŒŒ์ผ์„ ์œ„ํ•ด PostCSS๊ฐ€ ํ•„์š”ํ•˜๊ณ ์ด ๋ช…๋ช… ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— .pcss ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ CSS๋ฅผ ๋ชจ๋“ˆ๋กœ ๊ฐ€์ ธ์™€์•ผํ•ฉ๋‹ˆ๋‹ค. . ์ด ์‚ฌ๊ฑด์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ์›นํŒฉ ๊ตฌ์„ฑ์„ ํ•ดํ‚นํ•˜๊ณ  ๋กœ๋”์˜ ํ…Œ์ŠคํŠธ ์ •๊ทœ์‹์„ ํŒจ์น˜ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ๋”๋Ÿฝ๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

๋‚˜๋Š” .module.css ํ˜„์žฌ ๊ธ€๋กœ๋ฒŒ .css์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ postCSS๋ฅผ ์ง€์›ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์•Œ์•„์š”, ํœด๊ฐ€๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์•„์š”.

PR์„ ๊ฒ€ํ†  ํ•  ๋•Œ : https://github.com/zeit/next.js/pull/9686 ๋‚˜๋Š” CSS ๋ชจ๋“ˆ์ด ์ „์—ญ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ๊ฒƒ์œผ๋กœ "๋ณด์•˜๋‹ค"๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋ฅผ ์ฝ์—ˆ๋‹ค ๊ณ  ์ง„์‹ฌ์œผ๋กœ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

index.module.css

.redText {
  color: net;
}
import './index.module.css'

export default function Home () {
  return (
    <div id = "verify-red" className = "redText">
      This text should be red.
    </div>
  )
}

๋ถ„๋ช…ํžˆ ํ˜„์‹ค๊ณผ๋Š” ๊ด€๊ณ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์‹ค์ œ ์ฝ”๋“œ๋Š” ์ด๊ฒƒ์ž…๋‹ˆ๋‹ค.

import {redText} from './index.module.css'

export default function Home () {
  return (
    <div id = "verify-red" className = {redText}>
      This text should be red.
    </div>
  )
}

CRA ๋˜๋Š” Gatsby์—์„œ์™€ ๊ฐ™์ด CSS ๋ชจ๋“ˆ ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜ผ๋ž€, ๋‚ด ํ˜ผ๋ž€.

์‹ค์ˆ˜์— ๋Œ€ํ•ด ๋ชจ๋‘์—๊ฒŒ ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

:-(

CSS ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์ฃผ์š” ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ CSS ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ผ๋ถ€ ํƒ€์‚ฌ ๊ตฌ์„ฑ ์š”์†Œ๋„ CSS ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ... ์ผ๋ถ€ ํƒ€์‚ฌ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ „์—ญ CSS๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

.module.css ํ™•์žฅ ์†”๋ฃจ์…˜์€ ์ดํ•ดํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„ ์›Œํฌ (CRA, Gatsby)๋Š” ํ•ฉ์˜์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ํ™•์žฅ ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ €๋Š” .module.css ํ™•์žฅ์˜ ๊ฐœ๋ฐœ์„ ์ด‰์ง„ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

CSS ๋ชจ๋“ˆ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋‹ค๋ฉด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก
.m.css ์ด ๋” ์งง์ง€ ๋งŒ ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
min.css ๋˜๋Š” module.css ์ž…๋‹ˆ๊นŒ?

@ xyy94813 ๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€, ๋ชจ๋“  CSS ๊ฐ€์ ธ ์˜ค๊ธฐ๋Š” ๋ชจ๋“ˆ์ด๋ฉฐ .global.scss ๊ฐ€์žˆ๋Š” ํŒŒ์ผ์€ ์ „์—ญ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

๋ฟก๋ฟก
๊ทธ๋Ÿฌ๋‚˜ ๊ฒŒ์‹œ ๋œ ๊ตฌ์„ฑ ์š”์†Œ์—๋Š” ๋น„์šฐํ˜ธ์ ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทœ์น™์ด ์ข‹์€ ๊ธฐ๋ณธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค ์˜ˆ๋ฅผ ๋“ค์–ด, CSS ๋ชจ๋“ˆ์— ํŠน์ •ํ•œ ๊ฒฐ๊ตญ ์‚ฌ์šฉํ•  ์ˆ˜ํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์„ฑ ์˜ต์…˜, ๊ทธ css-loader ์ผ๋ถ€ ์‚ฌ์šฉ์ž๋Š” "๋ฒ”์œ„"์–ด๋–ป๊ฒŒ ์ œ์–ด๋ฅผ ์›ํ•  ๊ฒƒ ๊ฐ™์ด, ํด๋ž˜์Šค ์ด๋ฆ„์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. "๋ชจ๋“ˆ"๋กœ๋กœ๋“œ๋˜๋Š” CSS ํŒŒ์ผ์„ ๊ฒฐ์ •ํ•˜๋Š” ์ •๊ทœ์‹์„ ์ œ๊ณตํ•˜๋Š” ์˜ต์…˜์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ์‚ฌ์šฉ์ž๋Š” "๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ"ํด๋ž˜์Šค ์ด๋ฆ„์ด ์ถœ๋ ฅ๋˜๋Š” ๋ฐฉ์‹์„ ์ œ์–ดํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์›ํ•˜๋Š” ์ด์œ ์˜ ์˜ˆ? ๋‚˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ƒ๊ฐํ•  ์ˆ˜ ์—†๋‹ค.

์™œ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์›ํ•˜๋Š”์ง€ ์˜ˆ? ๋‚˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ƒ๊ฐํ•  ์ˆ˜ ์—†๋‹ค.

@timneutkens ๊ธ€์Ž„, ๋‚˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด ์ „์—ญ ํด๋ž˜์Šค์˜ ์ด๋ฆ„ ์ง€์ • ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ์ด๋ฆ„ ์ง€์ • ํŒจํ„ด์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์™ธ์—๋„ ํŠน์ • ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋นŒ๋“œ ํ›„ ์ œ๊ฑฐ ๋˜๋Š” ๋ถ„ํ•  ๋˜๋Š”๋กœ๋“œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์•„์ง ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ์„ค์ •์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ท ์ผ ์„ฑ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋…์ž์ ์ธ ํ”„๋ ˆ์ž„ ์›Œํฌ๊ฐ€ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒฐ์ • ์ค‘ ์ผ๋ถ€๋Š” ๊ตฌ์„ฑ ์˜ต์…˜ ๋˜๋Š” ํ™•์žฅ์„ ํ†ตํ•ด ๋ณ€๊ฒฝํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ๋ณธ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜์–ด์•ผํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž ์ง€์ • ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋Š˜๋ ค์„œ ํ…Œ์ŠคํŠธ, ์œ ์ง€ ๊ด€๋ฆฌ ๋ฐ ๋ฌธ์„œํ™”ํ•ด์•ผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋” ๋งŽ์ด ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ์ถœ๋ ฅ ํ•ด์‹œ ํŒจํ„ด๊ณผ ๊ฐ™์€ ๊ฒƒ์€ ๊ธฐ๋ณธ๊ฐ’์„ ๋ฎ์–ด ์“ธ ํ•„์š”๊ฐ€์žˆ๋Š” ์ง€์ ์— ๋„๋‹ฌํ•˜๋ฉด ๋„ˆ๋ฌด ์„ธ๋ถ„ํ™”๋˜์–ด ํ•„์š”ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ๋กœ๋”๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š” ์ง€์ ์—์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด React ๊ฐœ๋ฐœ์ž์™€ ์ž‘์—… ํ•  ๋•Œ ํ•ญ์ƒ className์„ ํ†ตํ•ด ๊ตฌ์„ฑ ์š”์†Œ์— ๋ฒ”์œ„ ์ง€์ • ์Šคํƒ€์ผ์˜ ๊ฐœ๋…์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ์˜ ์™ธ๋ถ€ ์š”์†Œ์— ์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ ์ด๋ฆ„๊ณผ ๋™์ผํ•œ ๊ณ ์œ  ํ•œ className์„ ์ง€์ •ํ•˜๊ณ  SCSS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์Šคํƒ€์ผ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

.Navbar {
  .logo { ... }
  .nav-item { ... }
}

๋ถ„๋ช…ํžˆ css-modules ์˜ ์ด์ ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋” ์ด์ƒ ์œ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉด Next.js๊ฐ€ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋œ ์นœ์ˆ™ํ•ด ์งˆ๊นŒ ๋ด ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด CSS ์ฃผ๋ฌธ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์ข‹์€ ์ ˆ์ถฉ์•ˆ์ผ์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ, css-modules ์‹œํ–‰์ด ์ ์–ด๋„ next.config.js ๋ฅผ ํ†ตํ•ด ๋น„ํ™œ์„ฑํ™” ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ ์–ผ๋งˆ๋‚˜ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋ชจ๋“  ์Šคํƒ€์ผ์ด ๊ณ ์œ  ํ•œ className์œผ๋กœ ์ ์ ˆํ•˜๊ฒŒ ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋นŒ๋“œ ํƒ€์ž„ ๊ฒ€์‚ฌ๋ฅผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋ฐฉ๋ฒ•์„ ๋” ์ด์ƒ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉด Next.js๊ฐ€ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋œ ์นœ์ˆ™ํ•ด ์งˆ๊นŒ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ์˜คํ•ดํ•˜์ง€ ์•Š๋Š” ํ•œ, ๋‚˜๋Š” CSS ๋ชจ๋“ˆ์ด ๋ฐฐํƒ€์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ , ๊ฐ€์ ธ ์˜ค๋Š” ํŒŒ์ผ์— *.module.css ์ด๋ฆ„ ์ง€์ • ํŒจํ„ด ๋˜๋Š” *.module.scss ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋กœ๋”๊ฐ€ CSS ๋ชจ๋“ˆ์˜ ํŒŒ์„œ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•œ

@ lunelson-bl

CRA ๋˜๋Š” Gatsby๊ฐ€ ๋ช…๋ช… ํŒจํ„ด Next๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํŒŒ์„œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ์‹๊ณผ๋Š” ๋ฐ˜๋Œ€๋กœ ๋ฐ˜ ๋ฐฐํƒ€์ ์ž…๋‹ˆ๋‹ค. ๋น„ ๋ชจ๋“ˆ์„ ๊ตฌ์„ฑ ์š”์†Œ JS๋กœ ์ง์ ‘ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

RFC์—์„œ :

/* components/button.js */
import { btnLarge } from './button.module.css'

// import '../styles.css'; // <-- this would be an error

๋ชจ๋“ˆ์ด ์•„๋‹Œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด _app.js ๋กœ๋งŒ ๊ฐ€์ ธ ์˜ค๋Š” ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ์ „์—ญ ์Šคํƒ€์ผ ์‹œํŠธ๋กœ ๊ฐ€์ ธ์™€์•ผํ•ฉ๋‹ˆ๋‹ค (๋ถ„ํ• ํ•˜๊ณ  ๊ตฌ์„ฑ ์š”์†Œ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ๋ฐฐ์น˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ). ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ๊ธ€๋กœ๋ฒŒ ์Šคํƒ€์ผ ์‹œํŠธ์— ์ง์ ‘ ๋ฐฐ์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” next.js์˜ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์ฝ๊ณ  ์กฐ๊ธˆ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•ฉ๋‹ˆ๋‹ค. next.js๊ฐ€ build-in-css-support๋ฅผ ์ง€์› ํ•˜๋ฏ€๋กœ @ next-css ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  "ModuleParseError"์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
CSS ๊ฐ€์ ธ ์˜ค๊ธฐ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด @ next-css ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž‘๋™ํ•˜๋ฏ€๋กœ @ next-css์—†์ด ์–ด๋–ป๊ฒŒ build-in-css-support๊ฐ€ ์˜ˆ์ œ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @all.

์ €๋Š” next.js์˜ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์ฝ์€ ํ›„ ์•ฝ๊ฐ„ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. next.js๋Š” build-css ์ง€์›์„ ์ง€์›ํ•˜๋ฏ€๋กœ @ next-css ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  "ModuleParseError"์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
CSS ๊ฐ€์ ธ ์˜ค๊ธฐ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด @ next-css ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์ถ”๊ฐ€ํ•˜๋ฉด ์ž‘๋™ํ•˜๋ฏ€๋กœ @ next-css์—†์ด css-build๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @ALL .

๋‹ค์Œ๊ณผ ๊ฐ™์ด next.config.js์— ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

module.exports = {
  experimental: {
    css: true
  }
}

@erkanunluturk ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์ง€ ๋งŒ ์‹คํ—˜์ ์ธ ๊ธฐ๋Šฅ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•ฉ๋‹ˆ๊นŒ?
๊ทธ๋ฆฌ๊ณ  antd์™€ ์–ด๋–ป๊ฒŒ ํ˜ธํ™˜๋ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ฐœ๋ฏธ ๋””์ž์ธ ์ด ๊ดœ์ฐฎ๋‹ค๋Š” ๊ฒƒ์„ ์•ˆ๋‹ค.

@Timer ๊ฐ€์ ธ ์˜ค๊ธฐ Ant-design ์‚ฌ์šฉ [RFC] CSS ์ง€์› ์˜ˆ์ œ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ.

๋‹ค๋ฅธ ๋งํฌ์—์žˆ์„ ๋•Œ ์—ฌ์ „ํžˆ Router.push ( "/")์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

: ๊ฒฝ๊ณ  :์ด ์Šค๋ ˆ๋“œ ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•˜๊ณ  ์ถ”์ ๊ธฐ๋ฅผ ๋ฐœํ–‰ํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ RFC์ด๋ฉฐ ์•„์ง ๊ตฌํ˜„ ์ค‘์ž…๋‹ˆ๋‹ค.

ํŒ€์˜ ๋งˆ์ง€๋ง‰ ์˜๋ฏธ์žˆ๋Š” ์˜๊ฒฌ์€ https://github.com/zeit/next.js/issues/8626#issuecomment -531415968 https://github.com/zeit/next ๋ฅผ ํ†ตํ•ด ํ™œ์„ฑํ™”ํ•˜์—ฌ ํ˜„์žฌ ๊ตฌํ˜„์„ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—…์„ ์ถ”์  ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋„์™€ ๋“œ๋ฆด๊นŒ์š”? @Timer ์ด RFC๋ฅผ ๋กœ๋“œ๋งต ์ธ ๋งˆ์ผ์Šคํ†ค๊ณผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? RFC์˜ ํฌ์ธํŠธ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ถ”์ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@StarpTech ์ด RFC๋Š” ์™„์ „ํžˆ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ „์—ญ CSS ๋ฐ CSS ๋ชจ๋“ˆ์€ RFC ์„ค๋ช…์— ๋”ฐ๋ผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ์‹คํ—˜ ํ”Œ๋ž˜๊ทธ๋กœ ๋‘˜ ๋‹ค ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์ถ”๊ฐ€ ์•Œ๋ฆผ ํ™•์‚ฐ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ž ๊ทธ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด๊ณ  ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค! ์ง€์›์ด ๊ณต์‹์ ์œผ๋กœ ์•ˆ์ •๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ์ผœ์ ธ์žˆ๋Š” ๊ฒฝ์šฐ ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

9.2 ์ถœ์‹œ : https://nextjs.org/blog/next-9-2

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰