Less.js: data-uri ํ•จ์ˆ˜๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€์žˆ๋Š” ๋ฌธ์ž์—ด์ด ์•„๋‹Œ data-uri ํ˜ธ์ถœ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

https://github.com/less/less.js/issues/2541์—์„œ ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ์—์„œ ์ด๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

// mixins.less
.background(@image) {
    background-image: data-uri(@image);
}
// app/content/button.less
button {
  .background("images/btn.jpg");
}

app/content/images/btn.jpg ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€๋งŒ images/btn.jpg ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ธ์ง€ ๋ฒ„๊ทธ ์ˆ˜์ •์ธ์ง€์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

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

ํ  ...

ํ™•์ธ. ๊ทธ๋Ÿฐ ๋‹ค์Œ resolve-url(url, [base]) ํ•จ์ˆ˜-์˜ต์…˜ ์ธ base ๊ฐ€์žˆ๋Š” ๊ฒƒ์€ ์–ด๋–ป this.fileInfo ๋งŒ ๊ฐ€์ ธ ์™€์„œ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” declared-dir() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” URL ํ™•์ธ๊ณผ ๊ด€๋ จ์ด์—†๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ „์ฒด ์–‘์‹ ํ˜ธ์ถœ (์•”์‹œ ์  ๊ธฐ๋ฐ˜ ์—†์Œ)์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

resolve-url("../foo", declared-dir())

... ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ƒฅํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

resolve-url("../foo")

... ์ด๋Š” ๊ฒŒ์œผ๋ฅธ ์‚ฌ๋žŒ์— ํ•ด๋‹นํ•˜๋Š” ์—ด๋ง์ž…๋‹ˆ๋‹ค.

url("../foo")

๊ทธ๋Ÿฐ ์‹์œผ๋กœ '์ž๋™'์ฃผ์ž… ๋œ ๋ณ€์ˆ˜๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆœ์ „ํžˆ ์ผ๋ จ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌํ˜„ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”๋กœํ•˜๋Š” ์œ ์ผํ•œ ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ URL์„ '์ด๋ฏธ ํ•ด๊ฒฐ๋จ'์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ resolve-url ํ•จ์ˆ˜์—์„œ ๋‚˜์˜ค๋Š” URL์—์„œ ๊ธฐ๋ณธ ํ™•์ธ์ž ๋…ผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ์ฐจ๋‹จํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์˜๋ฏธ๋ก ์€ ๊ณผ์ • ๋ฌธ์„œ์—์„œ ๋ช…ํ™•ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฌธ์„œ๋Š” url ์™€ resolve-url ๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ๋น„๊ตํ•˜์—ฌ ์—ด๋งํ•˜๊ณ  ๊ฒŒ์œผ๋ฅธ ํ‰๊ฐ€ / ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ธ์ง€ ๋ฒ„๊ทธ ์ˆ˜์ •์ธ์ง€์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  : ์•„์ฃผ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ์ง€ ์•Š๊ณ  ์šฐ์•„ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ data-uri() ํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด์„ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ํฌํ•จํ•˜๋Š” Quoted ํŠธ๋ฆฌ ๋…ธ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ ์œ„์น˜์— ๋Œ€ํ•œ URL๋กœ ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค. data-uri ํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•˜์—ฌ ์‹ค์ œ URL์„ ๋ณด์œ ํ•œ Url ํŠธ๋ฆฌ ๋…ธ๋“œ๋„ ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด URL์ด url() CSS ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋œ ์œ„์น˜์— ๋Œ€ํ•ด ์ •๊ทœํ™”๋˜์–ด์•ผํ•˜๋ฉฐ ๋” ์ด์ƒ data-uri() Less ํ•จ์ˆ˜์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ •๊ทœํ™”๋˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ

// app/content/button.less
button {
  .background(url("images/btn.jpg"));
}

๋ฟก๋ฟก

