Less.js: ๊ฐ€๋“œ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉ

์— ๋งŒ๋“  2013๋…„ 07์›” 04์ผ  ยท  46์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: less/less.js

.guard () when (@variable) {
  a {
    color: red;
  }
}

๋ณ€์ˆ˜๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ถœ๋ ฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

<strong i="8">@variable</strong>: true;

.guard () when (@variable) {
  a {
    color: red;
  }
}

๋ณ€์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

a {
  color: red;
}
feature request low priority support as plugin

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด ์š”์ฒญ์— ๋Œ€ํ•œ ์›€์ง์ž„์ด ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์–ผ๋งˆ ๋™์•ˆ ์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ ๊ฒ€์‚ฌ์— ๋Œ€ํ•ด ๋ถˆ์•ˆํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ์ด์ƒ์ ์ด์ง€ ์•Š์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค...

p {
  & when not (@body-text-color = null) {
    color: @body-text-color;
  }
}

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋ ค๋ฉด ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ null ๋กœ ์ •์˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๊ฐ€ ์ฒ˜์Œ์— ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋Œ€์‹  ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ํšจ๊ณผ์ ์ด๊ณ  ์œ ์—ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  46 ๋Œ“๊ธ€

+1
์ด๊ฒƒ์€ ๋˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ธฐ๋ณธ ์ƒ‰์ƒ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค.
ํŠน์ • ์•ฑ(์˜ˆ: ์›น์‚ฌ์ดํŠธ์˜ ๋ฉ”์ธ ๋ฉ”๋‰ด)์— ๋Œ€ํ•œ ํŒŒ์ผ์ด ์ ์Šต๋‹ˆ๋‹ค.
๊ธฐ๋ณธ ์ƒ‰์ƒ์ด ๋ณ€์ˆ˜๋กœ ์ •์˜๋˜๋Š” ๊ธฐ๋ณธ less ํŒŒ์ผ์—์„œ ์ด less ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
์ด์ œ ๊ธฐ๋ณธ ๋ฉ”๋‰ด์˜ less ํŒŒ์ผ์—์„œ ๊ธฐ๋ณธ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ ํŒŒ์ผ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
๋ณ€์ˆ˜์˜ ์กด์žฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ชจ๋“ˆ ์ •์˜ ์ƒ‰์ƒ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ๋ฉ”๋‰ด๊ฐ€ ์ ์€ ํŒŒ์ผ์„ ์ƒ์ƒํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

@menu-base-color: white;
@menu-base-color: @base-color when (@base-color);
...or...
@menu-base-color: @base-color when isset(@base-color);

+1, ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ istext , isnumber isdefined ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  isundefined ๋Š” ์ ์€ ํ…Œ๋งˆ๋กœ ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด isdefined $์ธ ๊ฒฝ์šฐ $ value ๋˜๋Š” userValue ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

LESS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Semantic UI์— ๋Œ€ํ•œ ํ…Œ๋งˆ ๊ทœ์น™์„ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ด ๋ฌธ์ œ๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์— +1 - ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋„ ์ด๊ฒƒ์— +1

is-defined ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค(v2๊ฐ€ ๋ฆด๋ฆฌ์Šค๋˜๋Š” ์ฆ‰์‹œ ์ฒซ ๋ฒˆ์งธ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ค‘ ํ•˜๋‚˜์— ๋‚˜ํƒ€๋‚  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค). ์†”์งํžˆ ๋งํ•ด์„œ ์Šฌํ”ˆ ์ ์€ ์ด ๊ธฐ๋Šฅ์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์œ„์˜ ๋‘ ๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ทธ๋Ÿฐ ๊ธฐ๋Šฅ ์—†์ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋†“์น˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@InitArt ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€:

// library.less
<strong i="9">@variable</strong>: false;

a when (@variable) {
    color: red;
}

// ......................................
// user.less
<strong i="10">@import</strong> "library.less"
<strong i="11">@variable</strong>: true;

@nemesis13 ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€:

// library.less
@base-color: green;
@menu-base-color: @base-color;

.menu {
    background-color: @menu-base-color;
}

// ......................................
// user.less
<strong i="16">@import</strong> "library.less"
@base-color: white;
// or:
@menu-base-color: black;
// or whatever...

์ฆ‰, ์š”์•ฝํ•˜๋ฉด ๋ณ€์ˆ˜ ๊ฐ’์„ ์ž์œ ๋กญ๊ฒŒ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ณ€์ˆ˜๊ฐ€ ์ •์˜๋˜์—ˆ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋Œ€์‹  ํ•ด๋‹น ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์™œ max์˜ ์˜ˆ๊ฐ€ ๊ทธ๋“ค์—๊ฒŒ ์ ํ•ฉํ•˜์ง€ ์•Š์€์ง€ ๋Œ€๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ํ•  ์ˆ˜์žˆ๋‹ค
๋ณ€์ˆ˜๊ฐ€ ์œ„์— ์ •์˜๋˜์–ด ์žˆ๋Š”์ง€ ๋˜๋Š”
์ˆ˜์ž…ํ’ˆ ์•„๋ž˜? ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๊ฒƒ์ž…๋‹ˆ๊นŒ?
์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์—†๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์˜ ๋‹จ์ ์€ ๋ณ€์ˆ˜๋ฅผ ์ž˜๋ชป ์ž…๋ ฅํ•œ ์‚ฌ๋žŒ๋“ค์ด
์˜ค๋ฅ˜. ๊ฒฝ๊ณ ์™€ ํ•จ๊ป˜ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค์Œ์—์„œ ์ˆ˜ํ–‰ํ•œ ๊ฒฝ์šฐ
๋‹น์‹ ์€ ๊ฒฝ๊ณ ๋ฅผ ์›ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‚˜์˜ ์œ ์ผํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์ œ์•ˆ.

