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 ๋ง ๋ค์ด๋ก๋๋ฉ๋๋ค.
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>
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>
)
}
.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์ ๋ํ ๊ฒฝ๊ณ ๋ฐ ์ ์ ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ์ฐ๋ ค ์ฌํญ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์์ฉ ํ๋ก๊ทธ๋จ ์คํ์ผ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋ตํ ์ค๋ช ํ๊ณ ์ํฉ๋๋ค.
npm ci
๋ฅผ ์ํํ์ฌ ์ ์ฒด node_modules
ํด๋๋ฅผ ๋ค์ ๋น๋ํ๊ณ , ๋ธ๋ผ์ฐ์ ์บ์๋ฅผ ์ง์ฐ๊ณ , ์บ์ ์ง์ฐ๊ธฐ ๊ฐ์ ์ฝ์ ๋ช
๋ น์ ๋ชจ๋ ์ฌ๊ธฐ์์ ์๋ํ๋ ์ผ๋ถ ์ ์ญ npm ์บ์๊ฐ ์์ผ๋ฏ๋ก ์๋ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ปดํฌ๋ํธ์ ์ ์ฉ๋ CSS / SASS ๋ชจ๋๋ก ๊ฐ์ ธ์จ ํ์ผ์ ์
๋ฐ์ดํธ ํ ๋ ํซ ๋ฆฌ๋ก๋ฉ์ด ์ ๋๋ก ์๋ํ๋ ๊ฒ์ ๋งค์ฐ ์ข์ํฉ๋๋ค. ์์ปจ๋, ๊ตฌ์ฑ ์์์์ ์ํ๋๋ ๋ชจ๋ SASS ์ฒ๋ฆฌ๋ ๊ฐ์ ธ ์ค๊ธฐ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์ํ๊ณ ์์
ํซ ๋ฆฌ๋ก๋๋ฅผ ์ ์งํด์ผํฉ๋๋ค. ์ด๊ฒ์ ์ด์ ๊ธ ๋จธ๋ฆฌ ๊ธฐํธ์ ์ธ๊ธ ๋ ์นํฉ ๋ก๋ ์ต์
์ผ๋ก ํด๊ฒฐ๋์์ ๊ฒ์
๋๋ค.์ปดํฌ๋ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก 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
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ๋ฌด์์ํ๋ ์ฐ๋ฆฌ๋
@zeit/next-css
์ ๊ฐ์ด ์ฌ์ฉ์ ์ ์ PostCSS ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์ง ํ์ธํ ์ ์์ต๋๊น? ์ด์ ๋ํ ์ง์์ ์๋๋ค๋ฉด ์ ๋ง ๋ถ๋๋ฌ์ด ์ผ์ ๋๋ค. CRA๋์ด๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ Tailwind CSS์ ๊ฐ์ ๋๊ตฌ๋ฅผ ํฉ๋ฆฌ์ ์ธ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.๋๋ ์ด์ ๊ด๋ จํ์ฌ ๋ค์ ์ธ ๊ฐ์ง ๊ธฐ๋ฅ์์ฃผ์๋ฅผ ๊ธฐ์ธ์ผ ๊ฒ์ ๋๋ค.
...์ด ๋ชจ๋ ์์ ์ PostCSS๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ PostCSS ํ๋ฌ๊ทธ์ธ ์์๋ ์ต์ข ์ฌ์ฉ์๊ฐ ์ ์ดํ๋ โโ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ด ์ธ ๊ฐ์ง ํ๋ฌ๊ทธ์ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํํ๋ ค๋ฉด ์ฌ์ฉ์๊ฐ ์์ ์
postcss.config.js
ํ์ผ์ ์ ๊ณตํ์ฌ ๊ธฐ๋ณธ PostCSS ๊ตฌ์ฑ์ ์์ ํ ์ฌ์ ์ ํ ์ ์์ด์ผํฉ๋๋ค. ์ด ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ผ๋ก ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํด์ผํ์ง๋ง ์ ์๊ฐ์๋ ๊ทธ ์์ค์ ์ ์ด๊ฐ ํ์ํฉ๋๋ค.TL; DR์ ์ฌ์ฉ์๊ฐ PostCSS๋ฅผ ์์ ํ ์ ์ด ํ ์์๋ ๋ฅ๋ ฅ์ ์์์ํค์ง ์๋๋ก์ฃผ์ํ์ญ์์ค. ๋ฌธ์ ๊ทธ๋๋ก CRA๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ์ด์ Next๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ฉด ๋งค์ฐ ์ฌํ๋๋ค.