๋‚˜์—๊ฒŒ๋Š” ์ˆ˜์ •์ด ์•„๋‹Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋ฐ˜๋ณต์—์„œ ๊ทธ๋“ค์€ url ๋ฅผ ๋ฏน์Šค ์ธ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ํ”ผํ•˜๋ ค๊ณ  _ ํ•  ๊ฒƒ์ด๋ฉฐ _ ๋ฌธ์ œ๊ฐ€ ๋‹ค์‹œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š”์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์›๋ž˜ ์‚ฌ์šฉ ์‚ฌ๋ก€ (# โ€‹โ€‹2541)๋ฅผ ์ทจํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

// mixins.less
.background(@image) {
    background-image: data-uri("@{image}.jpg");
}
// app/content/button.less
button {
  .background("images/btn");
}

(์˜ˆ๋ฅผ ๋“ค์–ด ๊ธ€๊ผด-ํŽ˜์ด์Šค ๋ฏน์Šค ์ธ์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์—ฌ๋Ÿฌ woff , ttf , eot , eot?#iefix ๋“ฑ์ด ๊ฐ™์€ ํŒŒ์ผ ์ด๋ฆ„์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ). ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์ด์ „ url ๋„ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@ seven-phases-max

๊ทธ๋ ‡๋‹ค๋ฉด ์ ์ ˆํ•œ ํ•ด๊ฒฐ ๊ธฐ๊ฐ„์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒ๋Œ€ URL์ด ํ•ด์„๋˜์–ด์•ผํ•˜๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. data-uri() ํ•จ์ˆ˜์— ๋“ค์–ด๊ฐ€๋Š” ๋ฌธ์ž์—ด ๊ฐ’์„ ์ •์˜ํ•œ ํŒŒ์ผ์˜ ํŒŒ์ผ ์ •๋ณด์—์„œ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ ์˜ค๊ฑฐ๋‚˜ url() ํ•จ์ˆ˜์™€ Url ํŠธ๋ฆฌ ๋…ธ๋“œ.

๊ฒฝ๋กœ ๋ณ€์ˆ˜ ๋Œ€์ฒด๋ฅผ ์ง€์›ํ•˜๋ ค๋ฉด ๊ฒฝ๋กœ์˜ ๋‹ค์–‘ํ•œ ๋ถ€๋ถ„์„ ์ •๊ทœํ™”ํ•ด์•ผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํŒŒ์•…ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์ด ๋น ๋ฅด๊ฒŒ ๊นŒ๋‹ค๋กœ์›Œ์ง‘๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์–ด๋–ป๊ฒŒ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๊นŒ?

// mixins.less
.background(@image) {
    background-image: data-uri("../../@{image}.jpg");
}
// app/content/button.less
button {
  .background("../images/btn");
}

์ƒ๋Œ€ URL ํ™•์ธ๊ณผ์ด ๋‘ ๊ฒฝ๋กœ์˜ ํ† ํฐ ๋Œ€์ฒด ๊ธฐ๋ฐ˜ ์กฐํ•ฉ์„ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

ํ•œ ๊ฐ€์ง€ ์˜ต์…˜์€ ๋Œ€์ฒด์ž ํ† ํฐ์ด url() ๋˜๋Š” data-uri() ๋กœ ๋“ค์–ด๊ฐ€๋Š” ์ตœ์ข… URL ๊ฐ’์˜ ๋จธ๋ฆฌ์—์žˆ์„ ๋•Œ ๋Œ€์ฒด์ž ํ† ํฐ์œผ๋กœ ๋Œ€์ฒด๋˜๋Š” ๋ฌธ์ž์—ด์„ ์ •์˜ํ•˜๋Š” ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ๋งŒ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์€ ๊ฒฝ๋กœ๋ฅผ ๊ฒฐํ•ฉํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ / ์ œ๊ฑฐ / ํŽธ์ง‘ํ•˜๋Š” ์ผ๋ถ€ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๊ณ  ( unit() ํ•จ์ˆ˜๊ฐ€ ์ฐจ์›์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๊นŒ?) ์ƒํ™ฉ์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ

// mixins.less
.background(@image) {
    background-image: data-uri(extension(<strong i="21">@image</strong>, "jpg"));
}
// app/content/button.less
button {
  .background(url("./images/btn"));
}

์ฒซ ๋ฒˆ์งธ ์˜ˆ์—์„œ๋Š” ํŠน๋ณ„ํ•œ ์ •๊ทœํ™”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "../../@{image}.jpg" ๋Š” ์ž‘์„ฑ๋œ๋Œ€๋กœ "../../../images/btn.jpg" ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค (๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฒฝ๋กœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ตœ๋Œ€ data-uri ๋ฉ๋‹ˆ๋‹ค).
๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ฒˆ์งธ ์˜ˆ๋Š” ๋‹จ์ง€ ... ํ•จ์ˆ˜๋ฅผ ์Œ“์•„์„œ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜๋ฅผ ์Œ“๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ... ์ •ํ™•ํžˆ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ํŒŒ์ผ์— ์ •์˜ ๋œ ๋ฏน์Šค ์ธ์„ ํ˜ธ์ถœ ํ•  ๋•Œ _ ์ž˜๋ชป๋œ _ ํŒŒ์ผ ๊ฒฝ๋กœ?

์–ด์จŒ๋“  .background(url("images/btn.jpg")); ์™€ ํ•จ๊ป˜ "์˜ˆ์ƒ๋Œ€๋กœ"_only_ ์ž‘๋™ํ•ด์•ผํ•œ๋‹ค๋ฉด, ๋ณ€๊ฒฝ์—†์ด ์ง์ ‘ .background(data-uri("images/btn.jpg")); ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”? :)


์ฆ‰, ์ด๊ฒƒ์ด ๊ณ ์ณ์ง„๋‹ค๋ฉด ๊ทธ๊ฒƒ์ด ์•„๋ฌด๋ฆฌ ๊นจ์ ธ๋„ data-uri ๋กœ ๊ณ ์ • ๋œ ํ•ดํ˜‘์ด๋˜์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์†”์งํžˆ ๋” ๋‚˜์€ ์ „๋žต์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค : a. ์ด์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ๋ณด๊ณ ์„œ / ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ (์ถฉ๋ถ„ํ•œ ๊ฒฝ์šฐ) ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ b. ๊ฐ€๋Šฅํ•œ ์ค‘๋‹จ ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋” ์ผ์ฐ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค).



์ฆ‰, url ๋ฐ data-uri ๊ฐ€ ์ฒ˜์Œ์— ์ƒํ˜ธ ๊ตํ™˜ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค (์ฆ‰, data-uri ๋Š” url ์˜ ํŠน์ˆ˜ ๋ฒ„์ „ ์ผ ๋ฟ์ด๋ฉฐ CSS url ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค ulr "์ด๋ ‡๊ฒŒ"(๊ฐ™์€ ์˜ต์…˜ ํฌํ•จ) ๋™์ž‘ํ•˜๋Š” ๋ฐ˜๋ฉด data-uri ๊ฐ€ "๊ทธ๋ ‡๊ฒŒ"( ์ด์™€ ๊ฐ™์€ ์˜ต์…˜), ํŠน์ • ๋™์ž‘์„ ์–ป์œผ๋ ค๋ฉด data-uri(url()) ์ฝค๋ณด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฏน์Šค ์ธ ๋‚ด์—์„œ " data-uri ์ œํ•œ๋˜๊ณ  url _out_๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค --relative-urls: on "<-Bhrrrr ... :)