์ด๊ฒƒ์€ ๊ฒฐ๊ณผ CSS์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ํ…Œ๋งˆ๋ฅผ ์ •์˜ํ•  ๋•Œ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ๋งˆ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋งŽ์€ ์†์„ฑ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž๋Š” ๋‚˜๋จธ์ง€ ์†์„ฑ์„ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ์ผ๋ถ€๋งŒ ์„ค์ •ํ•˜๊ธฐ๋ฅผ ์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ์ตœ์ข… CSS๊ฐ€ ๋ถ€ํ’€๋ ค์ง‘๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ธฐ๋ณธ ํ…Œ๋งˆ(ํ…œํ”Œ๋ฆฟ)๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

.my-class {
    color: @text-color;
    background-color: @background-color;
    border-color: @border-color;
}

ํ…Œ๋งˆ ์‚ฌ์šฉ์ž๋Š” ๋‚˜๋จธ์ง€ ์†์„ฑ์„ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ํ…์ŠคํŠธ ์ƒ‰์ƒ๋งŒ ์„ค์ •ํ•˜๊ธฐ๋ฅผ ์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ฐ’์„ "์ดˆ๊ธฐ", "ํˆฌ๋ช…", "์ƒ์†" ๋“ฑ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ์ตœ์ข… CSS์˜ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ํ…Œ๋งˆ์—๋Š” ์ˆ˜๋ฐฑ ๊ฐ€์ง€ ์†์„ฑ์ด ์žˆ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฏ€๋กœ ํฌ๊ธฐ๊ฐ€ ์ƒ๋‹นํžˆ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@JechoJekov

์ด ๊ธฐ๋Šฅ ์š”์ฒญ์˜ ์š”์ ์„ ๋†“์น˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์†์„ฑ์„ ๋ณดํ˜ธํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค(๋”ฐ๋ผ์„œ ์œ„์—์„œ ๋‘ ๊ฐœ์˜ ๊ฒŒ์‹œ๋ฌผ์„ ์ œ์•ˆํ•œ ๊ทผ๊ฑฐ๊ฐ€ ์—ฌ์ „ํžˆ ์ ์šฉ๋จ). ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‹น์‹ ์˜ ์œ ์Šค ์ผ€์ด์Šค๊ฐ€ #1400์— ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ "๋ชจ๋“  ๊ฐ’์ด ์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ์†์„ฑ ๊ฑด๋„ˆ๋›ฐ๊ธฐ" ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋‹ค๋ฅธ ํฐ ์ด์•ผ๊ธฐ).

@seven-phases-max

๋ณ€์ˆ˜๋ฅผ "undefined" ๋˜๋Š” "unset" ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐ€์žฅ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†์„ฑ์„ ์ด๋Ÿฌํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์†์„ฑ์ด ์ตœ์ข… CSS์—์„œ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ตฌ๋ฌธ์ด ๋‹จ์ˆœํ™”๋˜๊ณ  ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@JechoJekov

๋ณ€์ˆ˜๋ฅผ "undefined" ๋˜๋Š” "unset" ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐ€์žฅ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ์ž์ฒด ํ‹ฐ์ผ“(์ž์ฒด ํ† ๋ก  ํฌํ•จ)์ด ํ•„์š”ํ•œ ๋˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๋กœ๋“œ๋งต์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์„ค๋ช…: ์ด๊ฒƒ์€ "ReadyForImplementation"์œผ๋กœ ํ‘œ์‹œ๋˜์ง€๋งŒ ์ด ์Šค๋ ˆ๋“œ์—๋Š” ํ•ฉ์˜๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฉฐ @seven-phases-max๊ฐ€ ์ ์ ˆํ•œ ๋Œ€์•ˆ์„ ์ œ์•ˆํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. @lukeapage @seven-phases-max, ๊ตฌํ˜„ ์ค€๋น„๊ฐ€ ์ œ๊ฑฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@matthew-dean ์•„๋ฌด ์ƒ๊ฐ์ด ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ "ReadyForImplementation"์ด ์—ฌ์ „ํžˆ ์œ ํšจํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. "์ด ๊ธฐ๋Šฅ์€ ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๋Ÿฌํ•œ ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” PR์„ ์ƒ๊ฐํ•ด ๋‚ธ๋‹ค๋ฉด ์ €ํ•ญ์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค" ๋˜๋Š” ์ผ์ข…์˜ :)

์–ด๋–ป๊ฒŒํ•œ๋‹ค๋Š”๊ฑฐ์•ผ? (๊ณ ๋ ค)

