λλ Nextκ° Glamourμ css-in-jsλ₯Ό μ¬μ©νλ€λ κ²μ μκ³ μμ΅λλ€. νμ§λ§, Next νλ‘μ νΈμμ μ€μ css/less/scssλ₯Ό μ¬μ©ν μ μλ λ°©λ²μ μμκΉμ...μ΄μ©μ§? μ μ΄λ νλ‘μ νΈλ₯Ό λΆνΈμ€νΈλ©νκΈ° μν΄μλ?
λ΄ μΆλ‘ μ μ΄κ²μ λλ€. Nextκ° λμμΌλ‘ νλ μ¬μ΄νΈμ κ°μ κ°λ¨ν μ¬μ΄νΈμ κ²½μ° μ¨λΌμΈμμ ꡬμ ν μ μλ λλΆλΆμ 미리 λ§λ€μ΄μ§ html ν λ§λ μμν htmlκ³Ό cssλ₯Ό μ¬μ©νμ¬ λ§λ€μ΄μ§λλ€. λ°λΌμ HTMLμ λ°μ κ΅¬μ± μμλ‘ μλ₯΄κ³ μ μ ν νμ΄μ§ ν΄λμ λ£μΌλ©΄ μλ£λ©λλ€.
λ΄ νλ‘μ νΈμ Nextλ₯Ό μ¬μ©νκ³ μΆμ§λ§ κΈ°μ± CSSλ₯Ό μ΄λ»κ²λ νμ©ν μ μλ€λ©΄ κ±°λ μ°¨λ¨κΈ°κ° λ κ²μ λλ€. μ΄ μ¬μ© μ¬λ‘μ λν μ루μ μ΄λ ν΄κ²° λ°©λ²μ΄ μμ΅λκΉ?
/pages
#$ ν΄λμ κ°μ μμ€μ /static
ν΄λλ₯Ό λ§λλλ€..css
νμΌμ λ£μ΅λλ€.Head
λ₯Ό κ°μ Έμ€κ³ CSSμ <link />
λ₯Ό μΆκ°ν©λλ€.import React from 'react';
import Head from 'next/head';
export default () => (
<div>
<Head>
<title>My styled page</title>
<link href="/static/styles.css" rel="stylesheet" />
</Head>
<p className="some-class-name">
Hello world!
</p>
</div>
)
κ·Έκ² λ€μΌ, μ΄λ° μμΌλ‘ Next.jsλ νμ΄μ§ ν€λμ λ§ν¬ νκ·Έλ₯Ό λ λλ§ν΄μΌ νκ³ λΈλΌμ°μ λ CSSλ₯Ό λ€μ΄λ‘λνμ¬ μ μ©ν©λλ€.
μμ°, λΉ λ₯Έ λ΅λ³ κ°μ¬ν©λλ€ :). ν¨κ³Όκ°μλ€! λ¨ νλμ κ±Έλ¦Όλμ΄ μμ΅λλ€. νμ΄μ§λ₯Ό μ²μ λ‘λν λ λͺ¨λ κ²μ΄ μ λλ‘ λ λλ§λκΈ° μ§μ μ μ€νμΌμ΄ μ§μ λμ§ μμ htmlμ΄ κΉλ°μ λλ€. λ°μ ν λ‘λλ css λλ js νμΌμμ μ¨ κ²μΈμ§ νμ€νμ§ μμ΅λλ€. μ΄μ λν ν΄κ²° λ°©λ²μ΄ μμ΅λκΉ?
μ΄μ¨λ λλ λν¬λ€μ΄ νλ μΌμ μ λμ μΌλ‘ κ°λͺ μ λ°μκ³ λΉ λ₯Έ λ΅λ³μ λ€μ ν λ² κ°μ¬λ립λλ€!
μ κ²½ μ°μ§ λ§μΈμ. μΈλ±μ€ νμ΄μ§μμλ css λ° js λ§ν¬κ° μλ ν€λ κ΅¬μ± μμλ₯Ό κ°μ Έμλλ° νλμκ° μ¬λΌμ‘μ΅λλ€. λν μ΅μ»€ νκ·Έλ₯Ό λ§ν¬ κ΅¬μ± μμλ‘ λ³κ²½νλ©΄ λ¨μ μ νκ° μ κ±°λ©λλ€. λ¨μ μ Link κ΅¬μ± μμκ° μμμμ λͺ¨λ html νκ·Έ(μμ΄μ½ ν΄λμ€κ° μλ span νκ·Έ λ±)λ₯Ό μ κ±°νμ¬ ν μ€νΈλ§ λ¨κ² λλ€λ κ²μ λλ€.
λλ μ΄ μ¬μ© μ¬λ‘κ° μ ννκ³ μ΅μ νλ κ²κ³Ό λ°λλΌλ κ²μ μκ³ μμ§λ§ λΉ λ₯΄κ³ λλ¬μ΄...μΆν¨μ μμ§ν΄μΌ νλ κ²½μ°μ μ λ§ μ μ©ν©λλ€. :)
λ°λΌμ 미리 λ§λ€μ΄μ§ html ν λ§λ₯Ό ν΅ν©νλ μν¬νλ‘λ λ€μκ³Ό κ°μ΅λλ€.
@manolkalinov μ½κ² μ°Έμ‘°ν μ μλλ‘ μ½λλ₯Ό μΆκ°ν΄ μ£Όμκ² μ΅λκΉ? μν¬νλ‘λ₯Ό μμ±νμ ¨λ€λ κ²μ μκ³ μμ§λ§ μν μ½λλ₯Ό μ¬μ©νλ©΄ λ¬Έμ κ° λ°μν κ²½μ° λ μ½κ² λ°λ₯΄κ³ λλ²κ·Έν μ μμ΅λλ€.
head νκ·Έμ CSSλ₯Ό μΆκ°νλ©΄ νμ€ν μλν©λλ€. κ·Έλ¬λ κ·Έκ²μ μΌμ’
μ ν΄ν€μ΄λ©° postcss
λλ sass
μ κ°μ κ²μ μ¬μ©νλ €λ©΄ μ΄λ»κ² ν΄μΌ ν©λκΉ? κΈ°μ‘΄ CSS μ€νμΌμ 맀λ ₯μ μΈ JSON κ°μ²΄λ‘ λ³ννλ λ°©λ²μ 무μμ
λκΉ? λμμ΄λκ° glamor
λ₯Ό μ¬μ©νμ¬ νμ΄μ§μ μ€νμΌμ μ§μ νλ κ²λ λ§€μ° μ΄λ ΅μ΅λλ€. λ λμ λ°©λ²μ΄ μμ΄μΌ ν©λλ€.
그건 κ·Έλ κ³ , CSS λͺ¨λκ³Ό λΉκ΅νμ¬ glamor
μ¬μ©μ μ΄μ μ 무μμ
λκΉ?
@andyhu λ https://github.com/zeit/next.js#faq μμ glamor
μ¬μ©μ μ΄μ μ λν΄ μ½μ΄λ³΄μΈμ.
postcss
λλ sass
μ λν΄ webpack ꡬμ±μ μ¬μ©μ μ μνλ©΄ μ΄λ₯Ό μ¬μ©ν μ μμ΅λλ€(https://github.com/zeit/next.js/pull/222). next
λ₯Ό μ€ννκΈ° μ μ μ΄λ¬ν νμΌμ CSSλ‘ μ»΄νμΌνμμμ€.
ν΄κ²°λμλ€κ³ μκ°ν©λλ€. μ¬μ ν λ¬Έμ κ° μλ κ²½μ° λ€μ μ¬μμμ€. @sergiodxa λ΅λ³ κ°μ¬ν©λλ€!
@nkzawa μΉν© κ΅¬μ± μ¬μ©μ μ§μ μ μ¬μ©νλ―λ‘ νλ‘μ νΈμμ λ μ¬μ©ν μ μμ΅λλ€. μ¬κΈ°μ λ΄ μ½λκ° μμ΅λλ€.
next.config.js
/* eslint-disable */
export default {
webpack: (webpackConfig) => {
const newConfig = { ...webpackConfig };
newConfig.module.preloaders.push({
test: /\.less$/,
loader:'style-loader!css-loader!less-loader'
});
return newConfig;
},
cdn: false
}
κ·Έλ¬λ©΄ λ μ μ νμΌ import './index.less'
μ΄ νμνμ§λ§ μ€λ₯κ° λ°μν©λλ€.
You may need an appropriate loader to handle this file type.
SyntaxError: Unexpected token (1:4)
less
, less-loader
, css-loader
, style-loader
λ₯Ό μ€μΉνλ€κ³ νμ ν©λλ€. 미리 κ°μ¬λ립λλ€.
λΉμ μ μλν΄μΌν©λλ€
config.module.rules.push({
test: /\.less$/,
use: [
'style-loader',
{ loader: 'css-loader', options: { importLoaders: 1 } },
'less-loader'
]
})
@kimown less νμΌ κ°μ Έμ€κΈ°μ μ±κ³΅νμ ¨λμ? κ·Έλ λ€λ©΄ μ΄λ»κ² νλμ§ κ³΅μ ν΄ μ£Όμκ² μ΅λκΉ?
@sergiodxa node_modules μμ CSSλ₯Ό μ΄λ»κ² κ°μ Έμ¬ μ μμ΅λκΉ?
npm ν¨ν€μ§μμ CSSλ₯Ό κ°μ Έμ€λ κ²κ³Ό κ΄λ ¨νμ¬ μ΄ μ§λ¬Έμ΄ μμμ΅λλ€.
μ: rc-μ¬λΌμ΄λ
import 'rc-slider/assets/index.css'
μ΄μ λν λ΅μ΄ μμμ΅λκΉ? @notrab
@notrab
μ΄ μλ
λ£¨νΈ λλ _document κ΅¬μ± μμμμ
import stylesheet from 'rc-slider/assets/index.css';
<div className='root'>
<style dangerouslySetInnerHTML={{ __html: stylesheet }} />
<Main />
</div>
@saadbinsae λλ μ΄κ²μ μλνλ€. μ체 κ΅¬μ± μμ λ° νμ΄μ§μμ μλν©λλ€. κ·Έλ¬λ μΈλΌμΈ λμ webpackκ³Ό ν¨κ» λ²λ€λ‘ λ§λ€κ³ μΆμ΅λλ€.
@schoenwaldnils κ·Έλ κ² νλ €κ³ νμ§λ§ ν μ μμμ΅λλ€. λ΄ μ΄ν΄μ λ°λΌ μ°λ¦¬λ μλ² μΈ‘ μμ© νλ‘κ·Έλ¨μ μ¬μ©νκ³ μμΌλ―λ‘ μλ²λ CSSκ° λ¬΄μμΈμ§ λͺ¨λ₯΄κΈ° λλ¬Έμ λ³λμ CSS νμΌμ λ²λ€λ‘ λ¬Άμ΄ ν΄λΌμ΄μΈνΈμ λ³΄λΌ μ μμ΅λλ€. htmlμ CSSλ₯Ό ν¬ν¨μμΌμΌ ν©λλ€. μ 체 μμ© νλ‘κ·Έλ¨μμ μ‘μΈμ€νλ €λ©΄ λ£¨νΈ κ΅¬μ± μμμ ν¬ν¨νκ±°λ μμμ @sergiodxaλ‘ νμλ λλ‘ ν€λμ μ°κ²°ν©λλ€.
@sergiodx μ κ·Ό λ°©μμ μλνμ§λ§ μλνμ§ μμ΅λλ€. μ΄κ²μ μ΅μ λ²μ μ Nextμλ κ³μ μ μ©λ©λκΉ?
@sergiodxa κ°μ¬ν©λλ€. κ·Έλ₯ λ΄κ° μ°Ύκ³ μμλ€.
@sergiodxa λΉμ μ λΉμ μ λλ΅μ λ³κ²½ν΄μΌν©λλ€. κ·Έκ²μ μ μ μ΄ μλλ€! κ·Έκ²μ μ μ μ΄μ΄μΌν©λλ€
CSS κ°μ Έμ€κΈ° μ¬μ©μ μ΄μ https://github.com/zeit/next-plugins λ₯Ό μ¬μ©νμ¬ κ°λ¨ν©λλ€.
1λ λ λ¬Έμ λ²νμ λν΄ μ£μ‘ν©λλ€. λΆλͺ ν μ¬λλ€μ Googleμ ν΅ν΄ μ¬κΈ°κΉμ§ μμ΅λλ€.
CSS κ°μ Έμ€κΈ° μ¬μ©μ μ΄μ https://github.com/zeit/next-plugins λ₯Ό μ¬μ©νμ¬ κ°λ¨ν©λλ€.
1λ λ λ¬Έμ λ²νμ λν΄ μ£μ‘ν©λλ€. λΆλͺ ν μ¬λλ€μ Googleμ ν΅ν΄ μ¬κΈ°κΉμ§ μμ΅λλ€.
μ€λ§. node_moduleμμ μ§μ CSSλ₯Ό κ°μ Έμ€λ μ¬μ΄ λ°©λ²μ μ°Ύμ§ λͺ»νλ κ² κ°μ΅λλ€. μ΄κ²μ μλμ μΌλ‘ μ€κ³λ κ²μ λκΉ?
CSS κ°μ Έμ€κΈ° μ¬μ©μ μ΄μ https://github.com/zeit/next-plugins λ₯Ό μ¬μ©νμ¬ κ°λ¨ν©λλ€.
1λ λ λ¬Έμ λ²νμ λν΄ μ£μ‘ν©λλ€. λΆλͺ ν μ¬λλ€μ Googleμ ν΅ν΄ μ¬κΈ°κΉμ§ μμ΅λλ€.μ€λ§. node_moduleμμ μ§μ CSSλ₯Ό κ°μ Έμ€λ μ¬μ΄ λ°©λ²μ μ°Ύμ§ λͺ»νλ κ² κ°μ΅λλ€. μ΄κ²μ μλμ μΌλ‘ μ€κ³λ κ²μ λκΉ?
λ€μ λ²μ 7 μ΄νλ μλμ§λ§ μ΄λ―Έ μ΄ν΄ λ³΄μ ¨μ΅λκΉ? μ΄μ λ³΄λ€ ν¨μ¬ μ½μ΅λλ€ ;)
@mtrabelsi κ° λ§νκΈ° λλ¬Έμ Next.js 7μ λ Έλ λͺ¨λμμ CSSλ₯Ό μ§μ κ°μ Έμ€λ λ°©λ²μ λͺ κ°μ§ μλ₯Ό λ€μ΄ μ£Όμκ² μ΅λκΉ? λ Έλ λͺ¨λμμ μΌλΆ μ€νμΌμ κ°μ ΈμμΌ νλλ° μλνλ μ루μ μ μ°Ύμ μ μμ΅λλ€.
copy-webpack-pluginμ μ¬μ©νμ¬ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
μΉν© ꡬμ±(next.config.js)μμ:
config.plugins.push(
new CopyWebpackPlugin([
{
from: path.join(__dirname,'node_modules/react-datepicker/dist/react-datepicker.css'),
to: path.join(__dirname, 'static/react-datepicker.css')
}
])
);
ν΄λΌμ΄μΈνΈ μΈ‘ CSS μμ μ λν μμ μ¬νμ νμΈν μ μμ΅λλ€. https://github.com/AmanAgarwal041/next-css-fix
λ κ°λ¨ν λ°©λ²μ΄ μλ€κ³ μκ°ν©λλ€.
κ°λ¨ν 3λ¨κ³:
npm install --save @zeit/next-css
// next.config.js
const withCSS = require('@zeit/next-css')
module.exports = withCSS({
cssLoaderOptions: {
url: false
}
})
import 'bootstrap-css-only/css/bootstrap.min.css';
_μ°Έκ³ : λ€μ v 8+ μ¬μ©
λ°°κ²½:
node_moduleλ‘ μ€μΉλ CSSλ₯Ό λ¨μν κ°μ Έμ€λ €κ³ λͺ μκ°μ 보λκ³ λ€μν μ루μ
μ λλΆλΆ ν΄νΉλ ν΄κ²° λ°©λ²μ΄μ§λ§ μμ νμλ κ²μ²λΌ κ°λ¨ν μ루μ
μ΄ μμ΅λλ€.
ν΅μ¬ ν ꡬμ±μ μ€ ν λͺ
μ΄ μ 곡νμ΅λλ€. https://spectrum.chat/next-js/general/ignoring-folders-files-specifically-fonts~4f68cfd5-d576-46b8-adc8-86e9d7ea0b1f
λκ΅°κ° @sergiodxa μ λ΅λ³μ μ¬μ©νλ κ²½μ° ν΄λ μ΄λ¦μ static
νλ©΄ λ§ν¬ νκ·Έλ static
λ₯Ό μ°Έμ‘°ν΄μΌ ν©λλ€.
π 곡μ λ¬Έμλ³΄λ€ GitHub λ¬Έμ λ₯Ό λ λ§μ΄ μ½λ κ² κ°μ΅λλ€(https://github.com/zeit/next-plugins/tree/master/packages/next-css) π
@mtrabelsi , μ΄ λ¬Έμ λ λ¬Έμλ³΄λ€ λ κ°μΉκ° μμ΅λλ€. cssλ₯Ό μ§μ μ¬μ©νλ €λ κ²½μ°(μ: import 'bootstrap-css-only/css/bootstrap.min.css';
) @Vrq μ λ΅λ³μ μ°Ύμ λκΉμ§ λ¬Έμμ μΈκΈμ΄ μμ΅λλ€.
@timneutkens
λ΄ μμ μ μΌλ° CSS νμΌμ κ°μ Έμ€λ €κ³ ν©λλ€. κ²°κ΅ https://github.com/zeit/next-plugins/tree/master/packages/next-css μ μ€λͺ
μλ₯Ό μ¬μ©νμ¬ κ°μ Έμ€λ μ¬λ°λ₯Έ λ°©λ²μ
λλ€.
λλ <Head>
νκ·Έμ λ§ν¬λ₯Ό ν΅ν΄ κ°μ Έμ€λ 2017λ
@sergiodxa λ΅λ³μ μ¬μ©νλ μ¬λ°λ₯Έ λ°©λ²μ
λκΉ?
λ΄κ° μ°Ύμ κ²μ λ€μκ³Ό κ°μ΅λλ€.
_document νμΌμ λ΄ CSSλ₯Ό ν¬ν¨ν νμ μμ΄ μ΄ νλμλ₯Ό νΌνλ λ°©λ²μ μκ³ μμ΅λκΉ?
κ°μ¬ν©λλ€.
Next.jsμ μ 곡λλ CSS μ§μμ #8626μ μ°Έμ‘°νμΈμ!
κ°μ₯ μ μ©ν λκΈ
/pages
#$ ν΄λμ κ°μ μμ€μ/static
ν΄λλ₯Ό λ§λλλ€..css
νμΌμ λ£μ΅λλ€.Head
λ₯Ό κ°μ Έμ€κ³ CSSμ<link />
λ₯Ό μΆκ°ν©λλ€.κ·Έκ² λ€μΌ, μ΄λ° μμΌλ‘ Next.jsλ νμ΄μ§ ν€λμ λ§ν¬ νκ·Έλ₯Ό λ λλ§ν΄μΌ νκ³ λΈλΌμ°μ λ CSSλ₯Ό λ€μ΄λ‘λνμ¬ μ μ©ν©λλ€.