๋‚˜์—๊ฒŒ๋Š” ์ˆ˜์ •์ด ์•„๋‹Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋ฐ˜๋ณต์—์„œ ๊ทธ๋“ค์€ url์„ mixin์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ํ”ผํ•˜๋ ค๊ณ  ์‹œ๋„ ํ•  ๊ฒƒ์ด๋ฉฐ ๋ฌธ์ œ๊ฐ€ ๋‹ค์‹œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋„ค ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” v3 ๋ฆด๋ฆฌ์Šค๋ฅผ ์œ„ํ•ด ๋” ์ ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด๊ณ  ์ด๊ฒƒ์„ ๊ณ ์น˜๊ธฐ ์œ„ํ•ด ์ฒœ์ฒœํžˆ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

์•„๋งˆ๋„ resolve() ํ•จ์ˆ˜๋Š” ํ•ด๊ฒฐ ๋œ URL์„ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์™„์ „ํ•œ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹ˆ๊ณ  ์ด๊ฒƒ์ด ์ˆ˜์ •๋˜์—ˆ์„ ๋•Œ ์™„์ „ํ•œ ๊ฒฝ๋กœ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ ...)

๋นจ๋ฆฌ ์ƒ๊ฐ์„ ์ ์–ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฐ„๋‹จํ•œ ๋ฉ”๋ชจ ์ผ ๋ฟ์ด์ง€ ๋งŒ ๋ณ€์ˆ˜ ๋ณด๊ฐ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ ์˜ค๊ธฐ์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ๋ณด๊ฐ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ ์˜ค๊ธฐ.

๊ทธ๊ฒƒ์€ ํฅ๋ฏธ๋กญ๊ณ  ๋ถˆ์•ˆํ•ฉ๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ ์ง€์›๋˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์šฐ์—ฐ์˜ ์ผ์น˜์ž…๋‹ˆ๊นŒ?

@rjgotten ์ง€์›๋˜์ง€๋งŒ ์ง€์›์ด ๋‹ค์†Œ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. # 410์—์„œ ์ถ”์ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค :

<strong i="8">@variable</strong>: "path.less";
<strong i="9">@import</strong> "@{variable}";

์ด๊ฒƒ์€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค :

.mixin(@variable) {
  <strong i="13">@import</strong> "@{variable}";
}

ํŽธ์ง‘ : ๋งํฌ๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฏน์Šค ์ธ์—์„œ @import ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•˜๊ณ  ์‹ถ์€์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ „์ฒด ๋ณ€์ˆ˜ ๊ฐ€์ ธ ์˜ค๊ธฐ๋Š” ์•ฝ๊ฐ„์˜ ๋งˆ์ˆ ์ด๊ณ  ๋ฐ˜ ์ง๊ด€์  ์ธ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ๊ทธ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋งŽ์€ ๋…ผ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? data-uri๊ฐ€ ์ฒ˜๋ฆฌ์ค‘์ธ ํŒŒ์ผ์— ์ƒ๋Œ€์ ์ด์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ง€๊ธˆ์€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์—์„œ _a reference_๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ํŒŒ์ผ์ด ์žˆ์œผ๋ฉฐ ์—ฌ์ „ํžˆ data-uri์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ๊ทธ๊ฒƒ์€ ๋ฒ„๊ทธ ์ผ ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์ฐธ์กฐ๋กœ ๊ฐ€์ ธ ์˜ค๋ฉด ํ˜„์žฌ ํŒŒ์ผ๊ณผ ๊ด€๋ จ๋œ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ์“ฐ์ง€ ์•Š์•„์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@Ciantic

์ฐธ์กฐ๋กœ ๊ฐ€์ ธ ์˜ค๋ฉด ํ˜„์žฌ ํŒŒ์ผ๊ณผ ๊ด€๋ จ๋œ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ์“ฐ์ง€ ์•Š์•„์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ •ํ™•ํžˆ ๋ฌด์—‡์„ ๋ฐ”ํƒ•์œผ๋กœ? reference ์™€ ๋ฌด์Šจ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ง€๊ธˆ์€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์—์„œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ํŒŒ์ผ์ด ์žˆ์œผ๋ฉฐ ์—ฌ์ „ํžˆ data-uri์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๋ฌธ์ œ์™€ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? (์˜ˆ : ๊ฐ€์ ธ ์˜ค๊ธฐ, ๊ฐ€์ ธ ์˜ค๊ธฐ ๋ฐ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ ๋“ฑ).

styles.less

.something {
    background: data-uri("some.svg");
}

sub / test.less

<strong i="11">@import</strong> (reference) "../style.less";
.test {
    color: green;
}

style.less๋ฅผ ์ปดํŒŒ์ผํ•˜์ง€๋งŒ test.less์— ์ƒ๋Œ€์ ์ธ data-uri๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— test.less๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์ฐธ์กฐ ๊ฐ€์ ธ ์˜ค๊ธฐ๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ์ด์œ ๋Š” ๋‚ด ์˜๊ฒฌ์œผ๋กœ๋Š” ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