๋‚˜์—๊ฒŒ "๊ตฌํ˜„ ์ค€๋น„ ์™„๋ฃŒ"๋ž€ ํ•ด๊ฒฐ๋˜๊ฑฐ๋‚˜ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•˜๋Š” _๋ฐ˜๋“œ์‹œ_๋งŒ์žฅ์ผ์น˜์ผ ํ•„์š”๋Š” ์—†์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ํ•ฉ์˜๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. "๊ณ ๋ ค์ค‘"์ด ๊ท€ํ•˜์˜ ์ •์˜์— ๋ถ€ํ•ฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฒ”์œ„ ์ง€์ •์„ ์‚ฌ์šฉํ•  ๋•Œ ์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

<strong i="6">@foo</strong>: 'bar';
& { 
  // not sure if <strong i="7">@foo</strong> is defined
}

isDefined ์„(๋ฅผ) ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

is-defined ์™€ ๊ฐ™์€ ๊ฒƒ์ด (๊ตฌ๋ฌธ์ ์ธ ์„คํƒ•์œผ๋กœ) ์˜๋ฏธ๊ฐ€ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์Šคํƒ€์ผ ๋‚ด์—์„œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ _ํ•ญ์ƒ_ @foo ๋ฅผ ์ •์˜ํ•˜์‹ญ์‹œ์˜ค(ํ•„์š”ํ•œ ๊ธฐ๋ณธ๊ฐ’์ด ๋ฌด์—‡์ด๋“ ). ๊ฒฐ๊ตญ ์ •์˜ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

// in a far far away galaxy of your library default variables:
<strong i="8">@foo</strong>: undefined;

// the code where you need it
& when not(<strong i="9">@foo</strong> = undefined) { 
    // <strong i="10">@foo</strong> is defined by user    
}

// some user code
<strong i="11">@foo</strong>: bar;

์œ„์˜ ์˜ˆ์—์„œ ์ด๋ฏธ ์ด๊ฒƒ์„ ์ž‘์„ฑํ•œ ๊ฒƒ ๊ฐ™์ง€๋งŒ(์ €๋Š” ์ด ๊ธฐ๋Šฅ์˜ ๋ถ€์กฑ์ด ๋ฌด์—‡์—๋„ ๋ˆˆ์— ๋„์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ถ„๋ช…ํžˆ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ํ•˜๋‚˜, ๊ณต์œ ํ•˜์‹ญ์‹œ์˜ค).

๋ธŒ๋ผ์šฐ์ €์—์„œ ํ…Œ๋งˆ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, less.js ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ธฐ๋ณธ @theme ๋ณ€์ˆ˜๋ฅผ ๋Ÿฐํƒ€์ž„ ์„ค์ •์œผ๋กœ ๋ฎ์–ด์จ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•Œ๋ผ

window.less.modifyVars({
  theme: 'someOtherValue'
})

๋‚ด LESS์—์„œ ๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” ๊ธ€๋กœ๋ฒŒ theme.less ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

<strong i="14">@theme</strong>: undefined;

.setTheme {
  <strong i="15">@theme</strong> : 'default';
}
.setTheme;

๋‚˜๋„ ๋ฐฉ๊ธˆ ํ•ด๋ดค๋Š”๋ฐ

<strong i="19">@theme</strong>: 'default';

์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์— ์ถœ๋ ฅ๋˜๋Š” ๊ฐ’์€ undefined ์ด๊ณ  ๋‘ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋Š” modifyVars ์— ์„ค์ •ํ•œ ๊ฐ’์— ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ default ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋ณด๋ ค๋ฉด ์—ฌ๊ธฐ์—์„œ ํ…Œ๋งˆ ๋“œ๋กญ๋‹ค์šด์„ ํด๋ฆญํ•˜์„ธ์š” .

ํ˜„์žฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•(๋ผ์ด๋ธŒ ์‚ฌ์ดํŠธ์— ์žˆ์Œ)์€ ๋ณ€์ˆ˜ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์žก๊ณ  regexp๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋ฌธ ๋ถ„์„ํ•œ ๋‹ค์Œ modifyVars ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฝค ์ง€์ €๋ถ„ ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@seven-phases-max @import ๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€๋กœ ์ขํ˜”์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋‹ค์Œ์„ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

window.less.modifyVars({
  theme: 'changedValue'
});

theme.less์˜ ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋Š” outer ๊ฐ€ changedValue ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

component.less

<strong i="17">@import</strong> 'theme.less';

ํ…Œ๋งˆ.๋ฆฌ์Šค

<strong i="22">@theme</strong>: 'default';
.outer {
  value: @theme; // value is set to changedValue
}

์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ theme.less์—์„œ @theme ๋Š” changedValue default ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

component.less

<strong i="32">@import</strong> 'theme.less';

ํ…Œ๋งˆ.๋ฆฌ์Šค

<strong i="37">@theme</strong>: 'default';
<strong i="38">@import</strong> "@{theme}"; // theme is set to default not changedValue

"var in mixin"์˜ ๊ฒฝ์šฐ ์Šค๋‹ˆํŽซ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๋€๋‹ˆ๋‹ค.

// defaults:
.setTheme {
   <strong i="6">@theme</strong>: undefined;
}

// custom:
.setTheme {
  <strong i="7">@theme</strong>: 'default';
}
.setTheme;

