๋ค์์ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฏ๋ก ํจํค์ง์์ ์คํ์ผ์ํธ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ํ์ด์ง์์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
Global CSS cannot be imported from files other than your Custom <App>. Please move all global CSS imports to pages/_app.tsx.
Read more: https://err.sh/next.js/css-global
์ด๊ฒ์ด ์ด๋์์ ์ ๋ํ๋์ง ์ดํดํ๋ ๋์ ์ฝ๋ ๋ถํ ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค. ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ ธ์ค๋ฉด CSS๋ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ์ ํ๊ธฐ์ ๋ฒ์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ง์ ํ์ง ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ ์ ์์ง๋ง ๊ทธ๋ ๋ค๊ณ ํด์ ์ด ๊ฒฝ๊ณ ๋ฅผ ๋ฎ์ด์ฐ๋ ๊ฒ์ ๋ง์ ์๋ ์์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ์ ธ์จ CSS๋ ๋ณธ์ง์ ์ผ๋ก "์ ์ญ"์ด ์๋๋๋ค.
import "my-library/index.css"
yarn dev
ํ์ผ์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฐ๋ฅํ ์๋ฃจ์ ์ด ์์ต๋๋ค.
next.config.js
๊ธ๋ก๋ฒ ํ๋๊ทธ์ด์ ๋ํ ์ด์ ๋ ผ์๊ฐ ์์์ต๋๋ค.
์คํ์ผ์ํธ๋ ๋ณธ์ง์ ์ผ๋ก ์ ์ญ์ ์ด๊ธฐ ๋๋ฌธ์ Custom์ผ๋ก ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
์์. ์ด๋ ์ ์ญ ์คํ์ผ์ ๋ํ ํด๋์ค ์ด๋ฆ ๋ฐ ์์ ์ถฉ๋์ ํผํ๊ธฐ ์ํด ํ์ํฉ๋๋ค.
๋๋ ์ด ๋ง์ ๋์ํ์ง ์์ต๋๋ค. ์ถ๋ก ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ CSS ๋ชจ๋์ ์ฌ์ฉํ ์ ์๊ณ ๊ฐ์ ธ์ฌ CSS ํ์ผ๋ก ํจํค์งํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์๋ฒฝํ๊ฒ ์ ํจํ๊ณ ์ผ๋ฐ์ ์ธ ๊ดํ์ด๋ฉฐ ๋ถ์์ฉ์ด ์์ต๋๋ค .
_app
์ ์ ์ญ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์ฌ๋ฐ๋ฅธ ์ ํ์ด๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ ์ข
๋ฃ๋์์ต๋๋ค.
์ด ๋๊ธ ์ ์ ํํ ๋ฌธ์ ๋ฅผ ์ค๋ช
ํ์ง๋ง ๋ฌธ์ ๊ฐ ์ข
๋ฃ๋์๊ธฐ ๋๋ฌธ์ ์๋ต์ด ์์ต๋๋ค. ๋๊ธ์ ๊ธ์ ์ ์ธ ๋ฐ์์ ๋ง์ด ๋ฐ์๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ ์ฌ๋์ ๋๋ฟ๋ง์ด ์๋ ๊ฒ์
๋๋ค.
๊ด๋ จ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ด๋ จ์ด ์์ ์ ์์ง๋ง ํ์คํ์ง ์์ต๋๋ค.
๋๋ ๋ง์ ์ฌ์ฉ์ ์ ์ ์ํธ์๊ณผ ์ธํฐ๋ํฐ๋ธ ์ผ๋ฌ์คํธ๋ ์ด์
์ผ๋ก ๊ธด ๊ธฐ์ฌ๋ฅผ ์๋๋ค. ๊ธฐ์ฌ๋ ์๋นํ ์์ CSS๋ก SVG๋ฅผ ๋ ๋๋งํ๋ ๋ฐ์ ๊ตฌ์ฑ ์์์ ํจ๊ป ๊ฐ์ธ npm ํจํค์ง๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ํจํค์ง๋ CSS ๋ชจ๋์ ์ฌ์ฉํ๊ณ index.js
๋ฐ index.css
๋ด๋ณด๋
๋๋ค. ๋ชจ๋ CSS ํ์ผ์ _app
ํ๋ฉด ์ฌ๋๋ค์ด ํํ์ด์ง, ์ฐ๋ฝ์ฒ ์์ ๋๋ ๊ธฐํ ๋ฌธ์์ ์๋ ๊ฒฝ์ฐ์๋ 100% ์ฌ์ฉ๋์ง ์๋๋ผ๋ ๋ชจ๋ CSS๊ฐ ๋ก๋๋ฉ๋๋ค. ๋ํ ๊ฑฐ์ ๋ชจ๋ ํ์ด์ง๊ฐ _app
์ CSS ๊ฐ์ ธ์ค๊ธฐ์ ํด๋นํ๊ธฐ ๋๋ฌธ์ ํ์ผ ์์คํ
์ด ํ์ด์ง๋ฅผ ๊ด๋ฆฌํ๋๋ก ํ๋ ๊ฒ๋ ๋ฐ๋์
๋๋ค.
์์ฒด ํด๋์ค ์ด๋ฆ์ ๋ฒ์๋ฅผ ์ง์ ํ๋ Linaria๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค. ์์ฑํ๋ CSS ํ์ผ์ด .module.css
๋๋์ง๋ ์์ง๋ง "๋ชจ๋"์
๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฝ๊ฒ ํตํฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
์ nextjs๋ก ๋ค์ ์ ํํ์ต๋๊น?
๋ํ node_modules ์ธ๋ถ์์ GlobalCSS๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ด๊ฒ์ CSS ๋ชจ๋์ ์ ์ง์ ์ผ๋ก ์ฑํํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๋ค ์ด๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค! ๋ง์ npm ํจํค์ง๊ฐ nextjs์์๋ ์๋ํ์ง ์์ง๋ง CRA ๋๋ ๋ค๋ฅธ ํ๋ ์์ํฌ์์๋ ์๋ํฉ๋๋ค.
@use
์ง์ ๋ฐ sass ๋ชจ๋๊ณผ ๊ฐ์ dart sass์ js ๊ตฌํ๊ณผ ํจ๊ป ์ด๊ฒ์ ์ฌ์ฉํ๋ ค๋ ๋ค๋ฅธ ์ฌ๋์ ์ํด, node-sass์ ์ข
์์ฑ์ด ์๋ ๋ค๋ฅธ ๋
ธ๋ ๋ชจ๋์ด ์๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋ค์ ์ค์ sass ๋์ node-sass๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ก์ปฌ์์ ๋ค์์ ์ํํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
// example next.config.js
module.exports = {
webpack(config, options) {
config.module.rules.forEach(rule => {
if (rule.oneOf) {
const nestedScss = rule.oneOf.find((one) => {
return one.test
&& 'some.scss'.match(one.test)
&& one.issuer
&& one.issuer.include
&& one.issuer.include.includes('_app');
});
if (nestedScss) {
const sassLoader = nestedScss.use.find(u => u.loader.includes('sass-loader'));
// Set implementation to sass instead of node-sass here.
sassLoader.options.implementation = require('sass');
}
}
})
}
}
๊ทธ๋ฐ ๋ค์ _app.js
์์ scss ํ์ผ์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
@smurrayatwork ์ฝ๋ฉ์ด ์๋๋ผ ํดํน์ ๋๋ค ์ฃ์กํฉ๋๋ค
๋ํ _app.js ์ ์ฉ์ด๋ผ๋ ์ ํ๋ ์ฝ๊ฐ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค.
๋ชจ๋ ๊ณณ์์ CSS ์ฐธ์กฐ๋ฅผ ์ง์ํ์ง ์์ผ๋ ค๋ฉด _app
(๋ค๋ฅธ ๊ณณ์์๋ ์ฐธ์กฐ๋์ง ์์)์ ์ง์ ์ ์ธ ์ข
์์ฑ์์๋ CSS๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ก ๋ง๋ค ์ ์์ต๋๊น?
์ฆ. _app
(๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๊ณณ์ ์๋)์์ ์๊ตฌํ๋ ๊ฒฝ์ฐ CSS์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ฒฐ์ ์ ์์๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด์์ ์ด์ง๋ ์์ง๋ง ๋ด๊ฐ ๊ฐ์ง ์ฌ์ฉ ์ฌ๋ก๋ ๊ณต์ CSS๋ฅผ ๊ฐ์ ธ์ค๋ ๊ณต์ ๋ชจ๋์ ๊ฐ์ ธ์ค๋ ์ฌ๋ฌ ์์ฉ ํ๋ก๊ทธ๋จ์์ ๊ณต์ ํ๋ ํ๋์ ์ฝ๋๋ฒ ์ด์ค๋ผ๋ ๊ฒ์ ๋๋ค. ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํด _app.js์์ ๊ณต์ CSS ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๋ณต์ ํ๊ณ ์ถ์ง ์์ต๋๋ค. ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ค๋ฅธ ๋ชจ๋์์ CSS๋ฅผ ์๊ตฌํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฉ์ง js ๋ฉํํ๋ก๊ทธ๋๋ฐ์ ํด์ผ ํฉ๋๋ค.
๋์ ๋ชจ๋ ๊ณต์ CSS๋ฅผ ๊ฐ์ ธ์ค๋ "App Factory"๊ฐ ์๋ ํ์ฌ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ _app์ ํฉํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ๊ณต์ CSS ์์ ์์ฒด CSS๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํ์ฌ https://github.com/vercel/next.js/discussions/13991 ์ ์ถ๊ฐํ๊ณ
์ด๊ฒ์ +100. ๋ ธ๋ ๋ชจ๋ CSS ํ์ผ์ ๋ณต์ฌํ์ฌ ํ๋ก์ ํธ์ ๋ถ์ฌ๋ฃ๊ณ .module.css๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
์ฌ๊ธฐ ๋ ๋ค๋ฅธ ์๊ฐ ์์ต๋๋ค.
pdf-viewer-reactjs
ํจํค์ง์ ๊ฒฝ์ฐ ์ข
์์ฑ์๋ _app.js
์์ ๊ฐ์ ธ์์ผ ํ๋ CSS๋ ํ์ํฉ๋๋ค.
์ด๊ฒ์ ์ ์ฒด ์ฑ์ ๋ํ CSS๋ฅผ ๋ถํ๋ฆฌ๊ฒ ํ๊ณ ์ด ๋จ๊ณ์์ ์ถฉ๋์ ๋ํด ํ์ ํ ์ ์์ต๋๋ค.
import 'react-quill/dist/quill.snow.css';
import 'react-image-crop/dist/ReactCrop.css';
๊ฐ์ ธ์ค๊ธฐ '../../node_modules/material-design-icons/iconfont/material-icons.css';
๊ฐ์ ธ์ค๊ธฐ '../../node_modules/bulma/css/bulma.css';
๊ฐ์ ธ์ค๊ธฐ '../../node_modules/bulma-helpers/css/bulma-helpers.min.css';
๋ํ ๋ค์์ ์ฝ์์ ์ถ๋ ฅ๋ฉ๋๋ค.
๊ฒฝ๊ณ - ./node_modules/material-design-icons/iconfont/material-icons.css
์ ์ญ CSS๋ node_modules ๋ด์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๋ ์ฝ์ด๋ณด๊ธฐ: https://err.sh/next.js/css-npm
์์น: node_modules/pdf-viewer-reactjs/dist/pdf-viewer-reactjs.js
./node_modules/bulma/css/bulma.css
์ ์ญ CSS๋ node_modules ๋ด์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๋ ์ฝ์ด๋ณด๊ธฐ: https://err.sh/next.js/css-npm
์์น: node_modules/pdf-viewer-reactjs/dist/pdf-viewer-reactjs.js
./node_modules/bulma-helpers/css/bulma-helpers.min.css
์ ์ญ CSS๋ node_modules ๋ด์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๋ ์ฝ์ด๋ณด๊ธฐ: https://err.sh/next.js/css-npm
์์น: node_modules/pdf-viewer-reactjs/dist/pdf-viewer-reactjs.js
./node_modules/material-design-icons/iconfont/material-icons.css
๋ชจ๋ ๋น๋ ์คํจ: ์ค๋ฅ: ์ต์ข ๋ก๋(./node_modules/next/dist/build/webpack/loaders/error-loader.js)๊ฐ ๋ฒํผ ๋๋ ๋ฌธ์์ด์ ๋ฐํํ์ง ์์์ต๋๋ค.
./node_modules/bulma/css/bulma.css
๋ชจ๋ ๋น๋ ์คํจ: ์ค๋ฅ: ์ต์ข ๋ก๋(./node_modules/next/dist/build/webpack/loaders/error-loader.js)๊ฐ ๋ฒํผ ๋๋ ๋ฌธ์์ด์ ๋ฐํํ์ง ์์์ต๋๋ค../node_modules/bulma-helpers/css/bulma-helpers.min.css
๋ชจ๋ ๋น๋ ์คํจ: ์ค๋ฅ: ์ต์ข ๋ก๋(./node_modules/next/dist/build/webpack/loaders/error-loader.js)๊ฐ ๋ฒํผ ๋๋ ๋ฌธ์์ด์ ๋ฐํํ์ง ์์์ต๋๋ค.
์๋ ! ๋๊ตฐ๊ฐ๊ฐ ์ด๊ฒ์ ์ด๋ป๊ฒ ํด๊ฒฐํ์ต๋๊น? ๊ทธ ๋๋ฌธ์ ๊ฐ์ ธ์ฌ ์ ์๋ ๋ ธ๋ ๋ชจ๋์ด ๋๋ฌด ๋ง์ต๋๋ค.
๊ตฌ์ฑ ์์์์ ์ ์ญ ์คํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ next.config.js
๋ฅผ ํตํด ํ์ฑํ๋๊ฑฐ๋ NextJS์ ๋ชจ๋ฒ ์ฌ๋ก/์๊ฒฌ์ ์๋ฐํ๋ ๊ฒ์ ๋ํ ์ฐ๋ ค๊ฐ ์๋ ๊ฒฝ์ฐ ์ ์ญ ์คํ์ผ์ ๋ํ ๋ชป์๊ธด ์ฝ์ ๊ฒฝ๊ณ ๊ฐ ํ์๋ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ CRA > NextJS์์ ๋ณํํ๋ ์ฌ์ฉ์์๊ฒ ์ค์ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ ํํ ์ ์๊ณ CSS ๋ชจ๋๊ณผ ๊ฐ์ ๊ฒ์ ์ ์ง์ ์ผ๋ก ์ฑํํ ์ ์๋ ์ฐ๋ฆฌ๋ฅผ ์ํ ์ฐจ๋จ๊ธฐ์ ๋๋ค.
์ฌ์ ํ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ด ์์ ์ ํ์์ ๋ฐ๋ผ ์ฌ์ฉ์ ์ ์ CSS ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํ์ง๋ง ์ด๊ฒ์ ๋ด์ฅ CSS ์ง์์ ๋นํ์ฑํํ์ง๋ง ๋ชจ๋ ๊ฒฝ์ฐ์ ์ข์ ์๋ฃจ์ ์ ์๋ ์ ์์ต๋๋ค. ์๋๋ ๊ถ์ฅํ์ง ์์ต๋๋ค . ํจํค์ง ์์ฑ์๊ฐ ์ ๋ฆฌํ ๋๊น์ง๋ง ์ฌ์ฉํ์ญ์์ค.
next.config.js
const withCSS = require('@zeit/next-css');
const withPlugins = require('next-compose-plugins');
...
module.exports = withPlugins([
...
withCSS,
]);
@abdelrahmantoptal 's SASS์์ ์๋ํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๊น?
CSS์์ ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง SASS ๊ฐ์ ธ์ค๊ธฐ๊ฐ ๋ฐ์ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
error - ./src/components/layouts/Footer.scss 1:0
Module parse failed: Unexpected character '@' (1:0)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
> <strong i="8">@import</strong> 'styles/vars';
|
| footer {
๊ทธ๋์ withCSS ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๊ธฐ ์ ์ ์นํฉ ์ค์ ์ SASS ๋ก๋๋ฅผ ์ถ๊ฐํด ๋ณด์์ต๋๋ค.
config.module.rules.push({
test: /\.s[ac]ss$/i,
use: [
// Creates `style` nodes from JS strings
'style-loader',
// Translates CSS into CommonJS
'css-loader',
// Compiles Sass to CSS
'sass-loader'
]
});
๊ทธ๋ฌ๋ ๊ทธ ์์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
error - ./src/components/App.scss
ReferenceError: self is not defined
๋๋ ๋ํ @zeit/next-sass
๋์ฒดํ๋ ค๊ณ ์๋ํ์ง๋ง ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
error - ./src/components/App.scss
ReferenceError: self is not defined
SASS๋ฅผ ์ฌ์ฉํ๋๋ก ์ฝ๋๋ฅผ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์ ์ฌํญ์ด ์์ต๋๊น?
๋๊ตฐ๊ฐ๊ฐ https://github.com/balena-io-modules/rendition์ ์ฑ๊ณต์ ์ผ๋ก ๊ตฌํ ํ์ต๋๊น?
์ ๋ ์ด์ Gatsby์ ๊ณง Next.js๋ฅผ ํ๊ธฐํ์ต๋๋ค. ์ด ๊ธฐ๋ฅ๊ณผ ๊ฐ์ด ์์ง๋ง ๋งค์ฐ ์ฐจ๋จ๋๊ณ ๋
๋จ์ ์ธ ๊ธฐ๋ฅ ๋๋ฌธ์
๋๋ค. ์ด ์ค๋ฅ๋ฅผ ํด๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด์ CKEditor 5์ฉ CodeBlock
ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ตฌ์ฑ์ ์ํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํญ์ ์์ด์ผ ํฉ๋๋ค.
์ด ๋ฌธ์ ์ ๋ํด @Timer ๋๋ ๋ฐ๋ ๊ฒ์ด ๋งค์ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ Next.js์ ํฐ ๋ฌธ์ ์ ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ณํ์ด ์์ต๋๊น?
๋์! ๋ ธ๋ ๋ชจ๋์ CSS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ์ผ๋ฐ์ ์ ๋๋ค. ๊ฐ๋ฐ์๋ก์ ์ ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๋ ธ๋ ๋ชจ๋์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ ์ดํ ์ ์์ผ๋ฉฐ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ ๋ ธ๋ ๋ชจ๋์ CSS๋ฅผ ๋ฃ๋ ๊ฒ์ด ์น ํ๋ ์์ํฌ๋ฅผ ์์์ํฌ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ์ง ์์ต๋๋ค.
@OssiPesonen ์ด๊ฑฐ ๋ณธ ์ ์์ด ? ์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ด์์ ์ด์ง๋ ์์ง๋ง ๊ทธ ๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
@OssiPesonen ์ด๊ฑฐ ๋ณธ ์ ์์ด ? ์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ด์์ ์ด์ง๋ ์์ง๋ง ๊ทธ ๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
์ด๊ฒ ์ด๋ป๊ฒ ๋์์ด ๋๋์ง ๋ชจ๋ฅด๊ฒ ์ด? ๋ฌธ์ ๋ ๋ ธ๋ ๋ชจ๋์์ ์ผ๋ถ CSS ํ์ผ์ ์๋์ผ๋ก ๊ฐ์ ธ์์ผ ํ๋ ๊ฒ์ด ์๋๋๋ค. ๋ฌธ์ ๋ CSS ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์์ฒด์ ์ผ๋ก ์ํํ๋ npm ํจํค์ง์ ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ํ์ ํฌํจํ๋ ํจํค์ง:
import '../theme/stylesheet.css'
next.js๊ฐ ๋ณต์๋ก ์ถฉ๋์ ์ผ์ผํฌ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ถ๋ช ํ ์ ์ง ๋ณด์์ ์กฐ์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ ์ง ๊ด๋ฆฌ์์๊ฒ ์ฐ๋ฝํ์ฌ ์ข ์์ฑ์ ์ปดํ์ผ๋ ๋ฒ์ ์ ๊ฒ์ํ๋๋ก ์์ฒญํ์ญ์์ค.
์ฌ๋๋ค์ ์ด๋ค ์ข ๋ฅ์ ํ์์ ๋๋ผ์ ์ด๊ณ ์์ต๋๊น? ์ ์ง ๊ด๋ฆฌ์์๊ฒ ์ฐ๋ฝํ์ฌ ๋งค์ฐ ๋น ๋ฅธ ์๋๋ก ํจํค์ง๋ฅผ ๋ค์ ์ปดํ์ผํ๋๋ก ์์ฒญํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๊น? ์ด๊ฒ์ ๋ช ์ฃผ ๋์ ๋๊ตฌ์๊ฒ๋ ๋ฐฉํด๊ฐ ๋ ๊ฒ์ ๋๋ค! ์ด ํฐ์ผ์ 4๊ฐ์ ๋์ ์คํ๋์์ต๋๋ค. ๋น ๋ฅด๊ฒ ์์ง์ด๋ ํ๋ก์ ํธ์์ ์์ ํ ๋๋ ํ์ฉ๋์ง ์์ต๋๋ค.
๋ค์ ์ฃผ(์นด๋๋ฆฌ์์์) ๋ด์ node_modules
์์ ๋ชจ๋ ๊ตฌ์ฑ ์์ ํ์ผ๋ก CSS๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค! ํ
์คํธ ์ค๋น๊ฐ ๋๋ฉด ์ฌ๊ธฐ์ ๊ฒ์ํ๊ฒ ์ต๋๋ค.
๋ฆด๋ฆฌ์ค ์ด์ ์ ๋๊ตฐ๊ฐ๊ฐ ์ด๊ฒ์ ํ์๋ก ํ๋ ๊ฒฝ์ฐ CSS๋ฅผ ๊ฐ์ ธ์ค๋ node_modules
์์ ๋ชจ๋์ ํธ๋์ค ํ์ผ ํ๊ธฐ ์ํด
@BrandonE ๋ next-transpile-modules์ *.module.css
๋ผ๋ ๋ชจ๋์ด ์ฌ์ ํ ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ ๋ฐฉ๋ฒ์ ์ฐพ์ผ์
จ๋์?
@rjoaopereira ๋๋ ์ด๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ๊น์ด ์ดํดํ๊ณ ์๋ค๊ณ ๋งํ ์๋ ์์ง๋ง CSS๋ฅผ ๊ฐ์ ธ์จ ๋๋ถ๋ถ์ node_modules
๋ @zeit/next-css
ํ๋ฌ๊ทธ์ธ์์๋ง ์๋ํ์ต๋๋ค. ํ ๊ฐ์ง๋ง ๊ทธ๋ ์ง ์์์ผ๋ฉฐ ์ด ์์ ์์ ํธ๋์คํ์ผ๋ก ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค. ์ฐ์ํ ์๋ฃจ์
๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๊ณ Next.js์ ๋ฏธ๋ ๋ฒ์ ์์๋ Babel/Webpack ์ฐ๊ธ์ ์ ๋ ์ ์ ์๊ฐ์ ํ ์ ํ๊ณ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋๋ ๋ฐ ๋ ๋ง์ ์๊ฐ์ ํ ์ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ค์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ๊ฑฐ์ ์๋ํ๊ฒ ๋์์ต๋๋ค.
๋ค์ 9.5.3
๋ค์ ํธ๋์คํ์ผ ๋ชจ๋ 4.1.0
๊ฐ์ฑ์ ๋ด์ ํผ์คํธ ํํฐ ๊ตฌ์ฑ ์์.
CSS ๋ชจ๋๊ณผ ๊ธ๋ก๋ฒ CSS๊ฐ ํผํฉ๋ ํ์ฌ ๊ตฌ์ฑ ์์
scopedcomponents
๋ ์ฌ์ฉ ์ค์ธ ํ์ฌ ๊ตฌ์ฑ ์์๋ก ๊ต์ฒด๋ฉ๋๋ค.
//next.config.js
const withCustomWebpack = require("./webpack-custom.config");
const withNextCSSOverride = require("./next.config.css");
const withTM = require("next-transpile-modules")(["@scopedcomponents"]);
module.exports = withCustomWebpack(
withTM(
withNextCSSOverride({
poweredByHeader: false
})
)
);
///next.config.css.js
const {
getCssModuleLocalIdent
} = require("next/dist/build/webpack/config/blocks/css/loaders/getCssModuleLocalIdent");
const path = require("path");
/**
* Stolen from https://stackoverflow.com/questions/10776600/testing-for-equality-of-regular-expressions
*/
const regexEqual = (x, y) => {
return (
x instanceof RegExp &&
y instanceof RegExp &&
x.source === y.source &&
x.global === y.global &&
x.ignoreCase === y.ignoreCase &&
x.multiline === y.multiline
);
};
module.exports = (nextConfig = {}) => {
return Object.assign({}, nextConfig, {
webpack(config, options) {
const nextCssLoaders = config.module.rules.find(
rule => typeof rule.oneOf === "object"
);
if (nextCssLoaders) {
const nextCssLoader = nextCssLoaders.oneOf.find(
rule =>
rule.sideEffects === false &&
regexEqual(rule.test, /\.module\.css$/)
);
if (nextCssLoader) {
/***********************************************************
* change the rule to match all scopedcomponents css files
***********************************************************/
nextCssLoader.test = /(@scopedcomponents|react\-virtualized)\/.*\.css$/;
const cssLoader = nextCssLoader.use.find(({ loader }) =>
loader.includes("css-loader")
);
if (cssLoader) {
/***********************************************************
* Override the default behaviour for CSS modules discovery
* auto = true makes webpack search for *.module.css
* https://webpack.js.org/loaders/css-loader/#auto
***********************************************************/
cssLoader.options.modules.auto = /@scopedcomponents\/.*\.css$/;
/***********************************************************
* Nextjs overrides the default mode to "Pure"
* https://github.com/vercel/next.js/blob/v9.5.2/packages/next/build/webpack/config/blocks/css/loaders/modules.ts#L35
* Put it back to normal
***********************************************************/
cssLoader.options.modules.mode = "local";
/***********************************************************************************************************************
* There is a problem when using components built with css-modules with Nextjs. *
* NextJS will consume code from `lib` on the server side and from `es` on the client. *
* https://github.com/vercel/next.js/blob/v9.5.2/packages/next/build/webpack-config.ts#L374 *
* This raises a problem when generating the classes for different environments, *
* throwing an error of className mismatch due to the hash created being based on the file path *
* https://github.com/vercel/next.js/blob/v9.5.2/packages/next/build/webpack/config/blocks/css/loaders/modules.ts#L26 *
* https://github.com/webpack/loader-utils/blob/v1.4.0/lib/interpolateName.js#L39 *
* To solve this, when generating the classNames for 3rd party components, *
* we need to tell cssloader to always use the same path * *
* *
* https://github.com/zeit/next-plugins/issues/595 *
***********************************************************************************************************************/
cssLoader.options.modules.getLocalIdent = (
context,
localIdentName,
localName,
options
) => {
const newContext = { ...context };
if (newContext.resourcePath.includes("@scopedcomponents")) {
newContext.resourcePath = newContext.resourcePath.replace(
`${path.sep}es${path.sep}`,
`${path.sep}lib${path.sep}`
);
}
return getCssModuleLocalIdent(
newContext,
localIdentName,
localName,
options
);
};
}
}
}
if (typeof nextConfig.webpack === "function") {
return nextConfig.webpack(config, options);
}
return config;
}
});
};
๋ฌธ์ :
@Timer ์ด์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
๋ค์ ์ฃผ(์นด๋๋ฆฌ์์์) ๋ด์
node_modules
์์ ๋ชจ๋ ๊ตฌ์ฑ ์์ ํ์ผ๋ก CSS๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค! ํ ์คํธ ์ค๋น๊ฐ ๋๋ฉด ์ฌ๊ธฐ์ ๊ฒ์ํ๊ฒ ์ต๋๋ค.
์ด ์์ ํ์ ๊ตฌ์ฑ ์์์์ CSS๋ฅผ ๋์ ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๊น?
@Timer ๋ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค.
next@^9.5.4-canary.10
์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ ์ด๋์์๋ node_modules
์์ ์ ์ญ CSS๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด CSS๋ฅผ ๊ฐ์ ธ์์ผ ํ์ง๋ง ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๋ ๊ฒ์ ์ํ์ง ์๋ ํ์ฌ React ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ํธ ์ด์ฉ์ฑ์ด ํฅ์๋ฉ๋๋ค.
@Timer ๊ทธ ๋ฆด๋ฆฌ์ค๊ฐ ๋๋ฌด ๊ธฐ๋๋ฉ๋๋ค. ์์ ์ ์ ๋ง ๊ฐ์ฌ๋๋ฆฝ๋๋ค ๐ฏ โค๏ธ
@Timer ๋ ๊ฐ์ฌ
์ด๊ฒ์ ํ์ฌ ์ ์๊ฒ ์ฐจ๋จ ๋ฌธ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค๋ ์ด๊ฒ์ ํ ์คํธํ์ ๋ ์ฌ์ ํ ๋์ผํ ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ๋จ์ํ 9.5.4-canary-10์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๋ ๊ฒ ์ธ์ ๋ค๋ฅธ ๊ฒ์ด ์์ต๋๊น? ์ด ์๋ ํ์ฌ lib @rmwc ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค.
@johmike ๋ค์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ฐ์ ธ
import "@rmwc/avatar/avatar.css";
next
์ต์ ๋ฒ์ ์ ์ค์นํ ํ ๊ฐ๋ฐ ์๋ฒ๋ฅผ ๋ค์ ์์ํด ๋ณด์
จ์ต๋๊น?
@Timer ์ด ๊ธฐ๋ฅ์ ๋ํด node_modules
ํด๋์์ CSS ํ์ผ์ ๊ฐ์ ธ์ฌ ๋ ์ ์๋ํฉ๋๋ค.
import 'prism-themes/themes/prism-darcula.css';
node_modules
๋๋ ํ ๋ฆฌ ์ธ๋ถ์ ๊ธ๋ก๋ฒ CSS ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ง์ํ ๊ณํ์ด ์์ต๋๊น?
@sasivarnan
์ด๊ฒ์ @rmwc ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ์ ธ์ต๋๋ค. ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ @require("@rmwc/avatar/avatar.css")
์์ต๋๋ค. import {Avatar} from "library/Avatar"
๊ฐ์ ธ์ค๊ณ ์๋๋ฐ ์คํจํฉ๋๋ค.
@sasivarnan
์ด๊ฒ์ @rmwc ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ์ ธ์ต๋๋ค. ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋
@require("@rmwc/avatar/avatar.css")
์์ต๋๋ค.import {Avatar} from "library/Avatar"
๊ฐ์ ธ์ค๊ณ ์๋๋ฐ ์คํจํฉ๋๋ค.
์์์ด์. ๋๋ ๊ทธ๊ฒ์ด ๋น์ ์ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ง์ ๊ฐ์ ธ์จ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๋ด ์๋ชป์ด์ผ.
์ฌ๊ธฐ์ ์๋ ์๊ฒฌ์ผ๋ก ํ๋จํ๋ฉด ์ด๊ฒ์ ์ค์ ๋ก ํด๊ฒฐ๋์ง ์์๊ฑฐ๋ ํด๊ฒฐ๋์์ง๋ง ์ฌ๊ธฐ์์ ๋ง์ ์ฌ๋๋ค์ด ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค. ๋ง์ ์ฌ๋๋ค์ ์ฌ์ ํ โโํจํค์ง ์์ฒด(ํจํค์ง ํ์ผ ๋ด๋ถ์ import style.css
๋ฌธ)์์ CSS๋ฅผ ๊ฐ์ ธ์ค๋ ๋ชจ๋์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์์ ์ฌํญ์ ์ฑ์ด node_modules/
๊ฒฝ๋ก์์ CSS๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ํ๋ ๊ฒ์ผ๋ก ๋ณด์ด์ง๋ง ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์์ฃผ ์ฌ์ด ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์์ ๋ ๋๊น์ง ์ง๊ธ์ CSS๋ฅผ ์ฑ์ ๋ณต์ฌํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ฐจ๋จ ์์ค์ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ๊ทธ๋์ ๋ฑํ ์์ฌ์ด ํด๊ฒฐ์ฑ
์ด ์๋ ๋ธ๋ก์ปค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ ๋ชปํ๋ค. import ๋ฌธ์ด ์๋ ๊ตฌ์ฑ ์์๋ฅผ ํจํค์ง ์์ฒด์ ํฌํจ๋ CSS ํ์ผ๋ก ๊ฐ์ ธ์ค๋ฉด ์ฑ์ด ์ถฉ๋ํฉ๋๋ค.
@sasivarnan @OssiPesonen ๋ ๋ถ ๋ชจ๋ ์ด OP ๋ฌธ์ ์์ ๋ ผ์๋๊ณ ์์ ๋ ๊ฒ๊ณผ ๋ค๋ฅธ ๋ฌธ์ ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ํนํ ์ ํ๋ฆฌ์ผ์ด์ ์์ CSS๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// components/MySlider.tsx
import { Slider } from "@reach/slider";
import "@reach/slider/styles.css";
function Example() {
return <Slider min={0} max={200} step={10} />;
}
๋น์ ์ด ๋งํ๋ ๊ฒ์ #706๊ณผ #13282์ ๋ณต์ ๋๋ node_modules
์์ฌ ์ฝ๋์ฒ๋ผ ์ทจ๊ธํ๋ ๊ธฐ๋ฅ์
๋๋ค.
@Timer ๋ฐฉ๊ธ ์์๋๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํ ์คํธํ์ผ๋ฉฐ ์ค์ ๋ก ์ ๋๋ก ์๋ํฉ๋๋ค.
๊ตฌ์ฑ ์์์ CSS๋ฅผ ๋ค์ ๊ตฌ์กฐ์ ์ผ๋ถ๋ก ์ง์ ๊ฐ์ ธ์ฌ ๋ ์์๋๋ก ์๋ํ๋ฉฐ ์ค๋ฅ๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํด๋น ๊ตฌ์ฑ ์์๋ฅผ ๋ค์ ๊ตฌ์กฐ ์ธ๋ถ์ ๋ค๋ฅธ ํจํค์ง๋ก ์ด๋ํ๊ณ ํด๋น ํจํค์ง๋ฅผ ๋น๋ํ ๋ค์ ์ค์นํ๋ฉด ์ด์ ๊ณผ ๋์ผํ ์ค๋ฅ๋ก ์ฅ์ ๋ณต๊ตฌ๋ฉ๋๋ค.
์ด ์์์ Avatar
๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ง๋ ์๊ณ Button
๊ฐ์ ธ์ค๊ณ ์์ง๋ง Avatar
๋ ์คํจํ ์ค๋ฅ์ด๋ฏ๋ก ๋ค๋ฅธ ์ผ์ด ์งํ ์ค์ผ ์ ์์ต๋๋ค.
๋ํ monorepo์์ ์์
ํ ๋ next-transpile-modules
๋ฅผ ์ถ๊ฐํ์ง๋ง ์ด ํน์ ๋ฌธ์ ์๋ ๋์์ด ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
next-transpile-modules
์ฃผ๋ณ์ ๋ค๋ฅธ ๋ง์ ๋ฌธ์ ๋ฅผ ํํค์ณ์ ์ด์ํ ๊ตฌ์ฑ ํ์ผ๋ก ์ด๊ฒ์ ์๋์์ผฐ์ต๋๋ค.
const withCSS = require("@zeit/next-css");
module.exports = withCSS();
require.extensions[".css"] = () => {
return;
};
๋๋ next-transpile-modules
์ ๊ฑฐํ๊ณ ์ด๊ฒ์ ์๋ํฉ๋๋ค. ์ด์ ๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์๋ฌด ์ผ๋ ํ์ง ๋ง์์ผ ํ ๊ฒ ๊ฐ์๋ฐ์?
๋ด๊ฐ ๋๋ฌด ๋นจ๋ฆฌ ๋งํ๋ค! next dev
์์๋ ์๋ํ์ง๋ง next build
๋ CSS ํ์ผ ์ค ํ๋์ unknown token .
(์ ) ์ค๋ฅ๋ก ์คํจํฉ๋๋ค.
@Timer ์ด๋ค ์๊ฐ์ด ์์ต๋๊น? ๋ชจ๋ ธ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ฌ๋ฌ ํจํค์ง์์ ์ฆ์ ์๋ํด์ผ ํฉ๋๊น? ์๋๋ฉด @team/packageA๊ฐ node_modules์์ CSS๋ฅผ ๊ฐ์ ธ์จ ๋ค์ @team/packageB๋ก ๊ฐ์ ธ์ฌ ์ ์๋๋ก ๊ตฌ์ฑํด์ผ ํ๋ ๋ค๋ฅธ ๊ฒ์ด ์์ต๋๊น?
ํด๋น ๋์์ ๋ํด https://github.com/vercel/next.js/issues/13282 ๋ฅผ ๋ฐ๋ฅผ ์ ์์ต๋๋ค.
[email protected] ์ ์ฌ์ฉํ๋ฉด ๋ด ์์ฉ ํ๋ก๊ทธ๋จ์ ์ด๋ ๊ณณ์์๋ CSS๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ scs ํ์ผ์์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๊น? ํ์ด์ง ์์ ์ค์ ๋ก ์ฌ์ฉํ๊ณ ์๋ scss ํ์ผ๋ง ๊ฐ์ ธ์ค๊ณ ์ถ์ต๋๋ค.
// ํ์ด์ง/_app.tsx
import '../styles/common.scss'
// ํ์ด์ง/index.tsx ๋ฒํผ์ ์ฌ์ฉํฉ๋๋ค.
import '@mynpm/custom-ui/_Button.scss'
// ํ์ด์ง/about.tsx ์บ๋ฌ์
์ ์ฌ์ฉํฉ๋๋ค.
import '@mynpm/custom-ui/_Carousel.scss'
https://nextjs.org/docs/basic-features/built-in-css-support ์ ์
์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
์ค๋ฅ - /Users/gp/dev/next-kolumbus/node_modules/@reach/dialog/styles.css
์ ์ญ CSS๋ node_modules ๋ด์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๋ ์ฝ์ด๋ณด๊ธฐ: https://err.sh/next.js/css-npm
https://nextjs.org/docs/basic-features/built-in-css-support ์ ์
์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
์ค๋ฅ - /Users/gp/dev/next-kolumbus/node_modules/@reach/dialog/styles.css
์ ์ญ CSS๋ node_modules ๋ด์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๋ ์ฝ์ด๋ณด๊ธฐ: https://err.sh/next.js/css-npm
์ต์ ๋ฒ์ ์ Next.js๋ฅผ ์ฌ์ฉ ์ค์ธ์ง ํ์ธํ์ธ์.
์ฃ์กํฉ๋๋ค. ์ด์ ๋๊ธ์์ ์ง์ ํ์ง ์์์ต๋๋ค. ๋ฒ์ 9.5.5๋ฅผ ์ฌ์ฉํ์ต๋๋ค. npm์์ ๋ฐฉ๊ธ ์ ๋ฐ์ดํธํ์ต๋๋ค.
๋ชจ๋ .next ์บ์๋ฅผ ์ง์ ๊ณ ์ด์ ์์๋๋ก ์๋ํฉ๋๋ค.
_app
--> import "react-gauge-chart-nextjs-support/dist/GaugeChart/style.css";
์ฌ์ ํ ๋ฒ์ 9.5.5 ์ค๋ฅ๊ฐ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ค์ ์ฃผ(์นด๋๋ฆฌ์์์) ๋ด์
node_modules
์์ ๋ชจ๋ ๊ตฌ์ฑ ์์ ํ์ผ๋ก CSS๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค! ํ ์คํธ ์ค๋น๊ฐ ๋๋ฉด ์ฌ๊ธฐ์ ๊ฒ์ํ๊ฒ ์ต๋๋ค.