data-uri๊ฐ€ ์˜ต์…˜์˜ URL ์žฌ ์ž‘์„ฑ ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  .... ๊ทธ๊ฒƒ์ด data-uri์—์„œ ์‹ค์ œ๋กœ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ๋งํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ data-uri๋Š” ".less ํŒŒ์ผ ํ˜ธ์ถœ"์„ ๊ธฐ์ค€์œผ๋กœ ํ™•์ธ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฏน์Šค ์ธ์˜ ๊ฒฝ์šฐ ๋ฏน์Šค ์ธ ์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฏน์Šค ์ธ์ด ํ˜ธ์ถœ ๋œ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ™•์ธ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฏน์Šค ์ธ์€ ์ด๋Ÿฌํ•œ ์ง„์ˆ ์„ "ํ˜ผํ•ฉ"ํ•œ ๋‹ค์Œ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ @lukeapage ๊ท€ํ•˜์˜ ํ•ด์„์ด ์ •ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

// app/content/button.less
button {
  .background("images/btn.jpg");
}

app/content/images/ ์—์„œ btn.jpg๋ฅผ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฏน์Šค ์ธ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด "๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€"๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฒ„๊ทธ ์ˆ˜์ •์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰ ... ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ฐœ์‹ ์ž์™€ ๊ด€๋ จํ•˜์—ฌ ํ•ด๊ฒฐ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฏน์Šค ์ธ๊ณผ ๊ด€๋ จํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

Node.js๋Š” ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ์ˆœ์„œ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์œผ๋ฉด ๊ธฐ๋Œ€์น˜๋ฅผ ๊ด€๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์€ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ–‰๋™ # 2๋ฅผํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋ชจ๋“  ๊ฒฝ์šฐ๋Š” ์•„๋‹ˆ๋”๋ผ๋„ ๊ฑฐ์˜ ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ์—ฌ์ „ํžˆ ์ž‘๋™ ํ•  ๊ฒƒ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@ ๋งคํŠœ ๋”˜
์ผ๋ฐ˜์ ์œผ๋กœ data-uri๋Š” ".less ํŒŒ์ผ ํ˜ธ์ถœ"์„ ๊ธฐ์ค€์œผ๋กœ ํ™•์ธ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฏน์Šค ์ธ์˜ ๊ฒฝ์šฐ ๋ฏน์Šค ์ธ ์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฏน์Šค ์ธ์ด ํ˜ธ์ถœ ๋œ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ™•์ธ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฏน์Šค ์ธ์€ ์ด๋Ÿฌํ•œ ์ง„์ˆ ์„ "ํ˜ผํ•ฉ"ํ•œ ๋‹ค์Œ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋Œ€์ฒด ํ† ํฐ์ด ์ฑ„์›Œ์ง„ ์ผ๋ถ€ ์•Œ๋ ค์ง„ ๊ธฐ๋ณธ ํด๋”์— ๋Œ€ํ•ด ํ•ด๊ฒฐ๋˜์–ด์•ผํ•˜๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜ํ™” ๋œ URL, ์ฆ‰ ๋Œ€์ฒด ํ† ํฐ์ด์žˆ๋Š” URL์„ ์–ด๋–ป๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ? ์ด ๊ฒฝ์šฐ์—๋Š” ํ˜ธ์ถœ์ž์˜ ํŒŒ์ผ์ด ์•„๋‹Œ ์ˆ˜์‹ ์ž์˜ ํŒŒ์ผ์— ๋Œ€ํ•œ ์žฌ ๋“ฑ๋ก์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ฝœ ์‚ฌ์ดํŠธ์—์„œ url() ๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ด๊ฒƒ์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ๊นจ๋‹ฌ์Œ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. @ seven-phases-max๋Š” ๋‹น์—ฐํžˆ ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค (๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฒฐ๊ตญ _will_ ์‹œ๋„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. mixin ํ˜ธ์ถœ๋กœ ๋ฆฌํŒฉํ„ฐ๋งํ•˜๊ณ  ์ž‘์—…์„ ์ค‘๋‹จํ•˜์‹ญ์‹œ์˜ค) :

Quoted ๋ฆฌํ„ฐ๋Ÿด ๋…ธ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ํ•ด๋‹น ํŒŒ์ผ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ํ• ๋‹น, ๋ฏน์Šค ์ธ ํ˜ธ์ถœ ๋“ฑ์„ ํ†ตํ•ด ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ „ํŒŒํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž ํŒŒ์ผ์—์„œ ์ƒ์„ฑ ๋œ ๋ชจ๋“  Quoted ๊ฐ’์€ url() ๋˜๋Š” data-uri() ๋กœ ์ฒ˜๋ฆฌ ๋  ๋•Œ ํ•ด๋‹น ํ˜ธ์ถœ์ž ํŒŒ์ผ์— ๋Œ€ํ•ด ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. . ๊ทธ๋Ÿฌ๋‚˜ ๋ฏน์Šค ์ธ์˜ ๋‚ด๋ถ€ ๋กœ์ง์˜ ์ผ๋ถ€์ธ Quoted ๊ฐ’์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฏน์Šค ์ธ์˜ ๋กœ์ปฌ ํŒŒ์ผ์— ๋Œ€ํ•ด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋„๋ก ์œ ์ง€ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋Œ€์ฒด ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

// mixins.less
.background(@image) {
    background-image: data-uri("@{image}.jpg");
}
// app/content/button.less
button {
  .background("images/btn");
}

์ด๋ฅผ ๊ณ ์น  ์ˆ˜์žˆ๋Š” ํŠธ๋ฆญ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์ฒด ํ† ํฐ์„ ์ฑ„์šธ ๋•Œ ํ† ํฐ์ด ๋Œ€์ฒด ๋ฌธ์ž์—ด์˜ ๋งจ ์ฒ˜์Œ์— ์žˆ์œผ๋ฉด ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์€ ์ฑ„์›Œ์ง„ ํ† ํฐ์—์„œ ํŒŒ์ผ ์ •๋ณด๋ฅผ ์ƒ์†ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ฒด ๋ฌธ์ž์—ด์˜.