modifyVars ์˜ ๊ฒฝ์šฐ ์‹œ๋„ํ•œ ์Šค๋‹ˆํŽซ์— ๋Œ€ํ•ด ํ•ญ์ƒ 'someOtherValue' ๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( modifyVars ๋Š” ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ์˜ ๋์— ์ผ๋ฐ˜ <strong i="14">@theme</strong>: 'someOtherValue'; ๋ผ์ธ์„ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ). ๋”ฐ๋ผ์„œ modifyVars ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ๊ณณ์— ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.
button ํŽ˜์ด์ง€ ์ฝ”๋“œ๋ฅผ ๋ณด์•˜์ง€๋งŒ ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๋นจ๋ฆฌ ๋งํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ์–ผํ• ๋ณด๋ฉด Less ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์žฌ์ปดํŒŒ์ผ๋˜๊ณ  ๊ฒฐ๊ณผ CSS๊ฐ€ modifyVars modifyVars ์— ๋‹ค์‹œ ์ ์šฉ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋˜๋Š” ์ดํ•ดํ•  ์ˆ˜ ์—†์„ ์ˆ˜๋„ ์žˆ์Œ) less.refreshStyles modifyVars ).


Btw., ๋งŒ์ผ์„ ๋Œ€๋น„ํ•˜์—ฌ is-default ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๊ณ„ํš์ด ์—†๋‹ค๊ณ  ํ™•์‹ ํ•˜์‹ญ๋‹ˆ๊นŒ?

.setTheme when not(is-defined(@theme)) {
  <strong i="26">@theme</strong>: 'default';
}
.setTheme;

? ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌธ์ œ๋Š” ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๊ฐ€ ์ง€์—ฐ ํ‰๊ฐ€ ์›์น™์„ ์ง์ ‘ ์œ„๋ฐ˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค( is-defined ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ false๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜์ง€๋งŒ ํ•ด๋‹น ๋ฒ”์œ„์—์„œ ์ฆ‰์‹œ ์ •์˜๋˜๊ธฐ ๋•Œ๋ฌธ์— , is-defined ๋„ true -> unsolvable recursion์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(์กฐ๊ฑด๋ถ€ ๋ช…๋ นํ˜• ์žฌ์ •์˜๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ํ—ˆ์šฉ๋  ์ˆ˜ ์—†๋Š” ์ด์œ ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Less #2072 ์ฐธ์กฐ).
์ฆ‰, ์‹ค์ œ๋กœ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ( is-defined ๊ฐ€ ์ด๋Ÿฌํ•œ ์žฌ๊ท€๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ๊ตฌ์ œํ•˜๋„๋ก ์ฝ”๋”ฉ๋˜์ง€ ์•Š๋Š” ํ•œ), ์ผ์ข…์˜ ์ง€์ •๋˜์ง€ ์•Š์€/์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์œผ๋กœ, ์ •์ƒ์ ์ธ ๋ณ€์ˆ˜ ๊ฐ€์‹œ์„ฑ ๊ทœ์น™๊ณผ์˜ ์ผ๊ด€์„ฑ ์—†์ด ๋” ์—‰๋ง.

@jlukic

<strong i="8">@theme</strong>: 'default';
<strong i="9">@import</strong> "@{theme}"; // theme is set to default not changedValue

๋„ค, ์ด๊ฒƒ๋„ ์ œ ์˜์‹ฌ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. (๋ถˆํ–‰ํžˆ๋„ ์ง€๊ธˆ ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์—†๊ณ  ์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚ ์ง€ ์ง์ž‘ํ•  ์ˆ˜๋„ ์—†์ง€๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ง„์ •ํ•œ ํ‘๋งˆ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ „์šฉ ์ด๊ฒƒ์ด ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ ๋ฌธ์ œ ๋ณด๊ณ ์„œ).

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ทธ ๋ฉ‹์ง„ ํ‘๋งˆ๋ฒ•๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋””๋ฒ„๊ทธํ•  ๋งค์šฐ ๊ฐ„๋‹จํ•œ ํŒŒ์ผ๋กœ ์ž‘์—…ํ–ˆ์ง€๋งŒ ์•„์ง ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค ๊ธฐํšŒ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ…Œ์ŠคํŠธ์—์„œ ์‹คํŒจ๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ {@variable} ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ์ง€๋งŒ CSS ์†์„ฑ์—์„œ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ ์€ ๋น„์šฉ์œผ๋กœ ํ…Œ๋งˆ๋ฅผ ์ •๋ง ์ฆ๊ธฐ๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ง€๋‚œ ์ฃผ Meteor DevShop์—์„œ ์„ ๋ณด์ธ LESS์˜ ์žฌ๋ฏธ์žˆ๋Š” ํ…Œ๋งˆ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค (์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์˜ ํŽ˜์ธํŠธํ†ต ์•„์ด์ฝ˜ ํด๋ฆญ).

@jlukic ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ–ˆ๊ณ  lessc ์™€ less.js ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ƒํ•œ ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ์˜ vars์— ๋Œ€ํ•ด modifyVars ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค( codepen ๋ฐ๋ชจ ์ฐธ์กฐ). ์š”์  ๋ฌด์„œ์šด URL์—์„œ ๊ฐ€์ ธ ์˜ค์ง€๋งŒ ํŽ˜์ด์ง€๊ฐ€ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ... ๊ทธ๋ž˜์„œ ์‹ค์ œ๋กœ ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ๊ณณ์—์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค).

์‹œ๊ฐ„์„ ๋‚ด์–ด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฝค ๋ช…ํ™•ํ•œ ์ปท์ž…๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์กฐ์‚ฌํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์š”์ฒญ์— ๋Œ€ํ•œ ์›€์ง์ž„์ด ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์–ผ๋งˆ ๋™์•ˆ ์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ ๊ฒ€์‚ฌ์— ๋Œ€ํ•ด ๋ถˆ์•ˆํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ์ด์ƒ์ ์ด์ง€ ์•Š์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค...

p {
  & when not (@body-text-color = null) {
    color: @body-text-color;
  }
}

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋ ค๋ฉด ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ null ๋กœ ์ •์˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๊ฐ€ ์ฒ˜์Œ์— ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋Œ€์‹  ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ํšจ๊ณผ์ ์ด๊ณ  ์œ ์—ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

+1

์š”์•ฝํ•˜์ž๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ ๋‚ด์—์„œ is-defined(name) (๋ฐ/๋˜๋Š” get-value-of(var-name, fallback-value-if-not-defined) ) ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด 15์ค„ ๋ฏธ๋งŒ์˜ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ๋‹น์‹ ์ด ์ถฉ๋ถ„ํžˆ ์šฉ๊ฐํ•˜๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์— +1. ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ์„œ ์ด์— ๋Œ€ํ•œ ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด ๋ง์€, @seven-phases-max๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ์—ฌ์ž๋ณด๋‹ค ์ฝ”๋“œ๋ฅผ ๋” ์ž˜ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•ฝ 15์ค„์˜ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์•ฝ 15์ค„์˜ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์•„๋ฌด๋„ ๊ด€์‹ฌ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—? ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ํ›Œ๋ฅญํ•˜๊ณ  "๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค"... ํ•˜์ง€๋งŒ ์ž์‹ ์˜ ์‹œ๊ฐ„์— ๋Œ€ํ•ด์„œ๋Š” ๋งˆ์ˆ ์ฒ˜๋Ÿผ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ;)

๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ์—ฌ์ž๋ณด๋‹ค ์ฝ”๋“œ๋ฅผ ๋” ์ž˜ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๊ด€์‹ฌ์‚ฌ ๋’ค์— ์ œ ์ž์‹ ์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค(ํŠนํžˆ ๊ทธ๊ฒƒ์ด ์ œ๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ์˜ค์šฉ/์ž˜๋ชป๋œ ์ฝ”๋“œ ์Šคํƒ€์ผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ฌดํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด).

@ashenden ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ๊ณตํ—ˆํ•˜๊ฒŒ ๋“ค๋ฆฌ์ง€ ์•Š๋„๋ก ๋‹ค์Œ์€ ๊ฒฐํ•จ ์—†์ด "์•Œ ์ˆ˜ ์—†์Œ"(์ผ๋ฐ˜์ ์ธ CSS ์žฌ์ •์˜๊ฐ€ ์–ด๋–ค ์ด์œ ๋กœ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ถ„๋ช…ํžˆ ๊ฐ€์ •)์œผ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ทœ์น™ ์„ธํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. "blind-move-every-CSS-value-to-a-variable-plus-use-something-that-you-dont-use"์— ๋Œ€ํ•œ ์•„์ด๋””์–ด(๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ์™œ ๋ง๊ฐ€์กŒ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธด ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ).

์ผ๋ฐ˜์ ์œผ๋กœ "hooks"๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ์€ "can't make my mind up festival"์ž…๋‹ˆ๋‹ค.

// .............................................
// base code:

p {
    & when not (is-defined(@body-text-color)) {
        color: @body-text-color;
    }
    & when not (is-defined(@body-text-color)) {
        background-color: @body-back-color;
    }
}

span {
    & when not (is-defined(@body-text-color)) {
        color: @body-text-color;
    }
    & when not (is-defined(@body-text-color)) {
        background-color: @body-back-color;
    }
}

// .............................................
// customization:

@body-back-color: blue; // how about gradient?

๋‹ค์Œ์œผ๋กœ ๋Œ€์ฒด๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

// .............................................
// base code:

p {
    .body-text();
    .body-back();
    // ^ it's actually better to group all this into a singe entity, e.g. .p()
    // so that as you don't know WHAT or HOW to be customized
    // you don't pre-enforce any limitations and/or hardcoded approach
    // for something YOU do not even write
}

span {
    .body-text();
    .body-back();
}

.body-text() {}
.body-back() {}

// .............................................
// customization:

.body-back() {background-color: blue}

์„ ์„ ์„ธ๊ณ , ๊ฐ€๋Šฅ์„ฑ์„ ์„ธ๊ณ , ํ•œ๊ณ„๋ฅผ ์„ธ์–ด๋ณด์‹ญ์‹œ์˜ค.
์ฆ‰, ์ผ๋ถ€ CSS ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์‚ฌ์šฉํ•  ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๊ทธ๋Œ€๋กœ ๋‘์‹ญ์‹œ์˜ค.

์—ฌ๋Ÿฌ๋ถ„, ์—ฌ๊ธฐ์—์„œ ์ œ๊ฐ€ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์ด๊ฒƒ์ด ์œ ํšจํ•œ ๊ฒฝ์šฐ์ด๊ณ  is-undefined ์—†์ด ๊ณ ์น  ์ˆ˜ ์—†๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ๋“ˆ๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํ…Œ๋งˆ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ•ต์‹ฌ ์•ฑ์—์„œ ๋ณ€์ˆ˜ @theme : 'yellow'๋ฅผ ์ •์˜ํ•œ ๋‹ค์Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ๊ฒฝ์šฐ์— less ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@import 'ํ…Œ๋งˆ/@{ํ…Œ๋งˆ}';

