๋๋ก๋ CSS๋ฅผ ๋ณ๋์ .css
ํ์ผ๋ก ๋๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ค์์ ์๋ํ์ต๋๋ค.
pages/
โโโ index
โโโ index.css
โโโ index.js
โโโ component.js
๊ทธ๋ฐ ๋ค์ index.js์์ ๋ค์์ ์๋ํ์ต๋๋ค.
import css from './index.css'
๊ทธ๋ฆฌ๊ณ next.config.js์์ :
module.exports = {
webpack: function (config) {
config.module.loaders = (config.module.loaders || []).concat({
test: /\.css$/, loader: 'raw'
})
return config
}
}
ํ์ง๋ง ์ํ๊น๊ฒ๋ ๊ณ์ํด์ ๋ค์์ ์ ๊ณตํฉ๋๋ค.
ERROR Failed to compile with 1 errors
This dependency was not found in node_modules:
* ./index.css
์ด๋ค ์ด์ ๋ก ๋ ์ฌ๋ฐ๋ฅธ ์์น๋ก ํด๊ฒฐ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ง์ญ component.js
๋ import component from './component.js'
๋ฅผ ํตํด ์๋ํ๋ฏ๋ก ์ฌ๊ธฐ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด๊ฒ์ ์๋ฒ์์ ์๋ํ์ง ์๋๋ค๋ ์๋ฏธ์
๋๊น?
์์ง์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. cc @arunoda
์ ๋ง๋ค, ์ด๊ฒ์ด ์๋ํ๋ ค๋ฉด next.config.js์ webpack ๊ตฌ์ฑ์ด ์์ชฝ์์ ์๋ํ๋ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Next๊ฐ CSS ๋๋ SASS๋ก ๋ฉ์ง๊ฒ ํ๋ ์ด ํ ์ ์๋ค๋ ์ ์์ ๋น์ทํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ด ํ์ด์ง๋ก ๊ฐ์ ธ ์ค๋ ํ์ค React ๊ตฌ์ฑ ์์๊ฐ ํฌํจ ๋ components
๋๋ ํ ๋ฆฌ๊ฐ ์์ง๋ง SASS (๋๋ CSS) ํ์ผ๋ก ๊ฐ์ ธ ์ค๋ ค๊ณ ํ ๋๋ง๋ค ~ "์ด ํ์ผ์ ์ ์ ํ ๋ก๋๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค." ์ ํ ์ค๋ฅ ๋ฉ์์ง.
์ผ๋ฐ์ ์ผ๋ก React์์ ๋๋ SASS ํ์ผ์ ๊ฐ์ ธ์ค๊ณ ์คํ์ผ, CSS ๋ฐ sass ๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ Webpack์ ์ปดํ์ผํฉ๋๋ค. next.config.js
ํ์ผ์ ์ถ๊ฐํ๋ ค๊ณ ์๋ํ์ง๋ง NPM์ด ์ค์นํ์ง๋ง ์ฌ์ ํ ๋์ผํ ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋ํ๋ฉ๋๋ค.
๋ด next.config.js
ํ์ผ :
module.exports = {
webpack: (config, { dev }) => {
config.module.rules.push({ test: /\.scss$/, loader: ['style-loader', 'css-loader', 'sass-loader'] });
return config;
}
}
์ด ์ง๋ฌธ์ด ๋ฉ์ฒญํ๊ฒ ๋ค๋ฆฌ๊ฑฐ๋ ๊ทธ์ ๋ํ ๋ต๋ณ์ ์ค๋ช
ํ๋ ๋ฌธ์์์ ๋ถ๋ช
ํ ๊ฒ์ ๋์น ๊ฒฝ์ฐ ๋ฏธ์ํ์ง๋ง, ๋๊ตฐ๊ฐ SASS (๋๋ ์ต์ํ CSS)๋ฅผ ๊ตฌ์ฑ ์์ ๋๋ ํ์ด์ง๋ก ๊ฐ์ ธ ์ค๊ฑฐ๋ ์ปดํ์ผํ๋ ์์
์์ ๊ฐ ์๋ค๋ฉด ๋ก๋ / ์ปดํ์ผํ๊ธฐ ์ํด next.config.js
์ ์ถ๊ฐํ๋ ๋ฐ ํ์ํ ๊ฒ์ด ๋ฌด์์ด๋ ๋๋จํ ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌ!
css-modules-require-hook์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
CSS๊ฐ ์๋ํ๋๋กํฉ๋๋ค.
@spacedragon css-modules-require-hook์ Next.js์ ํตํฉํ๋ ๋ฐฉ๋ฒ์ ์๊ฐ ์์ต๋๊น? ์๋ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋๊ตฐ๊ฐ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ฐํ ์ ์๊ฑฐ๋ Next ๋ด์์ CSS ํ์ผ์ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ฉด SASS๋ฅผ ์ปดํ์ผํ๋ ๋ฐ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค (์ฝ๋ ์์ ๋ฅผ ํตํด).
README ํ์ผ์ด SVG ๋ก๋ ์์ ๋ฅผ ์ ๊ฑฐํ๋๋ก ์ ๋ฐ์ดํธ๋์์ผ๋ฉฐ SVG, CSS ๋ฐ SASS์ ๊ฐ์ ํ์ผ์ ๋ํ ๋ก๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์์ต๋๋ค. ์ธ๋ผ์ธ CSS๊ฐ ์ ๊ด์ฐฎ์์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๊ฐ์ ธ์จ CSS๋ ๊ทธ๋ ์ง ์์ง๋ง ๊ทธ๋ด๋ง ํ ์ด์ ๊ฐ ์๋ค๊ณ ํ์ ํฉ๋๋ค. ํ์ฌ JS ์ ์ / ์ธ๋ผ์ธ CSS ๋ฐ SASS๋ฅผ ์ฒ๋ฆฌํ์ง ์๋ ์ต์์ ์ ๋ต์ ๋ํด ํ์ ์ด ์์ต๋๋ค.
@MikeDigitize # 627 ๋ฐ # 638
์ค์ ๋ก ๊ฐ๋ฅํ๊ณ ์๋ฒ ์ธก์์ ์คํ์ผ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋งค์ฐ ์ฝ์ต๋๋ค.
๋ ธ๋์์ ์ง์ :
require.extensions['.css'] = function(file) {
console.log(file.id)
return;
}
๋ฐ๋ฒจ ๋ ์ง์คํฐ๋ฅผ ํตํด :
// from https://babeljs.io/docs/core-packages/babel-register/
require("babel-register")({
// Optional ignore regex - if any filenames **do** match this regex then they
// aren't compiled.
ignore: /regex/,
// Ignore can also be specified as a function.
ignore: function(filename) {
if (filename === '/path/to/es6-file.js') {
return false;
} else {
return true;
}
},
// Optional only regex - if any filenames **don't** match this regex then they
// aren't compiled
only: /my_es6_folder/,
// Setting this will remove the currently hooked extensions of .es6, `.es`, `.jsx`
// and .js so you'll have to add them back if you want them to be used again.
extensions: [".es6", ".es", ".jsx", ".js"]
});
์นํฉ ๋ก๋๋ฅผ ํตํด :
์๋ฒ์์ ๋ ๋๋งํ๋ ๋์ ์ค์ํ CSS๋ฅผ ์ธ๋ผ์ธ ํ ์ ์์ผ๋ฏ๋ก ๊ฐ์ธ์ ์ผ๋ก isomorphic-style-loader๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํซ ๋ฆฌ๋ก๋ฉ ๋ฐ ๊ธฐํ DX ๊ด๋ จ ํญ๋ชฉ๋ ์๋ํฉ๋๋ค. ํ์ฌ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ณต์กํ๊ณ ์ด๋ป๊ฒ ๋ CSS์์ C๋ฅผ ์ ๊ฑฐํ๊ธฐ ๋๋ฌธ์ JS์์ CSS์ ํฌ์ด ์๋๋๋ค.
@viktorbezdek next.js ์ ํจ๊ป isomorphic-style-loader๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ฌ์ฉ ํ์ต๋๊น?
@noeljackson ์ค์ ๋ก๋ ์๋์ง๋ง ๊ทธ๋ ๊ฒ ํ ์๊ฐ์ ๋๋ค. Next.js๋ ์ ๋ง ํด ๋ณด์ด๋ฉฐ ์๋ํ๋ฉด ๋ง์ ์๊ฐ์ ์ ์ฝ ํ ์ ์์ต๋๋ค. ๋ค์ 1 ~ 2 ์ฃผ ๋ด์ ์กฐ์ฌํ๊ณ ์ฑ๊ณตํ๋ฉด ํ ์์ฒญ์ ์ ์ถํฉ๋๋ค.
@viktorbezdek ์ ๊ฐ ๊ฒ ์ต๋๋ค . ๋๋ ๋ด๊ฐ ๋ฌด๋ฅํ์ง ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ด๊ฒ์ ์์๋ผ๋งํผ ๋ฐ๋ฒจ ๋ณํ์ ๋๋ฒ๊น ํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ์ง ๋ชปํ๋ค. ๋๋ ์ด๋ฌํ ์์ด๋์ด์ ์์ด์ ์๋ํ์ง๋ง ์๋ฌด๊ฒ๋ 100 % ์๋ํ์ง ์์ต๋๋ค. babel-plugin-webpack-loaders๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ธ์ฝ๋ฉ ๋ ์คํ์ผ ์ํธ๋ฅผ ๊ฐ์ ธ ์ค๋๋ก raw-loader๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์์ง๋ง ์คํ์ผ ๋ก๋๋ ์๋ํ์ง ์์ต๋๋ค. ๋ค์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! :) ๋งค์ฐ ๊ฐ์ฌ.
์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น? ์ ์ธ๊ณ์ ์ผ๋ก CSS๋ฅผ ํฌํจ ํ ํ์๊ฐ ์๋๋ก ์๋ฃจ์ ์๋ณด๊ณ ์ถ์ต๋๋ค.
FWIW, ๋ฐฉ๊ธ /static
ํด๋์ CSS ํ์ผ์ ๋ฃ์์ต๋๋ค. ์ข์ ์ฝ ๋ก์ผ์ด์
์ ์๋์ง๋ง ํฐ ๋ฌธ์ ๋ ์๋๋๋ค.
ํด๊ฒฐ์ฑ ์ด์์ ๊ฒ์ ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋๋ด์ง ๋ชปํ์ต๋๋ค. ๋๋ ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ต์ด์ ํ๋กํ ํ์ ์ ๋ก์ปฌ์์ ๋ง๋ค์์ง ๋ง ์์ฑํ๋ ๋ฐ ๋ช ์๊ฐ์ด ํ์ํฉ๋๋ค. ์ฃผ๋ง์ด ์ง๋๋ฉด ๋๋ ๊ฑฐ๋ผ๊ณ ํ์ ํด์. ๊ณ์ ์ง์ผ๋ด์ฃผ์ธ์.
@matthewmueller CSS ๋ชจ๋์ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
@viktorbezdek ์์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! CSS ๋ชจ๋ ์ง์ (๋๋ ์ ์ฌ)์์ด ํ๋ก์ ํธ IMO์ ์ค์ํฉ๋๋ค. ์คํ์ผ์ด ์ง์ ๋ jsx๋ ๊ฐ๋จํ ์ํฉ์๋ ์ ํฉํ์ง๋ง ์คํ์ผ์ด ๋ง์ ๊ตฌ์ฑ ์์์์๋ ์ฝ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
์ด์ ๊ฐ์ ๋ฐ๋ฒจ ํ๋ฌ๊ทธ์ธ์ด ์ต์ ์ผ๊น์ (์๋ฒ ์ธก๋ ๋ง์ฐฌ๊ฐ์ง)? https://github.com/gajus/babel-plugin-react-css-modules
๋๋ ์ด๊ฒ์ ์๋ ์ํค๋ ค๊ณ ๋ ธ๋ ฅํ์ง๋ง ์ด์ด ์๋ค : /
babel-plugin-css-modules-transform
์ ํจ๊ป ์๋ํ๋ CSS ๋ชจ๋์ด ์์ต๋๋ค. ๋ด ํฌํฌ ์์ ๋ด ํดํค ์์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๋จ์ ์ CSS๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ์๋ฒ๋ฅผ ์ข ๋ฃํ๊ณ ๋ค์ ์์ํด์ผํ๋ค๋ ๊ฒ์ ๋๋ค.
์ผ๋ถ React ๊ตฌ์ฑ ์์๋ import
๊ฐ๋ฅํ ์ ์ ๋ฆฌ์์ค๋ฅผ ํตํด ๊ธฐ๋ณธ ์คํ์ผ์ ๋
ธ์ถํฉ๋๋ค. ์๋ฅผ ๋ค์ด https://github.com/react-component/slider ์ ๊ธฐ๋ณธ ์คํ์ผ์ ๊ฐ์ ธ ์ค๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํฉ๋๋ค.
import 'rc-slider/assets/index.css';
static/
๋๋ ํฐ๋ฆฌ์์ด ์คํ์ผ ์ํธ๋ฅผ ๋ณต์ฌํ์ฌ ๋ถ์ฌ ๋ฃ์ ์๋ ์์ง๋ง ํฅํ ๊ตฌ์ฑ ์์ ์
๋ฐ์ดํธ์์ ์
์คํธ๋ฆผ ์คํ์ผ๊ณผ ๋๊ธฐํ๋์ง ์์ผ๋ฉฐ์ด ๊ตฌ์ฑ ์์ ์ค๋ช
์์์ ๊ถ์ฅํ๋ ๊ฒ๊ณผ ์ผ์นํ์ง ์์ต๋๋ค.
๋ฌธ์ ๋ ์ด๋ฌํ CSS ํ์ผ์ด ์ ์ญ ํจ๊ณผ๋ฅผ ๋์ ํ๋ค๋ ๊ฒ์ ๋๋ค. CSS๋ฅผ _capture_ํ๊ณ React ๋ผ์ดํ ์ฌ์ดํด์ ๋ฃ์ด์ ๋ง์ดํธ ํด์ , ์๋ฒ ๋ ๋๋ง ๋ฑ์ ์ํ ํ ์ ์์ด์ผํฉ๋๋ค.
๋ง์ ๋์๊ด์์ ๊ทธ๋ ๊ฒํ์ง๋ง ์ข์ ํจํด์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
Zeit Next ๋ด๋ถ์ ์ต์ํ์ง ์์ง๋ง import
์ ์ ์ ๋ถ์์ ์ฌ์ฉํ์ฌ CSS๋ฅผ ๋ฑ๋ก / ์บก์ฒ ํ ์ ์์ต๋๊น?
์ฐ๋ฆฌ๋ ํ ์ ์์ง๋ง ์ ๋ง ์ด์ ํ ๊ฒ์
๋๋ค. render()
์ธ๋ถ์์๋ ๊ฒ๊ณผ ์ ์ฌํ๊ฒ ๊ตฌ์ฑ ์์ ์๋ช
์ฃผ๊ธฐ ๋ด์ ๋ง๋ฒ์ฒ๋ผ ์ฝ์
๋ฉ๋๋ค.
// ๋ค๋ฅธ ์ฌ๋๊ณผ ๊ณต์ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
๊ธ์ ... ๋๋ CSS๋ฅผ ํดํนํ๋ ๋ฐ ๋๋ฌด ๋ง์ ์๊ฐ์ ๋ณด๋์ง ๋ง (๋๋ฅผ ์ํด) ์๋ํ๋ ์๋ฃจ์ ์ ๋๋ฌํ์ต๋๋ค. ๋ฌผ๋ก ํดํน์ด์ง๋ง ํซ ๋ฆฌ๋ก๋ฉ์ด ์๋ํ๊ณ ์๋ฒ ์ธก ๊ตฌ์ถ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
์ด gulpfile (https://gist.github.com/auser/25e88e39d83413773c01f4c000ec2806)๊ณผ ํจ๊ป (_shudder_) gulp๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ **/*.scss
ํ์ผ์ด ํจ๊ป ์ฐ๊ฒฐ๋๊ณ ๋ด๊ฐ ๋ง์ดํธํ๋ Styles
๊ตฌ์ฑ ์์๋ก ๋ฐ๋ ค๋ฉ๋๋ค. "์ผ๋ฐ"์์๋ก ํ์ด์ง.
๋ค์์ ์ง์ ํ postcss ์ง์์๋ฐ์ ์์์ ๋๊น์ง ์ด๊ฒ์ด ๋ค๋ฅธ ์ฌ๋์๊ฒ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@auser ํดํน
ํธ์งํ๋ค:
Btw, gulpfile์ sass ํ์๋ฅผ ์ถ๊ฐํด์ผํฉ๋๋ค!
์ ๊ทธ๋ฆฌ๊ณ ์๋์ค ... ์ ๋ ๋จ์ง .scss
ํ์ฅ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ CSS ํ์ผ๊ณผ ๋ฏธ๋ฆฌ ์ปดํ์ผ ๋ ํ์ผ์ ๊ตฌ๋ณํฉ๋๋ค. postcss ( precss
)๋ sass๋ฅผ ์ถฉ๋ถํ ๋ชจ๋ฐฉํ๊ธฐ ๋๋ฌธ์ ๋๋ ํ๋๊ฐ ์์ต๋๋ค. sass ํ์๋ก ์์ ๋กญ๊ฒ ํธ์งํ์ญ์์ค.
ํ์ฌ๋ก์๋ gulp๋ฅผ ์ฌ์ฉํ์ฌ css ํ์ผ์ ์ปดํ์ผํ๊ณ ์ธ๋ผ์ธ์ผ๋ก ๋น๋ํ๊ฑฐ๋ ํซ ๋ฆฌ๋ก๋ฉ์ ์ ๊ฒฝ ์ฐ์ง ์๋ ๊ฒฝ์ฐ / static์์๋ ์ต์์ ์๋ฃจ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
css import + hot reload๊ฐ ๊นจ๋ํ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. CSS๋ ๋ฌธ์์ด๋ก ๊ฐ์ ธ์ค๊ณ ์ฌ์ฉ์๋ ๋ค๋ฅธ ๋ฌธ์์ด๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ด์ง์์์ด๋ฅผ ์ธ๋ผ์ธ ํ ์ ์์ต๋๋ค. ์ด ์์ ๋ฅผ ๋ณด์๊ณ ํ ์คํธ๋ฅผ ๋์์ฃผ์ธ์. PR์ ํ์ํฉ๋๋ค!
https://github.com/davibe/next.js-css-global-style-test
์ด ์์ ๋ next.js ๊ณต์ ์์ ๋ก ๋ง๋ค์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ์ต๋๊น? @rauchg @arunoda @nkzawa (์ง์ ๊ด๋ จ๋์ง ์์ ์ฌ๋์ ํ๊ทธํ๋ฉด ์ฃ์กํฉ๋๋ค)
@davibe ๋ฐ๋ชจ ๋ฐ babel-plugin-wrap-in-js์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์์ ์์ CSS ํ์ผ๊ณผ SCSS ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด๊ฒ์ด postcss ๋ฐ cssnext์์ ์๋ํ๋์ง ์๊ณ ์์ต๋๊น?
@ khrome83 ์ ์๋๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง .babelrc ๋ฐ next.config.js๋ฅผ ์กฐ์ ํ๋ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@davibe ๊ตฌ์ฑ์ ๋ฐ๋ผ ๋ด ์ฑ์ ๋ฐฐํฌ ํ ์ ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋น๋๊ฐ .babelrc
ํ์ผ์์ next/babel
์ ์ฝ์ ์ ์์ต๋๋ค. ๋ฌธ์ ๋ฅผ ์ ์ถํ์ง๋ง์ด ๋ชจ๋ ๊ฒ์์ ํด๊ฒฐ์ฑ
์ด ๋์ค๊ธฐ๋ฅผ ์ ๋ง ๊ธฐ๋ํฉ๋๋ค. ์ ์ฉ์ด์ฑ ๋๋ฝ import file.css
์์ create-react-app
,ํ์ง๋ง ๋ ์์ผ๋ก ํด๊ฒฐ์ฑ
์ด ์์ด์ผ ์๊ณ :)
๋ด๊ฐ ์ํ๋ ์๋ฃจ์ ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค.
https://github.com/zeit/styled-jsx/pull/100#issuecomment -277133969
์ฐ๋ฆฌ ๋ .css
๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์ง์ํ ์ ์์ต๋๋ค (๋จ์ํ ๋ฌธ์์ด์ ๋ด๋ณด๋ด๋ ๋ชจ๋๋ก ํธ๋์ค ํ์ผํจ์ผ๋ก์จ) (๊ทธ๋ฆฌ๊ณ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ๋ฆฌ ์กํธ ์ปดํฌ๋ํธ๋ก ํธ๋์ค ํ์ผํ์ฌ .svg
๋ฅผ ์ง์ํ ์ ์์ต๋๋ค)
๋ง์ฐฌ๊ฐ์ง๋ก .svg๋ฅผ ์์ํ ๋ฐ์ ๊ตฌ์ฑ ์์๋ก ๋ณํํ์ฌ ์ง์ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ ํธ๋ฆญ์ ๋๋ค. ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ณธ ์์ ๋ฅผ ๋ง๋ค๊ฒ ์ต๋๋ค. =)
@davibe ์ํ์ ๊ธฐ๋ฐ์ผ๋ก https://github.com/moxystudio/next.js-style-loader ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด CSS ํ์ผ์ next.js ํ๋ก์ ํธ์ ์ฝ๊ฒ ์ถ๊ฐ ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํ์ ํ ๋ ์คํ์ผ ์ํธ๋ฅผ ์ถ๊ฐ / ์ ๊ฑฐํ๋ค๋ ์ ์์ webpack์ style-loader
์ ์ ์ฌํฉ๋๋ค. SSR๋ ์ง์ํฉ๋๋ค.
css-loader
(css ๋ชจ๋ ํฌํจ ๋ฐ ์ ์ธ), postcss-loader
, sass-loader
๋ฐ ๊ธฐํ ๊ฐ๋ฅํ๋ฉด ์ ์๋ํฉ๋๋ค. css-loader๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ url
์ต์
์ false
beucase next.js ์ด๋ฏธ์ง, ๊ธ๊ผด ๋ฑ์ด /static
๋์ด์ผํฉ๋๋ค. ์ด ๋ชจ๋ ์ ๋ณด๋ README์์ ์ฐพ์ ์ ์์ต๋๋ค.
์ฆ๊ธฐ์๊ณ ํผ๋๋ฐฑ์์ฃผ์ธ์!
repo์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! CSS ํ์ผ์ ๊ฐ์ ธ ์ค๋ ๋ฐ ํจ๊ณผ์ ์ด์์ต๋๋ค. blueprintjs๋ฅผ ์๋ํ๊ณ ์๋๋ฐ CSS๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ๋ก๋๋๋ ๊ฒ ๊ฐ์ต๋๋ค! ๊ทธ๋ฌ๋ CSS์ ํฌํจ ๋ @ font-face ๊ท์น์ด ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. :
--------------------ํธ์งํ๋ค----------------------
์ค์ ๋ก ์๋ํ๊ณ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก nextjs ๋ผ์ฐํ
์ / static / ์ธ๋ถ์์ ์ ์ ์ฝํ
์ธ ๋ฅผ ์ ๊ณต ํ ์ ์์ผ๋ฉฐ ์๋ ๊ฒฝ๋ก๋ก ์ธํด ์ค์ ๋ก ํ์ฉ๋์ง ์๋ ๊ฒฝ๋ก๋ก๋ก๋๋๊ธฐ ๋๋ฌธ์ ์์ด์ฝ์ด๋ก๋๋์ง ์์ต๋๋ค.
@pencilcheck yes / static์ ๊ฐ๋ฆฌํค๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. ์๋ง๋ README์์ ๋ ๋ช ํํ๊ฒ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
fonts atm๊ณผ ๊ฐ์ CSS ํ์ผ์ ํฌํจ ๋ ์๋ ๊ฒฝ๋ก์ ๊ด๋ จ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ์๋๋ฉด ์ ์ฒด ๊ธ๊ผด ํ์ผ๊ณผ CSS๋ฅผ ์ ์ ํด๋์ ๋ณต์ฌํด์ผ ์๋ํฉ๋๊น?
@pencilcheck ๋ CSS ํ์ผ์ด ์ ์ ์ธ๋ถ์์์ ์ /static/file
์ฐธ์กฐํด์ผํฉ๋๋ค.
์๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ npm ํจํค์ง ์ธ blueprint๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก node_modules ๋ด๋ถ์ ํ์ผ์ ์์ ํ ํ์๊ฐ ์๋๋กํ๊ณ ์ถ์ต๋๋ค.
@pencilcheck ๋ถํํ๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. next.js๋ ์ด๋ฏธ์ง ๋ฐ ๊ธฐํ ์์ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ๋งค์ฐ ์๊ฒฉํฉ๋๋ค. ์ด ๋ํ๋ฅผ ๋๋ฝ ํ์ง ๋ง๊ณ ๊ฐ๋ฅํ ๊ฒฝ์ฐ next-style-loader repo์์ ๋ฌธ์ ๋ฅผ ์์ฑํ์ญ์์ค.
@tgoldenberg ๋ฌธ์ ๋ฅผ ๋ ์ ์ค๋ช ํ๊ฑฐ๋ ์ฌํ ๋ฐฉ๋ฒ์ ์๋ ค
@davibe , yarn
์ด์ npm install
yarn
์ฌ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. Yarn์ ์ค๋ช
ํ ์์๋ ์ค๋ฅ๋ฅผ ๋์ก์ง ๋ง ์ผ๋จ ์ ๊ฑฐํ๋ฉด ์์ ๊ฐ ํ๋ก๋์
์์ ์ ์๋ํ์ต๋๋ค.
๋๋ ์ด๊ฒ์ ์ค์ ํ๋ ๋ฐ 4 ์๊ฐ์ ๋ณด๋๊ณ ์๊ฐ์ ์ ์ฝํ๋ ค๋ ๋ชจ๋ ์ฌ๋์๊ฒ ๊ด์ฌ์ด์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ํ์ฌ ์์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ณ๊ฒฝ์ ์คํ์ผ์ ์๋์ผ๋ก ์ ์ฉํ๊ณ PostCSS๋ฅผ ํตํด CSS๋ฅผ ์คํํ๋ฉฐ css-loader
์์ ๋ก์ปฌ ๋ชจ๋ ์ด๋ฆ์ ์ ๊ณตํฉ๋๋ค. ํ์์ ๋ถ์ฌ๋ "๊ธ๋ก๋ฒ css"/ "css ์์
"์์ ์ ํ์ฌ ์ํ์์ ์ ์๊ฒ ์ฃผ์ ๊ฑฐ๋ ์ค๋จ ์์ธ์ด์์ต๋๋ค.
component.js
import React from 'react';
import stylesheet from './styles.css';
const [css, className] = stylesheet;
const Component = () => (
<p className={className.paragraph}>
<Head><style dangerouslySetInnerHTML={{__html: css}} /></Head>
bazinga
</p>
);
.babelrc
{
"presets": [
"next/babel"
],
"plugins": [
["wrap-in-js", {
"extensions": ["css$"]
}]
]
}
next.config.js
exports-loader
์ ๋๋ผ์ด ํดํน์ ์ฃผ๋ชฉํ์ธ์. ๋ ๋์ ๋ฐฉ๋ฒ์ด ์์ด์ผํฉ๋๋ค. ํ์คํ ???
module.exports = {
webpack: (config) => {
config.module.rules.push(
{
test: /\.css$/,
use: [
{
loader: 'emit-file-loader',
options: {
name: 'dist/[path][name].[ext]'
}
},
{
loader: 'raw-loader'
},
{
loader: 'val-loader'
},
{
loader: 'exports-loader',
options: {
0: 'exports[0][1]',
1: 'exports.locals'
}
},
{
loader: 'css-loader',
options: {
modules: true,
minimize: true
}
},
{
loader: 'postcss-loader'
}
]
}
);
return config;
}
};
์ ๋ @satazor ๊ฐ ์ค๋ ๋์์ ๋ ๋์ ๋์ต๋๋ค : https://github.com/jozanza/next-css-json-loader.
next.config.js
๋ช ์ค๋ง ์ถ๊ฐํ๋ฉด๋ฉ๋๋ค.
module.exports = {
webpack: config => {
config.module.rules.push({
test: /\.css$/,
loader: 'emit-file-loader',
options: {
name: 'dist/[path][name].[ext]',
}
}, {
test: /\.css$/,
loader: 'babel-loader!next-css-json-loader',
});
return config;
},
};
์คํ์ผ์ js ๊ฐ์ฒด๋ก ๊ฐ์ ธ ์ค๋ฏ๋ก glamor
๋ฐ ์ ์ฌํ ์๋ฃจ์
๊ณผ ํจ๊ป ์ฌ์ฉํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ์ต๋๋ค.
// .css files now conveniently expose all styles as js objects
import styles from 'some-package/styles.css';
import { css } from 'glamor';
// ...
<div {...css(styles)}>
this is a nice box.
</div>
๊ฑด๋ฐฐ! ๐ป :)
๋งํฌ ๋ค์ด ํ์ผ์ ๋ฌธ์์ด๋ก ๊ฐ์ ธ ์ค๋ ๋ฐ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ํ์ฌ ์์ ๋ก๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง ์นํฉ ํ๋ฌ๊ทธ์ธ์ด๋ฏ๋ก ์๋ฒ์์ ์๋ํ์ง ์์ต๋๋ค.
๋ฟก ๋นต๋จ
๋ฐฉ๊ธ markdown ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์ํด babel ํ๋ฌ๊ทธ์ธ์ ์์ฑํ์ต๋๋ค. ์ง๊ธ์ ๋ด ๋ชจ๋ฐ์ผ์์ ๋ด GitHub๋ฅผ ๋ณด๋ฉด ๋ณผ ์ ์์ต๋๋ค.
@ khrome83 ๊ต์ฅํ ์๋ฆฌ. ๊ทธ๊ฒ์ ์๋ํ๊ธฐ๋ฅผ ๊ธฐ๋
@ khrome83 ๊ฐ์ฌํฉ๋๋ค! ๋ด๊ฐ ํ๋ฒํด๋ณผ ๊ฒ
์ด ์์ ์ ์ ๋ง ๋นจ๋ฆฌํด์ผํ๊ธฐ ๋๋ฌธ์ readme๋ฅผ ์ ๋ฐ์ดํธํ์ง ์์์ต๋๋ค. ํ์ง๋ง ๋ฐ๋ฒจ ํ๋ฌ๊ทธ์ธ์ผ๋ก ํฌํจํ๊ณ
'File.md'์์ ํ์ผ ๊ฐ์ ธ ์ค๊ธฐ;
๋๋ ๊ทธ๊ฒ์ ์ผํ๋ค, ๊ฐ์ฌํฉ๋๋ค! ๋งค์ฐ ๋์์ด ๋จ
์ด๊ฒ์ ์ฃผ์ ์์ ๋ฒ์ด๋ ๊ฒ์ด์ง๋ง ๋ฌธ์ ๊ฐ ์ข ๊ฒฐ๋์์ผ๋ฏ๋ก ์์ ๋กญ๊ฒ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค. :)
๋งํฌ ๋ค์ด์ ๊ฒฝ์ฐ ์ํ ํ ์์๋ ์์ ์ ๋ ๊ฐ์ง์ ๋๋ค.
(1)
ํ๋๋ ๋งํฌ ๋ค์ด ํ์ผ์ ๋ฌธ์์ด๋ก ํฌํจ์ํจ ๋ค์ ๋ฐํ์์ html / react๋ก ๋ณํํ๋ ๊ฒ์
๋๋ค. css์ ๋ํ next.js ์์ examples/with-globa-stylesheet/.babelrc
์์ ์ฌ์ฉ ๋ ๊ฒ์ฒ๋ผ ์ผ๋ฐ wrap-in-js
babel ๋ก๋ ๋ฅผ ์ฌ์ฉํ์ฌ ๋งํฌ ๋ค์ด ํ์ผ ํ์ฅ์์ ๋ฑ๋ก ํ ์ ์์ต๋๋ค.
(2)
๋น์ ์ด ํ ์์๋ ๋ ๋ค๋ฅธ ์ผ์ markdown-in-js๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋์ค ํ์ผ์ ๋งํฌ ๋ค์ด์ ๋ฒ์ญํ๋ ๊ฒ์
๋๋ค.
๋งํฌ ๋ค์ด ๋ฌธ์๊ฐ ์ด๋ฏธ ๋ฏธ๋ฆฌ ๋ ๋๋ง๋์์ผ๋ฏ๋ก ๋ฐํ์์ ๋ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ์ผ๋ถ ์๋๋ฆฌ์ค์์ ๋ ํฅ๋ฏธ๋ก์ธ ์ ์์ต๋๋ค (js ๋ง ์คํํฉ๋๋ค). ๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ์ง์ React ๊ตฌ์ฑ ์์๋ฅผ ์ฝ์
ํ ์ ์์ต๋๋ค. ๋ถํํ๋์ด ๊ฒฝ์ฐ source.js
๊ณผ ๊ฐ์ด ๋งํฌ ๋ค์ด์ ์ธ๋ผ์ธ์ผ๋ก ์์ฑํด์ผํฉ๋๋ค.
(2)๋ฅผ ์ ํํ๋ฉด markdown-in-js ๊ตฌ๋ฌธ์ ๋ํ ๊ตฌ๋ฌธ hilight๋ฅผ ์ ๊ณตํ๋ atom ํ๋ฌ๊ทธ์ธ์ด ์์ผ๋ฉฐ language-markdown-in-js
@davibe ํ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๋๋ markdown์ ๋น๋ ์๊ฐ์ผ๋ก ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ถ์ง๋ง markdown-in-js์ ๋ํ ์ ์ผํ ๋ฌธ์ ๋ ์์ฑํ๋ ๋์ ๋ฐฑํฑ์ ์ด์ค์ผ์ดํํ๋ ๊ฒ์ ๋๋ค. ?
๋ฟก ๋นต๋จ
๊ทธ๋ ์ ๋งํฌ ๋ค์ด ๋ ๋๋ง์ด ์์ต๋๋ค. ํ๋ฌ๊ทธ์ธ์ ์์ฑํ ์ด์ ๋ ๋๊ฐ์ต๋๋ค. ๋งํฌ ๋ค์ด์ ๋ฌธ์์ด๋ก ๋์ด์จ ๋ค์ react-markdown์ ํตํด ์คํํฉ๋๋ค. ๋ชจ๋ ๋ชฉ๋ก์ ์ฒ๋ฆฌํ๋ List ๊ตฌ์ฑ ์์์ ๊ฐ์ด ๋งํฌ ๋ค์ด ๋ ๋ ์กฐ๊ฐ์ ๋ํ๋ด๋ ๋ฐ์ ๊ตฌ์ฑ ์์๋ฅผ ์ ๋ฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ ์ ๋ ์ ์๋ํฉ๋๋ค. Styled JSX์ ์ ์๋ํฉ๋๋ค.
์ด๊ฒ์ ๋ํ ์
๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์์ ์๊ฒฌ์ ํตํด ํ์ฌ ์๋ฒฝํ ์๋ฃจ์
์ด ์์์ ์ ์ ์์ต๋๋ค.
์๋ฃจ
isomorphic-style-loader- https: //www.npmjs.com/package/isomorphic-style-loader๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋ฅผ ๊ฐ์ง ์
๊ทธ๊ฑฐ ์ ๋ง ์๋ฒฝ ํ ๊ฒ ๊ฐ์!
.css ๋๋ .scss ํ์ผ์ ์ฐจ๋ก๋ก ๊ฐ์ ธ ์ค๋ npm ํจํค์ง์์ ๋ฐ์ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ ธ์ฌ ๋ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น? ๊ธฐ๋ณธ์ ์ผ๋ก node_modules์์ ๊ฐ์ ธ์จ ํ์ผ์ ํธ๋์ค ํ์ผ
๋ช ์ฃผ ๋์ CRA (Create-React-App)๋ฅผ ์ฌ์ฉํด ์์ง๋ง ์ค๋์ Next.js๋ฅผ ์ ํ๊ณ CRA๊ฐ ํ์ฌ ์๋ฒ ์ธก ๋ ๋๋ง (SSR)์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ ๋ง ๋ถ๋๋ฌ ์ ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก SSR ์ง์์ ์ํด Next.js๋ก ์ ํํ๊ณ ์ถ์ง๋ง .scss
ํ์ผ์ ๊ฐ์ ธ์ฌ ์์๋ ๊ฒ์ ์ ๋ฅผ ๋ฐฉํดํฉ๋๋ค.
Webpack ๊ตฌ์ฑ์ SASS ๋ก๋๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ฌ๋์ด ์์ต๋๊น?
cr101์ ๋์ํ๊ณ CSS / SASS์ ๋ํ ์ง์์ด ์๋ค๋ ๊ฒ์ ๋์๊ฒ ์ต์ ์ด ์๋ ๊ธฐ์ด์ ๊ฐ์ CSS ํ๋ ์ ์ํฌ๋ฅผ ๋ฒ๋ ค์ผํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
@davibe์์ ์ ๊ณตํ๋ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๊ณ ์์์ง๋ง ๊ทธ๋ ๋ ์ด์ ์ ์ง ๊ด๋ฆฌํ์ง ์์ผ๋ฉฐ ์ต์ ๋น๋ ๊ฐ ๊ทธ๊ฐ ๋ณด์ ํ ์๋ฃจ์ ์ผ๋ก ์ค๋จ๋ฉ๋๋ค .
๋๊ตฐ๊ฐ๊ฐ ์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์๋ค๋ฉด ์ข์ํ ๊ฒ์ ๋๋ค. 2.4.1๋ก ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ๋ณด์ ๋ฒ๊ทธ๋ก ์ธํด ์ ๋์ ์ผ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ด๋ ค๊ฐ ์์๋ ์ต์ ์ด ์์ต๋๋ค.
@Yuripetusko @ cr101 @tgoldenberg ์ ๋์ ์ผ๋ก ๋์ํฉ๋๋ค. ์์งํ ๋ค์์ ์์์์ ๋ฒ์ด๋ ์ผ์ ํ ์ ์๋ค๋ ๊ฒ์ด ์ ๋ง ๋๋จํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ๋ ์ฝ๋ฉ ๋ ๊ตฌ์กฐ (ํ์ /pages
๋๋ ํ ๋ฆฌ, /static
๋ฑ)๋ ๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ ํ ์ง์๋์ง ์๋ scss
๋ชจ๋์ ์ฐ๋ฆฌ์๊ฒ ๋ชจ๋ ๊ฒ์ ๋ง๊ฐ ๋จ๋ฆฝ๋๋ค. ์๋ ์ค๋จ ์ ๊ณผ ๋ชจ๋ ํญ๋ชฉ์ ์ข
ํก๋น ์ฌ ๊ณ์ฐ์ด ํฌํจ ๋ ๋งค์ฐ ๋ณต์กํ scss
๊ตฌ์กฐ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ตฌ์กฐ๋ฅผ ์๋ฒฝํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ์ด์ฌํ ๋
ธ๋ ฅํ์ต๋๋ค. ๋ค์์ ์ฐ๋ฆฌ๊ฐ ์กด์ฌํ๋ ์๊ฐ์ ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ scss
๋ฌผ๊ฑด์ ๋ฒ๋ฆด ์ ์๋ค๋ ์ ์
๋๋ค. ์ง์๋์ง ์๋ scss
๋์ด ์๋ฆ๋ค์ด ๋๊ตฌ๋ก์ ๋ง์ด๊ทธ๋ ์ด์
์ ๋ง๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด์ง๋ง ๊ฐ์ฅ ์ค์ํ ๊ฒ์
๋๋ค.
์ฌ์ค # 1615-์งํ์ค์ธ ์์
์ด ์์ต๋๋ค. @timmywil ์ด next
๊ณผ (์) ํจ๊ป ์๋ํ๋๋ก isomorphic-style-loader
์ (๋ฅผ) ์ค์ ํ๋ ค๊ณ ํฉ๋๋ค. ๊ด์ฌ์๋ ๋ชจ๋ ์ฌ๋์ด ๊ฐ์
ํ๊ณ ์ฐธ์ฌํ ์ ์์ต๋๋ค.
์ด ์ค๋ ๋๊ฐ ๊ฐ๋ฆฌํค๋ ๋ชจ๋ ์๋ฃจ์ ์ ์๋ํ์ง๋ง ๊ทธ์ค ํ๋๋ฅผ ์๋์ํฌ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ ๋ ์ ์์ ์ ์๋๋ฅผํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ ์ฌ๊ธฐ์ ๊ทธ๊ฒ์ ๋ฌธ์ํํ์ต๋๋ค
@almeynman ๊ฐ์ฌํฉ๋๋ค! ํ์คํ ๋น์ ์ ์ ๊ทผ ๋ฐฉ์์ ๋ณผ ๊ฒ์
๋๋ค!
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๋๋ ์ด ์์ ์ ๋ฐ๋ผ scss
๋ชจ๋์ด ์๋ํ๋๋ก ๊ด๋ฆฌํ์ต๋๋ค. ๋ด๊ฐ ํ ๊ฒ์ sass-loader
ํ๊ณ ์์ค ๋งต์ ํ์ฑํํ๋ ๊ฒ๋ฟ์
๋๋ค.
์ด๋ฐ ์์ผ๋ก next.js
์ง์ CSS (์ฌ์ง์ด SCSS)๋ฅผ ๋ง๋ค ์์์์ต๋๋ค.
๋จผ์ next.config.js
์์ ์ฃผ์ด์ง ๋ก๋์ DefintPlugin
์ธ์คํด์ค๋ฅผ ์ถ๊ฐํ์ฌ ์นํฉ ๊ตฌ์ฑ์ ์กฐ์ ํฉ๋๋ค.
const webpack = require('webpack');
module.exports = {
webpack: (config, {dev}) => {
config.module.rules.push({
test: /\.scss$/,
use: [
'style-loader',
'css-loader',
'sass-loader'
],
exclude: /node_modules/,
});
config.plugins.push(
new webpack.DefinePlugin({
"process.env": {
// flag to indicate this is for browser-side
BROWSER: JSON.stringify(true),
}
})
);
return config;
}
};
๊ทธ๋ฐ ๋ค์ ๊ตฌ์ฑ ์์ ์ฝ๋์์ ์กฐ๊ฑด์ด์๋ ์คํ์ผ ํ์ผ์ด ํ์ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ธก ๋ฒ๋ค๋ง์๋ง ์คํ์ผ ๋ชจ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
if (process.env.BROWSER) {
require("./style.scss");
}
if (process.env.BROWSER)
๊ด์ฐฎ๋ค๋ฉด ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค.
์ข์ ์ ๊ทผ ๋ฐฉ์์ด ์ฌ๊ธฐ ์์ต๋๋ค
@almeynman IMO๋ ํด๋น ํ์ด์ง์ ๊ด๋ จ๋ CSS ์คํ์ผ ๋ง๋ก๋ํ๋ ๋์ ๋ชจ๋ ํ์ด์ง์์ ์ ์ฒด ์น ์ฌ์ดํธ์ ๋ํ CSS ์ฝ๋๋ฅผ๋ก๋ํ๋ฏ๋ก ๊ทธ๋ฆฌ ์ข์ ์ ๊ทผ ๋ฐฉ์์ ์๋๋๋ค.
์ ์ฒด ์น ์ฌ์ดํธ์ CSS ๋์ ํ์ํ .scss ํ์ผ ๋ง ๊ฐ์ ธ ์ค๋ฉด ํ์ํ CSS ์ฝ๋ ๋ง๋ก๋ํ์ฌ ํ์ด์ง ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
@ cr101 ์๋ ํ์ธ์, ์ ๋ ๋ชฐ๋์ต๋๋ค. ๋๋ ๊ทธ ์ค์ ์ ์ค์ ๋ก ์ฌ์ฉํ์ง ์์์ผ๋ฉฐ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ํด ์ฐธ์กฐํ๊ธฐ ์ํด ๊ฒ์ํ์ต๋๋ค (๋๋ ๊ทธ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํ์ต๋๋ค ...). ๋๋ ์ฌ์ ํ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์ค๋ช ๋ ๋ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ ์ค์ ์ ๋ํ ํผ๋๋ฐฑ์ ์ฃผ์๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๊ด์ฌ์ด ์๋ค๋ฉด ๋ ๋ง์ ์์ ํ ๋ก :
https://github.com/iaincollins/nextjs-starter
https://github.com/zeit/next.js/issues/2534
https://github.com/zeit/next.js/tree/v3-beta/examples/with-global-stylesheet
์์์ด ์ค๋ ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก PostCSS๋ฅผ ์ฌ์ฉํ์ฌ ๋ณํ ํ ์์์์ต๋๋ค.
/static/styles/app.css
์์๋ ๋จ์ผ CSS ํ์ผ๋ก ๋ณํํ์ฌ ํซ ๋ฆฌ๋ก๋ฉ์ด ์ฌ์ ํ ์๋ํฉ๋๋ค. styled-jsx
์ ์ฌ์ฉ๋ฒ์ ์ ์ํ์ญ์์ค. ๊ทธ๋ฌ๋ <style dangerouslySetInnerHTML={} />
์ฌ์ฉํ์ฌ ์์ด๋ ์ํ ํ ์ ์์ต๋๋ค.
module.exports = {
plugins: [
require("postcss-easy-import")({ prefix: "_" }), // keep this first
require("postcss-url")({ url: "inline" })
]
};
ํซ ๋ฆฌ๋ก๋๋ฅผ ์ํด dev ๋ชจ๋์์ .scss๋ฅผ ๋ณํํ๊ณ prod์ ๋จ์ผ .css ํ์ผ๋ก ์ถ์ถํ๋ ๋ก๋. ์ด๊ฒ์ ๋์๊ฒ build/app.css
ํ๋ฏ๋ก Production ๋น๋์์ cp build/app.css static/styles/app.css
๋ค์ next build
๋ฅผ ์ถ๊ฐํ์ฌ ์ ์ ๋ด๋ณด๋ด๊ธฐ์์ ์ฌ์ฉํ ์ ์๋๋กํ๊ณ ์๋์ ๊ฐ์ด ์ฌ์ฉ์ ์ง์ ํค๋์ ํฌํจํฉ๋๋ค.
const ExtractTextPlugin = require('extract-text-webpack-plugin');
export default {
webpack: (config, { dev }) => ({
...config,
module: {
...config.module,
rules: [
...config.module.rules,
{
test: /\.(css|scss)/,
loader: 'emit-file-loader',
options: {
name: 'dist/[path][name].[ext]'
}
},
...(dev
? [
{
test: /\.css$/,
use: ['raw-loader', 'postcss-loader']
},
{
test: /\.s(a|c)ss$/,
use: [
'raw-loader',
{
loader: 'postcss-loader',
options: {
sourceMap: true
}
},
{
loader: 'sass-loader',
options: {
sourceMap: true
}
}
]
}
]
: [
{
test: /\.(css|scss)/,
use: ExtractTextPlugin.extract({
use: [
{
loader: 'css-loader',
options: {
importLoaders: 2,
modules: false,
url: true,
minimize: true,
localIdentName: '[hash:base64:5]'
}
},
{
loader: 'postcss-loader'
},
{
loader: 'sass-loader'
}
]
})
}
]),
{
test: /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)(\?.*)?$/,
loader: 'url-loader?limit=100000&&name=[name].[ext]?[hash:8]'
}
]
},
plugins: [
...config.plugins,
...(dev ? [] : [new ExtractTextPlugin('app.css')])
]
}),
};
const inlineCSS =
process.env.NODE_ENV !== ENV_PRODUCTION && require('styles/index.scss');
...
<Head>
{inlineCSS && <style jsx global> {__html: inlineCSS} </style>}
{process.env.NODE_ENV === ENV_PRODUCTION &&
<link
rel="stylesheet"
type="text/css"
href={`/static/styles/app.css?${this.props
.__NEXT_DATA__.buildId}`}
/>}
</Head>
๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ ์์ธํ ์ค๋ช ์ด ํ์ํ ์ฌ๋์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์. ๋ ๋ง์ ์๋ฃจ์ ์ ๊ธฐ๋ํฉ๋๋ค. ๋คํํ๋ ๋๊ตฐ๊ฐ๋ ์ฌ์ ํ ๋ค์ ๊น๋ค ๋กญ๊ณ ์์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ํตํฉ์ด๋ฏ๋ก ๊ฒฐ๊ตญ ์ข์ ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค ์ ์์ต๋๋ค.
๋ชจ๋ .scss
ํ์ผ์ ๋จ์ผ CSS ํ์ผ๋ก ์ถ์ถํ๋ ๋์ ๊ฐ์ ธ์จ ๊ฐ .scss
ํ์ผ์ ์์ฒด CSS ํ์ผ๋ก ์ปดํ์ผํ๋ ๊ฒ์ด ํจ์ฌ ์ข์ต๋๋ค. ์ด๋ ๊ฒํ๋ฉด ๊ฐ ํ์ด์ง์์ ํ์ํ CSS ์คํ์ผ ๋ง๋ก๋ ํ ์ ์์ต๋๋ค.
๊ทธ๋๋ ์ด๋ป๊ฒํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ด ํ ์์ฒญ์ ํ์ธํ์ญ์์ค. ์ข์ ํด๊ฒฐ์ฑ
์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
https://github.com/zeit/next.js/pull/2638
@ cr101 ์ฌ์ค์
๋๋ค. ์ฐ๋ฆฌ๋ ์์ฒด ๋ด๋ถ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค๋ฅธ ํ๋ก์ ํธ๋ก ๊ฐ์ ธ์ค๊ณ ์์ผ๋ฏ๋ก ํญ์๋ก๋ ํ ํ์ผ์ ํฐ ๋ฉ์ด๋ฆฌ๊ฐ ์์ต๋๋ค (์ด์์ ์ธ ๊ฒ์ ์๋์ง๋ง ์ฌ์ ํ ๊ทธ ์ง์น์ ๋ชจ๋ํํ๋ ์์
). compile and serve 1 file
์์ X number of files at X locations
์
๋๋ค. ๋ ์์ CSS ์ฒญํฌ์ ์ธ๋ถ ์บ์ฑ ๊ฐ๋ฅํ๊ณ ์ฑ๋ฅ์ด ์ข์ CDN ํธ์คํ
๋ฒ์ ์ผ๋ก ๋๋๋ ์ ์ถฉ์ ์ ๊ณ ๋ คํ ๋ ๋ ๋ณต์กํด ์ง๋ฏ๋ก ์ฌ๋ฏธ ์์ง๋ง ํ๋ก์ ํธ ์์ฒด๋ฅผ ํฌํจํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํธ์ง-Next๊ฐ ์ฒ๋ฆฌํ๋ ค๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฒ์ด ํ์คํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ชฉํ๋กํด์ผํ๋ ์ต์ ์ ๋ฐฉ๋ฒ์ Next ํ๋ฌ๊ทธ์ธ ๋๋ ํจํด์
๋๋ค.
์ด๊ฒ์ด ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์๋์ง ํ์คํ์ง ์์ง๋ง ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์ ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋งค์ฐ ๊ฐ๋จํ ์๋ฃจ์ ์ ๋๋ค. CSS ๋ํผ๋ฅผ ๋ง๋์ญ์์ค.
import styled from 'styled-components';
const Collapse = props => (
<__Collapse>
{ props.children }
</__Collapse>
);
export default Collapse;
/**
* CSS
*/
const __Collapse = styled.div`
.rc-collapse {
background-color: #f7f7f7;
border-radius: 3px;
border: 1px solid #d9d9d9;
}
...
`;
import RcCollapse from 'rc-collapse';
import Collapse from '~/components/rc/Collapse';
const HelpPage = () => (
<Collapse>
<RcCollapse>
<RcCollapse.Panel header="Title">Content</RcCollapse.Panel>
</RcCollapse>
</Collapse>
);
์ด ์ ๊ทผ ๋ฐฉ์์ ๋ํด ๋ด๊ฐ ์ข์ํ๋ ์ ์ .css
๊ฐ์ ธ์จ ๊ฒฝ์ฐ ์๋ ๊ท์น ์์ ์ฌ์ ์๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ์์ค CSS์์ ์ฌ์ฉ์ ์ ์ ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค (์ด์จ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ํํด์ผ ํจ). node_modules
.css
ํ์ผ.
๋ค์์ babel-plugin-inline-import๋ฅผ ์ฌ์ฉํ์ฌ CSS ํ์ผ์ ๊ฐ์ ธ ์ค๋ ๊ฐ๋จํ ์๋ฃจ์ ์ ๋๋ค.
.babelrc
{
"presets": ["next/babel"],
"plugins": [
[
"inline-import",
{
"extensions": [".css"]
}
]
]
}
ํ์ด์ง / ๊ตฌ์ฑ ์์
import "prismjs";
import { PrismCode } from "react-prism";
import prismGlobalStyles from "prismjs/themes/prism.css";
export default () => {
return (
<div>
<style global jsx>
{prismGlobalStyles}
</style>
<PrismCode className="language-javascript">
{`function(noop) {
return noop;
}`}
</PrismCode>
{/* ... */}
</div>
);
};
@stovmascript ์ด๊ฒ์ ์๋ฆ๋ค์ด ์๋ฃจ์ ์ด์ง๋ง ์ฌ์ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค (https://github.com/Hacker0x01/react-datepicker์์ .css ๋น๋๋ฅผ ๊ฐ์ ธ์ต๋๋ค). ์ฌ๊ธฐ์ ๋ค๋ฅธ ๊ฒ์์ด์๋ ๊ฒ์ด ํ์คํฉ๋๊น? ์ค๋ฅ๋ก ์ธํด ๋ค๋ฅธ ์์ค์ CSS๋ก๋๊ฐ ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
@hilarykitz , @stovmascript ์๋ฃจ์ ์ด ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค. ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ๋ณด๋ด ์ฃผ์๊ฒ ์ต๋๊น?
@stovmascript- ๋ฐ๋ฒจ ์บ์๋ฅผ ์ด๋ป๊ฒ ์ ๊ฑฐํ๊ณ
@ khrome83 ๋น์ ์ node_modules / .cache๋ฅผ ์ง์์ผํฉ๋๋ค
์บ์๋ฅผ ์ง์ฐ๊ณ ์์ ํจ๊ป ์๋ํ๋ babel-inline-loader ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ ๋ ๋์ ์๋ฃจ์
์ ์ฐพ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ฌธ์ ๋ ์ ์ญ ์คํ์ผ ๋ง ์ ์ฉ ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. <style jsx global>
ํ๊ทธ๊ฐ ์๋ ํ๊ทธ์์ ์ฌ์ฉํ๋ฉด ๋ชฉ์ ์ ๋ง์ง ์๊ฒ data-jsx๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๊ฐ๋์ง ์์ต๋๋ค.
์บ์๋ฅผ ์ง์ฐ๊ณ ์์ ํจ๊ป ์๋ํ๋ babel-inline-loader ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ ๋ ๋์ ์๋ฃจ์ ์ ์ฐพ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ฌธ์ ๋ ์ ์ญ ์คํ์ผ ๋ง ์ ์ฉ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋น์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
@stovmascript ์ ์๋ฃจ์ ์ ์ฌ์ฉํ์ฌ ์์ ๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
๋ ์ด์์ ์ธ๋ถ CSS๋ฅผ ์ด๋ป๊ฒ ํฌํจํฉ๋๊น?
๋์ผํ ๊ตฌ์ฑ ์์์์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ 2 ๊ฐ๋ฅผ ์ฌ์ฉํ๊ณ ๊ฐ๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ์๋ํ์ง๋ง ๊ฒฐํฉํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
import rtStyle from 'react-table/react-table.css';
import dpStyle from 'react-datepicker/dist/react-datepicker.css';
...
render() {
return (
<div>
{/* <style jsx global>{ rtStyle }</style> */}
<style jsx global>{ dpStyle }</style>
...
@CHarnel ์๋ <style jsx global>{ rtStyle }{dpStyle}</style>
@almeynman์ด ๋ฐ๊ณ ์์ต๋๋ค :
Module build failed: SyntaxError: C:/.../components/activeUsersTable.js:
Expected one child under JSX Style tag, but got 2 (eg: <style jsx>{`hi`}</style>)
@CHarnel์ ๋ ๋ค ํ ํ๋ฆฟ ๋ฌธ์์ด์
@CHarnel ์ด ์ ๊ทผ ๋ฐฉ์์ ์๋ํ์ญ์์ค.
<style jsx global>{
$ {rtStyle} $ {dpStyle} }</style>
๋ฟก๋ฟก
๋๋ ๊ทธ CSS๋ฅผ ํ๋์ js ํ์ผ์ ๋ฃ๊ณ ๊ทธ๊ฒ์ ๋ด๋ณด๋ด๋ ค๊ณ ํฉ๋๋ค.
import bootstrap from 'bootstrap/dist/css/bootstrap.min.css'
import styles from './index.css'
export default bootstrap + styles
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฅ
import styles from '../styles'
...
<style jsx global>{styles}</style>
https://github.com/sheerun/extracted-loader ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ ๋ฐ ํ๋ก๋์ ๋ชจ๋์ ExtractTextPlugin์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๊ฐ๋ฐ์ ๋ค๋ฅธ html์ ์ฌ์ฉํ๊ฑฐ๋ CSS๋ฅผ js์ ์ฝ์ ํ ํ์๊ฐ ์์ต๋๋ค.
@comus ๋๋ ๋น์ ์ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉ
@sheerun ์ข์ ์ฌ๋, ๊ฐ์ฌํฉ๋๋ค
next.js์ ํจ์ฌ ๋ ํฌ๊ด์ ์ธ ์์ ๋ฅผ ์ ์ถํ์ต๋๋ค.
https://github.com/zeit/next.js/pull/3451
์ด๊ฒ์ nextjs v4 ์ด์ ์ ์๋ํ์ต๋๋ค.
<style jsx global>{style}</style>
<style jsx global>{colors}</style>
<style jsx global>{layout}</style>
์ด aproach๋ฅผ ์ฌ์ฉํ์ฌ jsx ์ ์ญ ์คํ์ผ์๋ก๋ํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น? <style jsx global>{ rtStyle }{dpStyle}</style>
์ ๋ emit-files-loader
๊ธฐ๋ฐ์ผ๋ก ํ ์๋ฃจ์
์ ๋ง๋ค์์ต๋๋ค. ๊ด์ฌ์ด ์๋ค๋ฉด ์ฌ๊ธฐ์ ๊ฒ์ ํ ์ ์์ง๋ง ์ฌ์ฉ์ ์ ์ ์๋ฒ ์ค์ ์ ์์กดํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก .next
๋น๋ ๋๋ ํ ๋ฆฌ ๋ด์์ ๋จ์ผ ๋๋ ํ ๋ฆฌ๋ฅผ ์ ์ ์ผ๋ก ์ ๊ณต ํ ์ ์์ด์ผํฉ๋๋ค. ์๋ฒ์ /_next/...
๊ฒฝ๋ก ๊ตฌ์กฐ์ ์์กดํ์ฌ ์๋ฒ์์ด ๊ตฌ์ฑ ํ ์ ์์ต๋๋ค.
๊ทธ ์ธ์๋ import stylesheet from './styles/style.[scss|less|stylus|w/e]';
๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ ์คํ์ผ ์ํธ ํ์ผ์ ๊ณต์ฉ ๊ฒฝ๋ก๊ฐ๋๋ฏ๋ก <link>
๋ฃ์ ์ ์์ต๋๋ค. ์๊ตฌ ์บ์ฑ์ ์ํด ?[hash]
๋๋ฉฐ ํซ ๋ฆฌ๋ก๋๋ฅผ ์ํํฉ๋๋ค.
@nikolakanacki ๊ณต์ ์ง์์ด ๊ณง ๋์ ๋ ์์ ์ ๋๋ค ๐ https://github.com/zeit/next.js/pull/3578
@timneutkens ๋๋ ์ด๊ฒ์ ๋ณธ ์ ์ด ์๋๋ฐ, "๋งค์ฐ ๊ณง"์ ๋ํ ํ๊ฐ๊ฐ ์์ต๋๊น? ์ด๋ฏธ ์นด๋๋ฆฌ์์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ๋ฐ๋ก ํด๊ฒฐ์ฑ
์ด ํ์ํ๊ณ , ํ๋๋ฅผ ์ฐพ๊ธฐ ์ํด 2-3 ์ผ์ ๋ณด๋๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก "์ฌ์ด ์์ "์ธ ๋๋ง์ ์๋ฃจ์
์ ์์ฑํ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ extract-text-webpack-plugin
๊ฒฐํฉํ์ฌ ๋ชจ๋ ๋ณ๋์ .[css|stylus|less|scss]
ํ์ผ์ ์ ์ ์ผ๋ก ์กฐ์ธํ๊ณ ๋ค์ ์์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ๋จ์ผ ์ ์ ๋ฆฌ์์ค๋ก ๋ชจ๋ ์ฌ์ฉํ ์ ์๋๋กํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ๊ณ ์์ต๋๋ค.
์ด ๋ฌธ์ ์์ด๋ฉด์์๋ ์ฃผ์ ๋ฌธ์ ๋ ํ๋ก๋์ ๋ฐ ๊ฐ๋ฐ ๋น๋ ๋ค์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ง์ "๋ง๋ฒ"์ด ์งํ๋๊ณ ์์ผ๋ฉฐ ํซ ๋ฆฌ๋ก๋ฉ ๋ฐ ๊ธฐํ ์์ ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ์์ค๋ฅผ ์ฝ๊ณ ์ด๋ป๊ฒ ์กฐ๋ฆฝ๋๋์ง ๋ณผ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ทธ๊ฒ์ ๋ง๋ ์ฌ๋์ด ๊ทธ๊ฒ์ ๋ํด ๋ฌธ์๋ฅผ ์์ฑํ๋ฉด ๋ ๋ง์ ์ฌ๋๋ค์ด ๊ธฐ์ฌํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@kimsj_ssj แ แ แ แ แ แ
์ด ํ์ผ์ extract-text-webpack-plugin๊ณผ ๊ฒฐํฉํ์ฌ ๋ณ๋์ ๋ชจ๋ . [css | stylus | less | scss] ํ์ผ์ ์ ์ ์ผ๋ก ์กฐ์ธํ๊ณ ๋ค์์์ด ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ๋จ์ผ ์ ์ ๋ฆฌ์์ค๋ก ๋ชจ๋ ์ฌ์ฉํ ์ ์๋๋กํ๋ ๋ฐฉ๋ฒ๋ ์๊ฐํ๊ณ ์์ต๋๋ค. .
๋ค์ v5 ์ฉ์ผ๋ก ์์ฑํ ํ๋ฌ๊ทธ์ธ์ ์ด๋ฏธ์ด ์์ ์ ์ํํ๊ณ ์์ผ๋ฉฐ ๊ณง ์คํ ์์ค๊ฐ ๋ ๊ฒ์ ๋๋ค ๐
๋ด๋ถ ๋ฌธ์ ์์ฑ๊ณผ ๊ด๋ จํ์ฌ v5๊ฐ ์ถ์ ๋ ํ ๋ชจ๋ ๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ฌธ์ํ ํ ๊ณํ์ ๋๋ค.
@timneutkens ๊ฐ์ฌํฉ๋๋ค!
@timneutkens ์ ๋ฐ์ดํธ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ฌ๊ธฐ์ ์ ๋ฐ์ดํธ๋ฅผ ๊ฒ์ํ์ญ์์ค!
์ด๊ฒ์ ๋ํ ์์์ด ์์ต๋๊น?
๋ค๋ฅธ ์์์ด ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค ๐ค
์ด๊ฒ์ Next.js v5์์ ๋ฆด๋ฆฌ์ค๋์์ต๋๋ค.
Readme https://github.com/zeit/next.js#importing -css--sass--less--stylus-files์๋ ์์ต๋๋ค.
๋ํ ์ธ๊ธ ๋ PR์ด ํฉ๋ณ๋์ด์ด ๋ฌธ์ ๊ฐ ์ข ๊ฒฐ๋์์ต๋๋ค.
๋ฃจํธ ํ๋ก์ ํธ์ / static ํด๋๋ฅผ ๋ง๋ค๊ณ / static ์์ file.css๋ฅผ ๋ฃ์ ๋ค์ ํค๋ html ๊ตฌ์กฐ ํธํฌ์.
import Head from 'next/head';
<Head>
<meta charset="utf-8" />
<link rel="stylesheet" href="/static/css/custom.css" />
</Head>
๊ทธ๋ฐ ๋ค์ ์ด๋์๋ className์ ์ฌ์ฉํ์ญ์์ค!
@comus
๋งค์ฐ ํฌ๊ด์ ์ด๊ณ ๋๋ํฉ๋๋ค .. ๊ฐ์ฌํฉ๋๋ค .. ํ๋ฃจ ์ข ์ผ ์ด๋ฐ ์ข ๋ฅ์ ์๋ฃจ์ ์ ์ฐพ๊ณ ์์ต๋๋ค ..
๋ฃจํธ ํ๋ก์ ํธ์ / static ํด๋๋ฅผ ๋ง๋ค๊ณ file.css๋ฅผ / static ์์ ๋ฃ์ ๋ค์ Header html structure hock์ ๋ฃ์ผ์ญ์์ค.
import Head from 'next/head'; <Head> <meta charset="utf-8" /> <link rel="stylesheet" href="/static/css/custom.css" /> </Head>
๊ทธ๋ฐ ๋ค์ ์ด๋์๋ className์ ์ฌ์ฉํ์ญ์์ค!
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฃจํธ (package.json ํ์ผ์ด์๋ ์์น)์ '๊ณต์ฉ'ํด๋๋ฅผ ๋ง๋ญ๋๋ค.
# 8626์ ํตํด ์ง์์ด ์ถ๊ฐ๋ฉ๋๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ค์์ babel-plugin-inline-import๋ฅผ ์ฌ์ฉํ์ฌ CSS ํ์ผ์ ๊ฐ์ ธ ์ค๋ ๊ฐ๋จํ ์๋ฃจ์ ์ ๋๋ค.
.babelrc
ํ์ด์ง / ๊ตฌ์ฑ ์์