mixin ์ž์ฒด ์ž‘์„ฑ์ž์˜ ์˜๋„๊ฐ€ mixin ํŒŒ์ผ์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด "./@{image}.jpg" ๋ฅผ ํŒจํ„ด์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ „ํ™”๋ฅผ ๊ฑด ์‚ฌ๋žŒ์˜ ์ฑ…์ž„ ๋ถ€๋‹ด์„ ํšจ๊ณผ์ ์œผ๋กœ ์ด๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// _mixins.less
.sprite(@image) {
    background: data-uri("../images/sprites/@{image}.png") no-repeat;
}
// main.less
div {
   .sprite('logo');
}

์‚ฐ์ถœ:

div {
   background: url(data:image/png;base64,...) no-repeat;
}

์™€์šฐ, ์ด๊ฒƒ์€ ์•„์ฃผ ์˜ค๋ž˜๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค ....์ด ๋ฌธ์ œ๋Š” ์ €์—๊ฒŒ๋„ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

url ํ•จ์ˆ˜์— ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ URL์„ ์ ˆ๋Œ€์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ƒˆ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒํ•˜๋ฉด mixin์ด ์„ค์ •๋œ ์œ„์น˜์— ๊ด€๊ณ„์—†์ด ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์ž‘๋™ํ•˜๊ณ  ์‹ค์ˆ˜์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

url ํ•จ์ˆ˜์— ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ URL์„ ์ ˆ๋Œ€์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ƒˆ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒํ•˜๋ฉด mixin์ด ์„ค์ •๋œ ์œ„์น˜์— ๊ด€๊ณ„์—†์ด ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์ž‘๋™ํ•˜๊ณ  ์‹ค์ˆ˜์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ์ ˆ๋Œ€ ๊ฒฝ๋กœ์™€ ์ƒ๋Œ€ ๊ฒฝ๋กœ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ์ƒ๋Œ€ ๋Œ€ ์„ ์–ธ ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ์ƒ๋Œ€์˜€์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ „ํ–ˆ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ดˆ๊ธฐ ์ฃผ์„๊ณผ ์ œ๋ชฉ์€ ๋ฐ์ดํ„ฐ -uri๊ฐ€ ํ˜ธ์ถœ ๋œ ํŒŒ์ผ๊ณผ ๊ด€๋ จ๋œ ๊ฒฝ๋กœ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฉฐ, ๋‹ค๋ฅธ ๊ณณ์— ๋ฐฐ์น˜ ๋œ ๋ฏน์Šค ์ธ๊ณผ ๊ฒฐํ•ฉํ•˜๋ฉด ๊ฒฝ๋กœ๊ฐ€ ์ž˜๋ชป ํ•ด๊ฒฐ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ œ๊ฐ€ ๊ฒช๊ณ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์†”๋ฃจ์…˜์œผ๋กœ์„œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋Š” ์–ด๋””์— ์˜ํ–ฅ์„ ๋ฏธ์น ๊นŒ์š”?

data-uri๊ฐ€ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๋ฐ›์•„๋“ค์ด๊ณ  ์‹ ๊ด€์ ์ธ absolute-url ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๋Š” ๋ฏน์Šค ์ธ ์œ„์น˜์— ๊ด€๊ณ„์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

// mixins.less
.background(@image) {
    background-image: data-uri(@image);
}
// app/content/button.less
button {
  .background(absolute-url("images/btn.jpg"));
}

@ miljan-aleksic "์ ˆ๋Œ€"๋ž€ data-uri ์œ„์น˜์—์žˆ๋Š” ํŒŒ์ผ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด "์ ˆ๋Œ€์ "์€ ์•„๋งˆ๋„ ์ž˜๋ชป๋œ ์šฉ์–ด ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

URL์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์  ๋ž˜ํผ์ฒ˜๋Ÿผ ๋ชจ๋“  URL์„ ํŒŒ์ผ ์ƒ๋Œ€๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋˜๋Š” url ()์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค.

@ matthew-dean, ์ ˆ๋Œ€์ ์œผ๋กœ ํŒŒ์ผ์˜ ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ : /users/myuser/projects/lessproject/icon.svg .

url ()์ด ubication์„ ์•Œ์ง€ ๋ชปํ•˜๊ณ  data-uri ์œ„์น˜ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ‘๊ทผ ๋ฐฉ์‹์„ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

URL์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์  ๋ž˜ํผ์ฒ˜๋Ÿผ ๋ชจ๋“  URL์„ ํŒŒ์ผ ์ƒ๋Œ€๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋˜๋Š” url ()์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ถฉ๋ถ„ํžˆ ์žฌ๋ฏธ์žˆ๊ฒŒ; ์ด๊ฒƒ์ด ์ œ๊ฐ€ ๋ช‡ ๋…„ ์ „์— ์ œ์•ˆํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ;-)

์ ˆ๋Œ€์ ์œผ๋กœ ํŒŒ์ผ์˜ ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ : /users/myuser/projects/lessproject/icon.svg.

์ด absolute-url ํ•จ์ˆ˜๋Š” absolute-url ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋œ ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹๊ธฐ๋ฐ˜์œผ๋กœ ์ „์ฒด ์ถœ๋ ฅ ๊ฒฝ๋กœ์— ์ „๋‹ฌ ๋œ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ _pre-resolves_ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ๋œ ์ถœ๋ ฅ CSS ํŒŒ์ผ์ด ์ด๋™ํ•  ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๋‘˜ ๋‹ค ๊ฐ™์€ ๋œป์ž…๋‹ˆ๋‹ค. ๊ทธ ๋‹น์‹œ ๋‚˜์ฒ˜๋Ÿผ.