์‹ ์ฒด {
๋ฐฐ๊ฒฝ: @primaryColor;
}

์ด๋Ÿฐ ์‹์œผ๋กœ @primaryColor : yellow ๋ฐ @primaryColor : red๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ yellow.less ๋ฐ default.less๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ๋‚˜๋Š” primaryColor์™€ ๊ฐ™์€ ์˜๋ฏธ๋ก ์  ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๊ฐ€ ์ •์˜๋œ ํ…Œ๋งˆ ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž๋Š” ์•ฑ์—์„œ ํ…Œ๋งˆ ์ด๋ฆ„์„ ์ •์˜ํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์Šคํƒ€์ผ์„ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹ ๊ฒฝ์“ฐ์ง€ ๋งˆ์„ธ์š”. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฏน์Šค์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

<strong i="6">@theme</strong>: 'default';

.imports(@theme) when (<strong i="7">@theme</strong> = 'yellow') {
    <strong i="8">@import</strong> "themes/yellow";
}
.imports(@theme) when (<strong i="9">@theme</strong> = 'default') {
    <strong i="10">@import</strong> "themes/default";
}
.imports(@theme);

@waterplea ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<strong i="7">@theme</strong>: default;

.imports(yellow) {<strong i="8">@import</strong> "themes/yellow";}
.imports(default) {<strong i="9">@import</strong> "themes/default";}
.imports(@theme);

๋˜ํ•œ ์ œ๊ฑฐ๋œ ์ค‘๋ณต ๋”ฐ์˜ดํ‘œ๋„ ๊ธฐ๋กํ•ด ๋‘์‹ญ์‹œ์˜ค.

์†”์งํžˆ ๋งํ•ด์„œ <strong i="13">@theme</strong>: yellow; (+ ๋ชจ๋“  ๋ฏน์Šค์ธ ์ฝ”๋“œ)๊ฐ€ ๋ช…์‹œ์ ์ธ <strong i="15">@import</strong> "themes/yellow"; ๋ผ์ธ๋ณด๋‹ค ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์šฐ์„  ์žฌ์ •์˜ ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ฆ‰, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž๊ฐ€ yellow ํ•ญ๋ชฉ์„ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ <strong i="18">@import</strong> "themes/default"; ์„ ์ˆจ๊ธธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋…€๋Š” ๋…ธ๋ž€์ƒ‰ ํ…Œ๋งˆ๋ฅผ ๊ฐ€์ ธ ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ํ•œ ์ค„) ๋ฐ ์งœ์ž” - ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋…ธ๋ž€์ƒ‰ ํŒŒ์ผ์— ์ง€์ •๋œ ๋ณ€์ˆ˜ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ๋งˆ๋ฅผ ์žฌ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์ „ ์„ค์ • ํ…Œ๋งˆ๋กœ ์ „ํ™˜ํ•˜๋Š” ํŒŒ์ผ์„ ์„ ํƒ์ ์œผ๋กœ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ํ”„๋กœ์ ํŠธ์— ๋‹ค๋ฅธ ํ…Œ๋งˆ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ณ„์นญ์„ ๋…ธ๋“œ ๋ชจ๋“ˆ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก webpack์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ „์— ์“ด ๊ฒƒ ๋˜๋Š” ๋‹น์‹ ์ด ์“ด ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ Angular์šฉ UI ํ‚คํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์žˆ๊ณ  ๊ณ ๋„๋กœ ๋ชจ๋“ˆํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ฒ„ํŠผ๋งŒ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์ปจํŠธ๋กค์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ์Šคํƒ€์ผ ์บก์Šํ™”์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ ์ค‘์ธ ํ…Œ๋งˆ๋ฅผ ์ธ์‹ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜์€ ์„ค์ •ํ•˜๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ Angular์šฉ UI ํ‚คํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์žˆ๊ณ  ๊ณ ๋„๋กœ ๋ชจ๋“ˆํ™”๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ท€ํ•˜๊ฐ€ ์ž‘์„ฑํ•œ ๋‚ด์šฉ์€ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ฌดํ•œํ•œ ์‹œ๊ฐ„ ์ „์— ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ€์žฅ ์Šฌํ”ˆ ๋œ(์ž˜๋ชป) ์ดํ•ด ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ๊ธฐ๋ณธ์ ์ธ ๋œ ๊ฒŒ์œผ๋ฅธ ํ‰๊ฐ€ ์›์น™์„ ๋†“์น˜๊ณ , ์ž์—ฐ์Šค๋Ÿฌ์šด ๋œ ์žฌ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋ฌด๊ฑฐ์šด ํŒŒ์ผ ์ฃผ์ž…์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ •๋ฐ˜๋Œ€์˜ ๋ณ€์ˆ˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ์–ธ์–ด(์˜ˆ: PHP, Sass ๋“ฑ)์˜ ์Šต๊ด€์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ๊ธฐ๋ฐ˜ ์‚ฌ์šฉ์ž ์ •์˜ ํŒจํ„ด. "์–˜๋“ค์•„, ์ž˜๋ชปํ–ˆ์–ด!"

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ดํ•ดํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. :) ์ œ ์˜ˆ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ œ์•ˆ์„ ์„ค๋ช…ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ์–ป์€ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ตœ์†Œ ๊ตฌ์กฐ์  ์˜ˆ์ž…๋‹ˆ๋‹ค.

