๋น ์ ํ๊ธฐ๋ฅผ ์ ์งํ๋ ์ต์ ์ ์ถ๊ฐํ๊ฑฐ๋ ์ต์ํ ๋ด๊ฐ ์ง์ ์ถ๊ฐํ ์ ์๋ ํ์ผ์ ์๋ ค์ค ์ ์์ต๋๊น? ๋ฐฉํ๋ฒ์ ํตํ ์คํ์ผ๋ง์ ์ฝ๊ฒ ํ๊ธฐ ์ํด ํ์ํฉ๋๋ค.
:empty
์์ฌ ์ ํ๊ธฐ๋ฅผ ์๋ฏธํฉ๋๊น?
์๋์, ์๋ง๋ "๊ท์น"์ด๋ผ๊ณ ๋ถ๋ฌ์ผ ํ ๊ฒ์
๋๋ค.)
๋ด ๋ง์
.selector {}
a.nother{
.selector {}
}
CSS๋ก ์ปดํ์ผํ๋ฉด ์ญ์ ๋ฉ๋๋ค.
์ ๊ทธ๊ฒ๋ค์ ์ ์งํ๊ณ ์ถ์ต๋๊น? ๊ทธ๋ค์ ์์ฑ๋ CSS ํ์ผ์์ ๊ณต๋ฐฑ์ผ๋ก ์๋ฌด๊ฒ๋ ํ์ง ์์ต๋๋ค. ๋น์ ์ ๋น์ ์ด Firebug๋ฅผ ํตํด ์คํ์ผ๋ง์ ํ๋ ค๊ณ ํ๋ค๊ณ ๋งํ์ง๋ง ๋๋ ๋น์ ์ ์ ๊ทผ ๋ฐฉ์์ด ๋ฌด์์ธ์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค.
์๊ตฌ ์ฌํญ์ ํ๋ฌ๊ทธ์ธ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ค์ ๋๊ธฐํํ๋ ค๋ฉด ๊ท์น์ด ์ด๋ฏธ ์กด์ฌํด์ผ ํ๋ฉฐ, ๋ถ๋ช ํ ์์์ ์ด์ ์ ์คํ์ผ์ด ์์๋ค๋ฉด ์ฒ์์ผ๋ก ๋น ๊ท์น์ ๋ง๋ค์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์์ CSS๋ฅผ ์ฌ์ฉํ ๋ ์๋ํ์ง๋ง ์ด์ LESS๋ก ์ ํํ์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ๋น ๊ท์น์ ์ญ์ ํ๊ณ ํ๋ฌ๊ทธ์ธ์ด ์คํ์ผ์ ๋ค์ ๋๊ธฐํํ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋งค์ฐ ์ข์ ์ฌ์ฉ ์ฌ๋ก๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค ...
์ด๊ฒ์ _๋งค์ฐ_ ํน์ ํ ์ฌ์ฉ ์ฌ๋ก์ฒ๋ผ ๋ณด์ ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ฌ๋๋ค์ CSS๋ฅผ ๋ ์ต์ ํํ๊ณ ๋น ๊ท์น์ ๋จ๊ฒจ๋์ง _์์ต๋๋ค_.
์คํ์ผ์ ์๋์ผ๋ก ์๋ก ๊ณ ์น๋ ค๋ฉด less.watch()
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
<script type="text/javascript">
less.env = "development";
less.watch();
</script>
๋๋ URL์ #!watch
๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ์ฌ๊ธฐ์ ๋ช ๊ฐ์ง ์ ์ ์ฌํญ์ด ์์ต๋๋ค. http://www.paulsprangers.com/2011/04/quick-tip-less-js-in-development-and-watch-mode/
@Soviut์ ์ข์ ์กฐ์ธ. ๋ํ ๋ง์์ ๋ค์ง ์์ผ๋ฉด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ํด ๊ฐ์ง ๊ท์น์ ์ถ๊ฐํ์ญ์์ค.
temp: ruleset;
๋์. @agatronic ์ ์๋ฃจ์ ์ ๋ค๋ฅธ ๋ชจ๋ LESS ํ์ผ์ด ๋นํจ์จ์ ์ธ CSS๋ฅผ ์์ฑํ์ง ์๊ณ ํ์ํ ์์ ์ ์ํํฉ๋๋ค.
@agatronic ๊ทธ๊ฒ ๋ด๊ฐ LESS๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ ์ดํ๋ก ์ง๋ 2์ฃผ ๋์ ํ๊ณ ์๋ ์ผ์ด์ง๋ง, ๊ทธ๋ฐ ๊ฐ์ง ๊ท์น์ ์ ๊ฑฐํ๋ ๊ฒ์ ์์๊ธฐ ๋๋ฌธ์ ๋ช ๋ฒ์ด๋ ๊ทธ๋ฐ ๊ฐ์ง ๊ท์น์ด ์์ฐ์ ๋ค์ด๊ฐ์ต๋๋ค.
@Soviut ๋ถํํ๋ ๊ทธ๊ฒ์ ์์ ํ ๋ค๋ฅธ ์ํฌ ํ๋ก์ฐ์ ๋๋ค. ๋๋ Less๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๊ทธ๊ฒ์ ํฌ๊ธฐํ ์ค๋น๊ฐ๋์ง ์์์ต๋๋ค ... ๋ํ ๋ธ๋ผ์ฐ์ ์์ ๋ ์ ์ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๊ฐํ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ํ์ด์ง๋ก๋๊ฐ 500-700ms์์ 2-3 ์ด๋ก ์ฆ๊ฐํ์ต๋๋ค.
์ด ์ต์ ์ด ์ถ๊ฐ๋์ง ์๋๋ค๋ ์ ์ ์ดํดํ๊ณ ๋์ํฉ๋๋ค. ํ์ง๋ง ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค๋ฉด ์ด๋ค ์์ค ์ฝ๋ ํ์ผ์์ ์ค์ค๋ก ๋์์ ๋ณ๊ฒฝํ ์ ์๋์ง ์๋ ค์ฃผ์ค ์ ์๋์?
์ด๊ฒ์ ๋ณ๊ฒฝํด๋ณด์ญ์์ค
https://github.com/cloudhead/less.js/blob/master/lib/less/tree/ruleset.js#L187
@chetzof ๋๋ ์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์์ ๋์ต๋๋ค. ๊ทธ๊ฒ์ด ์ต์ ์ ๋ฐฉ๋ฒ์ ์๋์ง๋ง ์ฐพ๊ณ ์๋ ๊ฒ์ ํจ๊ณผ์ ์ ๋๋ค.
๋๋ ๊ทธ๋ ๊ฒ ๋์์ต๋๋ค :
๋ฐฉํ๋ฒ์์๋ ๋น์ด ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฉ๋๋ค.
@d4ng3rmax ์ฟจํฌ์ธํธ!
@chetzof๊ฐ ์ธ๊ธํ ๊ฒ๊ณผ ๋์ผํ ๊ฐ๋ฐ ์ํฌํ๋ก๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ณ ๋ง์.
์ด๊ฒ์ css-modules
๊ฐ๋ฐํ๋ ๋์ ๊ผญ ํ์ํ ๊ฒ์
๋๋ค.
์ค์บํด๋ฉ ๋์ ๋ชจ๋ ์ ํ์๋ฅผ ์์ฉ๊ตฌ๋ก ๋ง๋ ๋ค์ ์ ๊ฑฐํ๋ ๊ฒ์ ์ ๋ง ๊ท์ฐฎ์ ์ผ์
๋๋ค.
.main {
/*! keep */
}
.loading {
/*! keep */
}
.button {
/*! keep */
}
.form {
/*! keep */
}
@garkin CSS ๋ชจ๋์ ์ฌ์ฉํ์ฌ ์ด์ ๊ฐ์ ์ ํ๊ธฐ๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ถ๋ก /์ฌ์ฉ ์ฌ๋ก๋ ๋ฌด์์ ๋๊น?
๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฐ์ ธ์ค๊ธฐ ๋จ๊ณ์์ undefined
๋ฉ๋๋ค.
import * as React from 'react'
import * as cx from 'classnames';
import css from './home.less';
export class Home extends React.Component {
render() {
const isLoading = true;
return <div className={cx(css.main, {
[css.loading]: isLoading
})}>
Home
</div>
}
}
์ด๋ก ์ธํด ๋ฐํ์ ์์ธ๊ฐ ๋ฐ์ํ๊ณ ํซ ๋ชจ๋ ๊ต์ฒด๊ฐ ์ค๋จ๋ฉ๋๋ค. ์ ํ๊ธฐ๊ฐ ์ ๊ฑฐ๋์ง ์๋๋ก ํ๋ฉด ์ด๋ฌํ ๋ชจ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ค์บํด๋ฉ ์ค์๋ ์ ํ์๊ฐ ์ ๊ฑฐ๋๊ณ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ปดํ์ผ๋ฌ์ ์ธ์์ผ ํ๋ค๋ ์ ์ ํญ์ ์ผ๋์ ๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ชจ๋ /*! keep */
๋๊ธ์ ํฅํ ์ธ์ ๊ฐ๋ ์ ๊ฑฐ๋์ด์ผ ํฉ๋๋ค.
@garkin ํ ... ๊ทธ๋ฅ ์คํ์ผ์ํธ ์์ฑ์ ๋๋ด๋ ๊ฒ ๋ต ์๋๊ฐ์? ์ด ๊ฐ๋ฐ ๋ฐฉ์์ผ๋ก๋ง ๋ฐ์ํ๋ ๋ฌธ์ ๋ผ๊ณ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ด๊ฐ ์ผํ๋ ๊ณณ์์๋ ํ์ ๋ฐ๋ผ Less ๋ฐ Sass๋ฅผ ์ฌ์ฉํ๊ณ ํ์ฌ Sass ๋น๋ ์ค์ ์์๋ ๋น ์ ํ๊ธฐ๊ฐ ๋ฆฐํ ์ ํต๊ณผํ์ง ์์ต๋๋ค(์ฑ์ด ์ปดํ์ผ๋์ง ์์). ๊ทธ๋์ CSS ๋ชจ๋/๋ฆฌ์กํธ๋ก ์ ๊ทผ ๋ฐฉ์์ ๋ณ๊ฒฝํด์ผ ํ์ต๋๋ค.
๋ฌธ์ ๋ ๋ฐ๋ก ์ด ํจํด์ ๋๋ค.
{
[css.loading]: isLoading
}
์ด ํจํด์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ์์ธ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
<div className={`${isLoading && css.loading}`}></div>
๊ทํ์ ์์์๋ ์ ์๋์ง ์์ ์ด๋ฆ์ผ๋ก ๊ฐ์ฒด ์์ฑ์ ์ ์ํ๋ ค๊ณ ํฉ๋๋ค. ๋ ผ๋ฆฌ๋ฅผ ์ ํํ๋ฉด ํด๋์ค๊ฐ ์ ์๋์ง ์์ ์ ์์ผ๋ฉฐ ์์ธ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
"์คํ์ผ์ํธ ์์ฑ ์๋ฃ"๋ผ๊ณ ํ๋ ์ด ์์ ์๋ ํน์ ์ธ์ง ์ปจํ ์คํธ๊ฐ ํ์ํ๋ฉฐ ์๋นํ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ๋งํฌ์ ๊ณผ HMR ์์ ์ด ์๋ ์ค์บํด๋ฉ ๋จ๊ณ ํ์ ์ํํ๋ ๊ฒ์ด ํจ์ฌ ์ฝ์ต๋๋ค.
์ด ํจํด์ ์ง๋ฐฐ์ ์ด๋ฉฐ ๋ฐ๊ณต์์ ์ธ ์ฌ์ฉ ์ง์นจ์ด๋ฉฐ ์ผ๋ง ์ React ๋ฐฐํฌํ์ ์ผ๋ถ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ์ํ์ ๋ถ๋ช
ํ ์ฆ๋ฅ๋ฉ๋๋ค. ๋น์ ์ ๊ธธ์ ์ฝ์ ์๋ ์๊ณ ํ์ฅํ ์๋ ์์ต๋๋ค.
return <div className={cx(css.post, sharedCss.frame, {
[css.support]: post.isSupport,
[css.foreign]: showTranslation,
[css.private]: post.isInternal,
[css.cached]: post.status.isLoading
...
})}>...</div>
CSS ๋ชจ๋์ ์ค๋๋ ์คํ์ผ์ ์ํํ๋ ์ฃผ์ ์ ๊ทผ ๋ฐฉ์์ด๋ฉฐ ์์ผ๋ก๋ ๊ทธ๋ด ๊ฒ์
๋๋ค.
๋น ์ ํ๊ธฐ ์ ๊ฑฐ - CSS ๋ชจ๋๊ณผ ํจ๊ป ์ฌ์ฉํ ๋ ์ฝ๋ ์๋ฏธ๋ฅผ ๋ณต์กํ๊ฒ ๋ณ๊ฒฝํฉ๋๋ค.
์ด ๋์์ ์ต์ํ ๊ตฌ์ฑ์ ํตํด ํผํ ์ ์์ด์ผ ํฉ๋๋ค.
๊ทธ ํฅ๋ฏธ ๋กญ๊ตฐ์. ๋ค์ ์ฌ๋ ๊ฒ์ ์ ์ค ์ผ์ด์ค๋ฅผ ์ํด์๊ฐ ์๋๋ผ Less๊ฐ CSS๋ฅผ "์ฒญ์"ํ๋ ์ผ์ ํด์๋ ์ ๋๊ธฐ ๋๋ฌธ์
๋๋ค. compress
์ต์
์ ๋น์ทํ ์ด์ ๋ก ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ฆ, ์ ํ๊ธฐ๋ฅผ ์ ๊ฑฐ/์์ถ/์ ๋์ฌ ์ถ๊ฐ ๋ฑ์ ์ ์ง ๊ด๋ฆฌ ๋๊ตฌ๊ฐ ๋ง์ด ์์ต๋๋ค.
์ด ๋์์ ๋น ์ ํ๊ธฐ๊ฐ ๋ธ๋ผ์ฐ์ ์ ๊ด๋ จ์ด ์์ ๋ ์์ฑ๋์์ง๋ง CSS ๋ชจ๋์ ๊ณ ๋ คํ ๋ ๋ฐ์ดํฐ์ ๊ด๋ จ์ด ์๋ค๋ ๊ฒ์ ์ด๋ ์ ๋ ํ๋นํฉ๋๋ค.
์ฌ์ค ๋๊ตฐ๊ฐ ์ด์๋ฅผ ์ ๊ธฐํ์ง ์๋ ํ ์ด๊ฒ์ ์ต์
์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ด ์์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. IMO๋ removeEmptyRulesets
(์ ํ์๊ฐ ์๋)์ด๊ณ ๊ธฐ๋ณธ๊ฐ์ true
์
๋๋ค.
ํธ์ง: ์๋๋ฉด ๊ธฐ๋ณธ๊ฐ์ด false
keepEmptyRulesets
์ฌ์ผ ํฉ๋๊น? ๐ค ์ ์๋์ง ์์ ๊ฒฝ์ฐ ์๋ชป๋ ๊ฒ์ฌ๋ฅผ ์ฝ๊ฒ ํ๊ธฐ ๋๋ฌธ์ ํ์์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
CSS ๋ชจ๋์ ๊ณ ๋ คํ ๋
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๊ทธ๋ค์๊ฒ๋ง ๊ตญํ๋์ง ์์ต๋๋ค. CSSOM์ ํตํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ์ก์ธ์ค์ ๊ฐ์ ๊ฒ๋ ๊ณ ๋ คํ์ญ์์ค.
keepEmptyRulesets
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฅํฉํ ์ธก๋ฉด์์ ์กฐ๊ธ, ์๋ง๋. CLI์ ์ข์ง ์์: --keep-empty-rulesets
์ฅํฉํ ์ธก๋ฉด์์ ์ฝ๊ฐ, ์๋ง๋
๋์ํ์ง ์์ต๋๋ค๋ง ๋ค๋ฅธ ์ ์์ด ์์ผ์ญ๋๊น? ๊ทธ๊ฒ์ ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ํ๋์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๋๋ก๋ ๋ช
์์ ์ธ ๊ฒ์ด ๋์์ด ๋ฉ๋๋ค. API์์๋ keepEmptyRulesets
์ด๊ณ CLI์์๋ --keep-rulesets
๊ฐ ๋๋ ๊ฒ์ ๋ง์ ์ ์์ต๋๋ค. ๋๋ ์ฌ์ง์ด --keep-empty
๋ ๋ค keepEmpty
์ด์ด์ผ ํฉ๋๊น?
๋๋ ์ฌ์ฉํ ๊ฒ์ ๋๋ค :
outputEmptyRulesets : true|false
;--empty-rulesets
๋ฅผ ์ ์ฒด ํ์ CLI ํ ๊ธ๋ก ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ -er
๋๋ -empty
๋ฅผ ์ฝ์ CLI ํ ๊ธ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.@rjgotten ์ ๋ ๊ด์ฐฎ์ต๋๋ค. ๋๋ ๊ฐ์ ์ ์ผ๋ก ํฌ์ํ์ง ์์ต๋๋ค lol. @garkin - ์ด์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?
๋์๊ฒ๋ ๊ด์ฐฎ์ ๋ณด์ธ๋ค.
์ค์ ๊ตฌํ์ ์ธ์ ์์ํ ์ ์์ต๋๊น?
์ด๊ฒ์ ์ฐ๋ฆฌ์๊ฒ๋ ๋ฌธ์ ์
๋๋ค.
@orchidoris ํ๋ณด ํ์ํฉ๋๋ค!
ํด๊ฒฐ ๋ฐฉ๋ฒ ํ๋ฌ๊ทธ์ธ...
๋ชจ๋ ์ ํ๊ธฐ์ __NOOP__: 1;
๋ฅผ ์ถ๊ฐํ ๋ค์ ๋ ์๋ฃ๋๋ฉด ์ ๊ฑฐํฉ๋๋ค.
class NoopPreProcessor {
process = (css, extra) => css.replace(/}/g, ';__NOOP__: 1;}');
}
class NoopPostProcessor {
process = (css, extra) => css.replace(/__NOOP__: 1;/g, '');
}
const NoopPlugin = {
install: (less, pluginManager) => {
pluginManager.addPreProcessor(new NoopPreProcessor());
pluginManager.addPostProcessor(new NoopPostProcessor());
},
};
๋ก๋๊ฐ ์ ์ preact์ ๊ฒฝ์ฐ:
helpers.getLoaders(config)
.filter(item => item.ruleIndex===1)
.map(item => {
item.loaders[0].options.options.stictMath = true;
item.loaders[0].options.options.plugins = [
NoopPlugin,
];
item.loaders[0].options.options.paths = [
...item.loaders[0].options.options.paths[0],
path.resolve(__dirname, 'src'),
];
});
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@chetzof ๋๋ ์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์์ ๋์ต๋๋ค. ๊ทธ๊ฒ์ด ์ต์ ์ ๋ฐฉ๋ฒ์ ์๋์ง๋ง ์ฐพ๊ณ ์๋ ๊ฒ์ ํจ๊ณผ์ ์ ๋๋ค.
๋๋ ๊ทธ๋ ๊ฒ ๋์์ต๋๋ค :
์ ํ๊ธฐ { /**/ }
๋ฐฉํ๋ฒ์์๋ ๋น์ด ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฉ๋๋ค.