์ปดํŒŒ์ผ ๋œ ์ถœ๋ ฅ CSS ํŒŒ์ผ์ด ์ด๋™ํ•  ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ absolute-url ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹๊ธฐ์ค€์œผ๋กœ ์ „์ฒด ์ถœ๋ ฅ ๊ฒฝ๋กœ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

์—์„œ์™€ ๊ฐ™์ด ์žฌ ์ž‘์„ฑ URL ๋˜๋Š” ๋ฃจํŠธ ๊ฒฝ๋กœ๋Š” ์—ฌ์ „ํžˆ ์ ์šฉ๋˜์ง€๋งŒ ์ •์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹๊ธฐ๋ฐ˜์œผ๋กœํ•ฉ๋‹ˆ๊นŒ? ์ด๋Š” ์ถœ๋ ฅ๊ณผ ๊ด€๋ จ๋œ URL์ด ์•„๋‹ˆ๋ผ _ โ€‹โ€‹์ปดํŒŒ์ผ ์ค‘ _ URL์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” @lukeapage ์˜ ์›๋ž˜ ์˜ˆ์ œ์™€๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ : data-uri() ์œ„์น˜.

๋”ฐ๋ผ์„œ์ด ๋ฌธ์ œ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์œ ์‚ฌํ•˜์ง€๋งŒ ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ฒŒ์‹œํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ ํ•˜๊ธฐ๊ฐ€ ์•ฝ๊ฐ„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ƒ๋Œ€ _source_๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์ƒ๋Œ€ _output_์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ํ›จ์”ฌ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ ์ง€์ • ๋…ผ๋ฆฌ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ data-uri๊ฐ€ ์ถœ๋ ฅ์œผ๋กœ ์–ด๋–ค ๊ฒฝ๋กœ๋„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๋ถ„๋ช…ํžˆํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

resolve() ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ• ๊นŒ์š”? ๋ชฐ๋ผ์š”, ๊ทธ๋ƒฅ ๋ฑ‰์–ด ๋‚ด์ง€ ๋งŒ url(resolve(file(), "my/path")) ? @ miljan-aleksic์ด absolute() ์—์„œ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ์ ˆ๋Œ€ URL๋กœ ํ•ด์„๋œ๋‹ค๋Š” ์ ์—์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ์ž…๋ ฅ์„ ๋ฐ›์•„์•ผํ•ฉ๋‹ˆ๋‹ค (์˜ˆ file() , ํ•ด๊ฒฐํ•˜๋ ค๋ฉด). ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด file-resolve() ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ํ•ด๋‹น ๋…ผ๋ฆฌ๋ฅผ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ resolve() ๋ฐ file() ๋ฅผ ๋‘ ๊ฐœ์˜ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐœ๋ณ„์ ์œผ๋กœ ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ๊นŒ๋‹ค๋กœ์šด ๋ถ€๋ถ„์€ ๋ชจ๋“  ์žฌ ์ž‘์„ฑ URL ์˜ต์…˜์ด๋ฉฐ, ๊ทธ ์ค‘ ์ด์ œ ๋ชจ๋“ˆ ์ง€์›์„ ์ถ”๊ฐ€ ํ•œ PR ๋ณ‘ํ•ฉ์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. (https://github.com/less/less.js/pull/3248). ๊ทธ๋ ‡๋‹ค๋ฉด ํŒŒ์ผ ์ƒ๋Œ€ URL์„ ๋ฐ˜ํ™˜ํ•ด๋„ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋ช…ํ™•ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, resolve () ๋ฐ file ()์€ ๋‚ด๊ฐ€ ์„ค๋ช…ํ•˜๋ ค๋Š” ๋‚ด์šฉ์„ ์ •ํ™•ํžˆ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ์ด๊ฒƒ์ด ๊ตฌํ˜„ ๋  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@ miljan-aleksic ์ข‹์•„์š”, ๊ทธ๋Ÿผ ๋ง์ด ๋˜๋„ค์š”.

์‚ฌ์‹ค, file() ๋Š” ์˜ณ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ํŒŒ์ผ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ dir() ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ํŒŒ์ผ ๋‹น ๋ณ€์ˆ˜ ์ƒ์ˆ˜ ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

๋Š” ์–ด๋•Œ:

data-uri(resolve(<strong i="10">@DIR</strong>, "my/path"))

๋”ฐ๋ผ์„œ ๋‘ ๊ฐ€์ง€๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 1) ๊ฒฝ๋กœ๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” resolve () ํ•จ์ˆ˜, 2) ํ‰๊ฐ€ํ•˜๋Š” ๋™์•ˆ ๊ฐ ํŒŒ์ผ์— ์‚ฝ์ž… ๋œ @DIR (๋ฐ @FILE ?) ์ƒ์ˆ˜. ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์œ ์ผํ•œ ๊นŒ๋‹ค๋กœ์šด ์ ์€ ์ฃผ์ž… ๋œ ๋ณ€์ˆ˜๊ฐ€ ๋ฃจํŠธ์˜ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•˜๊ฑฐ๋‚˜ ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด @arguments ์ฒ˜๋Ÿผ ์†Œ๋ฌธ์ž ์—ฌ์•ผํ•ฉ๋‹ˆ๊นŒ? ์ด ๊ฒฝ์šฐ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด @directory ๋ฐ @filename ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ ์€ ์˜ต์…˜์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