๋„์„œ๊ด€:

  • import.less
    <strong i="10">@import</strong> 'theme-default';
    <strong i="13">@import</strong> 'mixins';
  • mixins.less
    some mixins here like resetting default browser button styles
  • ํ…Œ๋งˆ-default.less
    <strong i="20">@primary</strong>: red;
    <strong i="23">@secondary</strong>: blue;
  • theme-secondary.less
    <strong i="27">@primary</strong>: green;
    <strong i="30">@secondary</strong>: yellow;
  • ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ
    <strong i="34">@import</strong> 'import';
    .button { color: @primary; }

ํ”„๋กœ์ ํŠธ 1(๊ธฐ๋ณธ ํ…Œ๋งˆ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ):

  • ์š”์†Œ
    <strong i="42">@import</strong> 'import';
    body { background: @secondary; }

ํ”„๋กœ์ ํŠธ 2(2์ฐจ ํ…Œ๋งˆ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ):

  • ์š”์†Œ
    <strong i="50">@import</strong> 'import';
    body { background: @secondary; }

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋…ธ๋“œ ๋ชจ๋“ˆ๋กœ ์ถ”๊ฐ€๋˜๊ณ  ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋ฒ„ํŠผ ๊ตฌ์„ฑ ์š”์†Œ๋งŒ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ž์ฒด ํŒŒ์ผ์ด ์ ์€ ํ•ด๋‹น ๋ฒ„ํŠผ์— ๋Œ€ํ•œ Angular ๋ชจ๋“ˆ์ด๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ 1 ๋˜๋Š” ํ”„๋กœ์ ํŠธ 2์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๊ณผ ๋ณ„๋„๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ž ์‹œ ๋™์•ˆ ์ƒ๊ฐํ–ˆ๊ณ  ํ”„๋กœ์ ํŠธ 1 ๋˜๋Š” ํ”„๋กœ์ ํŠธ 2๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ์™€ ํ”„๋กœ์ ํŠธ ์ž์ฒด ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ปดํŒŒ์ผํ•  ๋•Œ ์‚ฌ์šฉํ•  ํ…Œ๋งˆ ํŒŒ์ผ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋” ์ ์€ ์ˆ˜์˜ ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋‚ผ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ๋‚ด์—์„œ ๋ฒ„ํŠผ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ์žฌ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€์‹  ๊ธฐ๋ณธ์ ์œผ๋กœ import.less๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
<strong i="58">@import</strong> 'theme-default';
<strong i="61">@import</strong> 'mixins';
<strong i="64">@import</strong> (optional) '~custom-theme';

๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ ๋ชจ๋‘์— ๋Œ€ํ•œ ํ…Œ๋งˆ ๋ณ€์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๋ฉด webpack์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํŒŒ์ผ์˜ ๋ณ„์นญ์„ ๋ชจ๋“ˆ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ say @primary ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์žฌ์ •์˜ํ•˜๊ฑฐ๋‚˜ ๋ณด์กฐ ํ…Œ๋งˆ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<strong i="69">@import</strong> '~myLibrary/styles/theme-secondary';

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์žฌ์ •์˜์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ์šฉ์ž๊ฐ€ "์ฃผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ ์ดํ›„์˜ ๋ชจ๋“  ์œ„์น˜"์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ ์ฝ”๋“œ ์‚ฌ์ด์— ๋“ค์–ด๊ฐˆ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•œ ๊ฒƒ์ด ์Šคํƒ€์ผ ์บก์Šํ™” ์—†๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ง€๋งŒ Angular์˜ ๊ฒฝ์šฐ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์†”๋ฃจ์…˜์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์˜คํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฐธ์กฐ. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ๊ฐ™์€ ๊ฒƒ์— ๋Œ€ํ•ด ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(๋‹จ์ˆœํžˆ ๋‹ค๋ฅธ ๋‹จ์–ด๋กœ). buttonComponent (๋˜๋Š” ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ)๊ฐ€ ๋ณ„๋„๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ์ฆ‰์‹œ "ํ”„๋กœ์ ํŠธ ์‚ฌ์šฉ์ž ์ง€์ • ๋งˆ์Šคํ„ฐ"๋Š” import.less ํŒŒ์ผ๋กœ ๋‚จ์•„ ์žˆ๊ณ  ์ œ๊ฐ€ ์ œ์•ˆํ•œ ๋Œ€๋กœ ์ •ํ™•ํžˆ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ( Project 1 ๋ฐ Project 2 ๋Š” buttonComponent ์™€ ๊ฐ™์€ ์ˆ˜์ค€์˜ ๋˜ ๋‹ค๋ฅธ "๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ"(๋˜๋Š” "์˜ฌ์ธ์›"?) ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋ฐ”๋€Œ๊ณ  ๊ฝค "ํ”„๋กœ์ ํŠธ").

์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‚ด ์ทจํ–ฅ์— "์˜ฌ๋ฐ”๋ฅธ ์ผ์„ํ–ˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์˜ค๋ž˜๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ํ™œ๋™์ด ์—†์œผ๋ฉด ํ์‡„๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@stale ํ•‘.