resolve() ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ• ๊นŒ์š”?

^ ๋น™๊ณ . ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ ์€ ์˜ต์…˜์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Node.js-y ์˜ต์…˜์„ ์„ ํƒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค : __dirname
๊ทธ๊ฒƒ์€ ์˜ค๋žซ๋™์•ˆ ์ฃผ๋ณ€์— ์žˆ์—ˆ๊ณ  ์ž˜ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. Less์—์„œ ๋™์ผํ•œ ๊ฐœ๋…์— ๋™์ผํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Node.js-y ์˜ต์…˜์„ ์„ ํƒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค : __dirname

Err ... Less / CSS ํ‚ค์›Œ๋“œ ๋‚˜ Less ๋ณ€์ˆ˜ ๋˜๋Š” ํ•จ์ˆ˜ ์˜๋ฏธ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋ณด๋‹ค ๋” ์ž˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. @__dirname ์•„๋งˆ๋„ ์–ธ์–ด์— ๋Œ€ํ•ด์„œ๋Š” ๋ฐ‘์ค„์ด ์•ฝ๊ฐ„ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ์ „ํ˜€ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ‘์ค„์€ ์–ธ์–ด์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ์•ฝ๊ฐ„ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ์ „ํ˜€ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์ค‘ ๋ฐ‘์ค„์€ ๋งŽ์€ ์–ธ์–ด์—์„œ '์‹œ์Šคํ…œ์ด ์ œ๊ณตํ•˜๋Š” ๊ฒƒ'์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ํŠนํžˆ ๋‚ด์žฌ ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์— ํŠนํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์น˜๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒƒ์ด ์ผ์ข…์˜ ์š”์ ์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ก ์ด์•ผ; ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด @dirname ๋˜๋Š” @dir-name ์™€ ๊ฐ™์€ ํŒŒ์ƒ ์ƒํ’ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ข€ ๋” ์ƒ๊ฐํ•ด ๋ณด๋ฉด ์™œ ์šฐ๋ฆฌ๋Š” ๋ณ€์ˆ˜๋กœ ๋…ธ์ถœ ๋œ ํ˜„์žฌ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ _ ํ•„์š”๋กœ ํ•˜๋Š”๊ฐ€? ๊ฐœ๋…์ ์ธ resolve() ํ•จ์ˆ˜ ์ž์ฒด์— ํ†ตํ•ฉ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

๊ฐœ๋…์  resolve () ํ•จ์ˆ˜ ์ž์ฒด์— ํ†ตํ•ฉ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์ œ ์ œ์•ˆ์œผ๋กœ ๋Œ์•„ ์™”์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ๊ฒƒ์„ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๊ณ  resolve ()๋งŒํผ ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์ œ ์ œ์•ˆ์œผ๋กœ ๋Œ์•„ ์™”์Šต๋‹ˆ๋‹ค.

์ผ์ข…์˜.

๋‚ด๊ฐ€ ์–ป๋Š” ๊ฒƒ์€ resolve() ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ๋ณด์œ ํ•˜๋Š” ํŒŒ์ผ์˜ URL / ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์œ„์น˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•ด _known_์ด์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ๋‚ด this ๋Š” currentFileInfo ์†์„ฑ์ด์žˆ๋Š” FunctionCaller ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
ํ•ด๋‹น ์†์„ฑ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ํ•ด๋‹นํ•˜๋Š” Call AST ๋…ธ๋“œ์˜ ํŒŒ์ผ ์ •๋ณด๋กœ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
์ฆ‰

https://github.com/less/less.js/blob/4e903e8254cc20fec80fccd35794fb797949e653/lib/less/tree/call.js#L47

์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฝ๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ ํŒŒ์ผ ์ •๋ณด๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ํ‰๊ฐ€๋˜๋Š” ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด _declared_ ์ธ ์œ„์น˜์˜ ํŒŒ์ผ ์ •๋ณด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, 'eager'URL ๋ฆฌ์กธ๋ฒ„๋ฅผ ์œ„ํ•ด์ด ํŒŒ์ผ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ๊ฐ€์ ธ ์™€์„œ ํ‰๊ฐ€๋˜๋Š” ๋ฏน์Šค ์ธ ๋‚ด๋ถ€์— ๋ฐฐ์น˜ ๋˜๋”๋ผ๋„ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ : ๋ฏน์Šค ์ธ์ด ์ •์˜ ๋œ ํŒŒ์ผ์— ๊ณ ์ • ๋œ ํ•ด์ƒ๋„๋กœ.

๊ทธ๋Ÿฌ๋‚˜ ์ด์— ๋Œ€ํ•ด ์ข€ ๋” ์ƒ๊ฐํ•ด ๋ณด๋ฉด ์™œ ํ˜„์žฌ ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ๋ณ€์ˆ˜๋กœ ๋…ธ์ถœ๋˜์–ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๊ฐœ๋…์  resolve () ํ•จ์ˆ˜ ์ž์ฒด์— ํ†ตํ•ฉ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