๊ธฐ์ˆ ์ ์œผ๋กœ ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์€ 2015๋…„๋ถ€ํ„ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ์ธ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•œ ์ ์ด ์—†์œผ๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์ €๋ฅผ ๋น„๋‚œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค(์ฐธ๊ณ ์šฉ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค).

์ด ๋ฌธ์ œ๋Š” ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์˜ค๋ž˜๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ํ™œ๋™์ด ์—†์œผ๋ฉด ํ์‡„๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ... ๋‚˜๋Š” ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋‹ค์‹œ ํ›‘์–ด๋ณด์•˜๊ณ  ์ด๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„ ์‚ฌ๋žŒ๋“ค์ด Less ๋ฒ”์œ„๋ฅผ ์˜คํ•ดํ•˜๋Š” ๊ฒฝ์šฐ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

vars๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ Vars๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<strong i="7">@import</strong> "library";  // contains @library-color: blue;

@library-color: red;

.box {
  color: @library-color;
}

_change_ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์†์„ฑ์„ ์กฐ๊ฑด๋ถ€๋กœ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ํ•„์š”์„ฑ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์†์„ฑ์ด ๋ณ€์ˆ˜๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, library.less ์— ๋‹ค์Œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ:

@library-color: blue;
.box {
  color: @library-color;
}

์ถœ๋ ฅ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋“  ์ž‘์—…:

<strong i="16">@import</strong> "library";
@library-color: red;

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

.box {
  color: red;
}

ํ•ด๋‹น ์Šค๋ ˆ๋“œ์˜ OP์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ํ•ด๋‹น ๋™์ž‘์„ ์ดํ•ดํ•ฉ๋‹ˆ๊นŒ?

"dos var exist"์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐœ๋…์ ์œผ๋กœ ์ง์ ‘์ ์ธ "๊ฑฐ์ง“"์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” true ๊ฐ€ ์œ ์ผํ•œ "truthy" ๊ฐ’์ด๋ผ๋Š” ๊ฒƒ์€ ์ด๋ก€์ ์ธ ์ผ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ–‰๋™์˜ ๋ฌธ์ œ๋ผ๊ธฐ๋ณด๋‹ค๋Š” ๊ต์œก์˜ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๋ณธ ๋ณ€์ˆ˜ ๊ฐ’์„ ์„ ์–ธํ•˜๋Š” ํ•œ ์ค„๋กœ ํ•ด๊ฒฐ๋˜๋ฏ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Less v3.5๊ฐ€ ๋” ๊ด€๋Œ€ํ•œ ๊ฑฐ๋ž˜๋กœ ์ด๋™ํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ฒฝ๋น„์› ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜๊ฐ€ ๋” ๊ด€๋Œ€ํ•˜๊ฒŒ ํ‰๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ํˆฌํ‘œ๋Š” ์•„๋‹ˆ์˜ค์ž…๋‹ˆ๋‹ค. @the-variable: false; ๋Š” OP๊ฐ€ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๋ชจ๋“  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.


์ด์™€ ๊ด€๋ จ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์งˆ๋ฌธ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์€ less gitter ์™€ @me์— ์ž์œ ๋กญ๊ฒŒ ๊ฒŒ์‹œํ•˜์„ธ์š”.

์ข‹์•„์š”, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @calvinjuarez.

์ด๊ฒƒ์ด ์—ด๋ฆฐ ์ดํ›„์— ์ผ์–ด๋‚œ ์ผ์€ if() ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ color: if((@variable), green, red); ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@matthew-dean ์ด ํŒ์„ ์ž‘์„ฑํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. 3.0 ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ์—์„œ if()๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ๋ณด์•˜์ง€๋งŒ ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ณ ์œ ํ•œ ์‚ฌ๋ก€๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(๋‹จ, ์ถ•์†Œ ๋ฒ„์ „์„ ๋งŒ๋“ค ์‹œ๊ฐ„์€ ์•„๋‹˜). ๋‹ค์‹œ ํ•œ ๋ฒˆ, ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ž˜ํ–ˆ์–ด, LESS ํŒ€.

@kbav ๋ฌธ์ œ์—†์–ด์š”! ๊ทธ ํŒ์˜ ๋งจ ์œ„์— ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ํŒ: if() ์ด ์ฒ˜์Œ ๋„์ž…๋˜์—ˆ์„ ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ when ๊ฐ€๋“œ๋ฅผ "ํฌํ•จ"ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ฑด ์ฃผ์œ„์— ๊ด„ํ˜ธ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: $#์—์„œ when (@variable) when ๋‹ค์Œ ๋ถ€๋ถ„) when (@variable) ). ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” Less 3.6์—์„œ ์ˆ˜์ •๋˜์—ˆ์œผ๋ฏ€๋กœ ์œ„์˜ ์˜ˆ๋Š” ๊ด„ํ˜ธ ์—†์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒฝ์šฐ).

color: if(<strong i="10">@variable</strong>, green, red);
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

chricken picture chricken  ยท  6์ฝ”๋ฉ˜ํŠธ

rejas picture rejas  ยท  6์ฝ”๋ฉ˜ํŠธ

renoth picture renoth  ยท  6์ฝ”๋ฉ˜ํŠธ

BrianMulhall picture BrianMulhall  ยท  4์ฝ”๋ฉ˜ํŠธ

briandipalma picture briandipalma  ยท  6์ฝ”๋ฉ˜ํŠธ