์•„๋ฌด๋„ ํ˜„์žฌ ํŒŒ์ผ์ด๋‚˜ ์ผ๋ฐ˜ ๋ฆฌ์กธ๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ํ™•์‹ ํ•˜๋Š” ๊ฒฝ์šฐ ... ์•„๋งˆ๋„ ... ๋ช…์‹œ ์  ๋กœ์ปฌ var๊ฐ€ ์ผ๋ฐ˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ ํ•จ์ˆ˜๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‰๊ฐ€๋˜์ง€ ์•Š์Œ์„ ๋ถ„๋ช…ํžˆํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ธฐ๋Šฅ. ๊ทธ๊ฒƒ์ด ๋‚˜์˜ ์ง„์ •ํ•œ ๊ด€์‹ฌ์‚ฌ์ด๋ฉฐ ์˜๋ฏธ๋ก ์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์— ์ƒ๊ด€์—†์ด "ํ˜„์žฌ ํŒŒ์ผ"์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ "๋งˆ์ปค"๊ฐ€ ์—†๋‹ค๋ฉด ์ž…๋ ฅ์— ๋”ฐ๋ผ ๋™์ผํ•˜๊ฒŒ ํ•ด๊ฒฐ๋˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜์™€๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ฆ‰, ๋ณด์ด์ง€ ์•Š๋Š” ์ž…๋ ฅ์— ๋”ฐ๋ผ ํ•ด๊ฒฐ๋˜๋Š” ๊ธฐ๋Šฅ์ด๋ฉฐ ์ €์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•จ์ˆ˜๊ฐ€ current-file-resolve() ๊ณผ ๊ฐ™์ด ๋งค์šฐ ๋ช…์‹œ ์ ์ด๋ผ๋ฉด ์ถฉ๋ถ„ํžˆ ๋ช…ํ™• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด mixin์ด ์ •์˜ ๋œ ํŒŒ์ผ ๋Œ€์‹  mixin ํ˜ธ์ถœ์ด ํ˜ธ์ถœ ๋œ ํŒŒ์ผ์— ๋”ฐ๋ผ specialfunction() ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•œ ์ด์œ ๋ฅผ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ˜ผ๋™ํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์•„๋‹ˆ์š”, ๋กœ์ปฌ ๋ณ€์ˆ˜๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ _needed_๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ์˜๋ฏธ / ์ถœ๋ ฅ / ๋™์ž‘์€ ์˜๋ฏธ์—์„œ ๋ช…ํ™•ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ  ...

ํ™•์ธ. ๊ทธ๋Ÿฐ ๋‹ค์Œ resolve-url(url, [base]) ํ•จ์ˆ˜-์˜ต์…˜ ์ธ base ๊ฐ€์žˆ๋Š” ๊ฒƒ์€ ์–ด๋–ป this.fileInfo ๋งŒ ๊ฐ€์ ธ ์™€์„œ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” declared-dir() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” URL ํ™•์ธ๊ณผ ๊ด€๋ จ์ด์—†๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ „์ฒด ์–‘์‹ ํ˜ธ์ถœ (์•”์‹œ ์  ๊ธฐ๋ฐ˜ ์—†์Œ)์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

resolve-url("../foo", declared-dir())

... ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ƒฅํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

resolve-url("../foo")

... ์ด๋Š” ๊ฒŒ์œผ๋ฅธ ์‚ฌ๋žŒ์— ํ•ด๋‹นํ•˜๋Š” ์—ด๋ง์ž…๋‹ˆ๋‹ค.

url("../foo")

๊ทธ๋Ÿฐ ์‹์œผ๋กœ '์ž๋™'์ฃผ์ž… ๋œ ๋ณ€์ˆ˜๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆœ์ „ํžˆ ์ผ๋ จ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌํ˜„ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”๋กœํ•˜๋Š” ์œ ์ผํ•œ ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ URL์„ '์ด๋ฏธ ํ•ด๊ฒฐ๋จ'์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ resolve-url ํ•จ์ˆ˜์—์„œ ๋‚˜์˜ค๋Š” URL์—์„œ ๊ธฐ๋ณธ ํ™•์ธ์ž ๋…ผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ์ฐจ๋‹จํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์˜๋ฏธ๋ก ์€ ๊ณผ์ • ๋ฌธ์„œ์—์„œ ๋ช…ํ™•ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฌธ์„œ๋Š” url ์™€ resolve-url ๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ๋น„๊ตํ•˜์—ฌ ์—ด๋งํ•˜๊ณ  ๊ฒŒ์œผ๋ฅธ ํ‰๊ฐ€ / ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜จ ํŒŒ์ผ์˜ ๋ฒ”์œ„๊ฐ€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— "์ฃผ์ž… ๋œ ๋ณ€์ˆ˜"์•„์ด๋””์–ด๊ฐ€ ์–ด์จŒ๋“  ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ (์ถ”๊ฐ€ ํ•ดํ‚น์—†์ด).

<strong i="7">@__dir</strong>: "whatever";
// *everywhere* it's the only <strong i="8">@__dir</strong> value = the path of "c"
<strong i="9">@import</strong> "a";
<strong i="10">@import</strong> "b";
<strong i="11">@import</strong> "c";

ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์— ๋Œ€ํ•ด ๋งํ•˜์ž๋ฉด, this.context.? ๋˜๋Š” this.context.frames[?] ์–ด๋”˜๊ฐ€์—์„œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์—ฌ์ „ํžˆ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (ํ™•์‹  ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค). ์ •๋„.

์Œ, ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†๋‚˜์š”?

์•ˆ๋…•ํ•˜์„ธ์š”.
์Œ, ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†๋‚˜์š”?

๊ฒŒ์œผ๋ฅธ ํ‰๊ฐ€๋กœ ์ธํ•ด ์ œ๋Œ€๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.


@ seven-phases-max
ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์— ๋Œ€ํ•ด ๋งํ•˜์ž๋ฉด, this.context.? ๋˜๋Š” this.context.frames[?] ์–ด๋”˜๊ฐ€์—์„œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์—ฌ์ „ํžˆ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (ํ™•์‹  ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค). ์ •๋„.

๊ณ„์ธต ๊ตฌ์กฐ์—์„œ Call ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