ํ๋จ๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์์ต๋๋ค.
@root-name: business-bundle
/* other file */
.@{root-name} .wrapper{
/* css... */
}
์นํฉ์ด 3.12.2 ๋ฏธ๋ง์ ์ฌ์ฉํ๋ฉด ๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ฌ๋ 3.13.0์ ์ฌ์ฉํ๋ฉด webpack ๋น๋ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
@TopGrd ๊ทธ๊ฒ์ ๊ณ์ ์งํํ๊ธฐ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ํนํ Less๊ฐ ์ ์งํ์ง ์๋ ํจํค์ง์ ์ค๋ฅ ์ธ ๊ฒฝ์ฐ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ์ต์ํ์ ํ
์คํธ ์ผ์ด์ค๋ก ํ
์คํธ ์ ์ฅ์๋ฅผ ๋ง๋ค ์ ์์ต๋๊น? ๋ํ Less ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ธฐ ์ํด lessc
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๊น?
v3.13.0-3.12.2์์๋ ๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ด๊ฒ์ ๊ฑฐ๋ํ ํ๋ก์ ํธ์ด๋ฏ๋ก ์ ์ ํ์ผ์์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ ๊ณณ์ ์ฐพ๊ธฐ๊ฐ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
ํธ์ ๋ด์ ๊ฐ๊ธฐ
๋๋ ์ฌ๊ธฐ์ ๋ฌด์์ ๊ธฐ๋ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฌํ ๊ฐ๋ฅํ ์๊ฐ์๊ณ Less ์์ฒด์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฒฝ์ฐ ํด๊ฒฐ์ฑ ์ ํฌ๋ง์ด ์์ต๋๋ค. ๋๊ตฐ๊ฐ ํด๋น ์ค๋ฅ์ ์ค๋จ ์ ์ ์ค์ ํ๊ณ ์์ ํ ์ ํ๊ธฐ๊ฐ ๋ฌด์์ด๊ณ ์ ๋ํ๋์ง ์๋์ง ํ์ธํด์ผํฉ๋๋ค.
ํ
๋จ์,์ด Less ์ฝ๋๋ ์ ํจํ์ง ์์ต๋๋ค.
@root-name: business-bundle
/* other file */
.@{root-name} .wrapper{
/* css... */
}
@root-name: business-bundle
์ ์ธ๋ฏธ์ฝ๋ก ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ค๋ฅ๋ฅผ ์์ํ๊ณ ์ค๋ฅ๋ฅผ ์ฐพ์ง ๋ชปํ๊ณ Less์ ์ถ๋ ฅ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ค๊ณ ์๋ํ์ง๋ง์ด "๋๋ฝ ๋ ์ ํ๊ธฐ"์ค๋ฅ๋ก ์คํจํ๋ Less ์์ ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ณ์ธตํ๋์ด์์ ์ ์์ต๋๋ค. ๋ณผ ์ ์ฅ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ถ์ธก ์ผ๋ฟ์
๋๋ค.
3.13.0์์ ๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. (์์ง๋ ์ต์ํ์ ์ฌ์์ฐ์ ์ฐพ์ผ๋ ค๊ณ ํฉ๋๋ค.)
๊ด๋ จ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// button.less
<strong i="7">@import</strong> "./lib.less";
.@{prefix}-button {
color: red;
&:hover {
color: blue;
}
}
// lib.less
<strong i="10">@import</strong> "./vars"; // where <strong i="11">@prefix</strong> is defined
๋ค์๊ณผ ๊ฐ์ด ์ปดํ์ผ๋ฉ๋๋ค.
{
color: red;
}
:hover {
color: blue;
}
์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์ด ์ด์ํฉ๋๋ค.
@ matthew-dean ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋งค์ฐ ๊ฑฐ๋ํ ํ๋ก์ ํธ์ ๋๋ค. ๋ฐ๋ชจ์์ ์ฌํํ๋ ค๊ณ ํฉ๋๋ค
๋ฟก๋ฟก
๋จ์,์ด Less ์ฝ๋๋ ์ ํจํ์ง ์์ต๋๋ค.
@root-name: business-bundle /* other file */ .@{root-name} .wrapper{ /* css... */ }
@root-name: business-bundle
์ ์ธ๋ฏธ์ฝ๋ก ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ค๋ฅ๋ฅผ ์์ํ๊ณ ์ค๋ฅ๋ฅผ ์ฐพ์ง ๋ชปํ๊ณ Less์ ์ถ๋ ฅ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ค๊ณ ์๋ํ์ง๋ง์ด "๋๋ฝ ๋ ์ ํ๊ธฐ"์ค๋ฅ๋ก ์คํจํ๋ Less ์์ ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ณ์ธตํ๋์ด์์ ์ ์์ต๋๋ค. ๋ณผ ์ ์ฅ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ถ์ธก ์ผ๋ฟ์ ๋๋ค.
@ root-name : ๋น์ฆ๋์ค ๋ฒ๋ค; ์ฃ์กํฉ๋๋ค. ์ด๊ฒ์ ์ ์ฝ๋์ ๋๋ค. ์ธ๋ฏธ์ฝ๋ก ์ด ์์ต๋๋ค.
3.13.0์์ ๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. (์์ง๋ ์ต์ํ์ ์ฌ์์ฐ์ ์ฐพ์ผ๋ ค๊ณ ํฉ๋๋ค.)
๊ด๋ จ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// button.less <strong i="8">@import</strong> "./lib.less"; .@{prefix}-button { color: red; &:hover { color: blue; } }
// lib.less <strong i="11">@plugin</strong> "~some-less-plugin"; // where <strong i="12">@prefix</strong> is injected which preprocessing plugins
๋ค์๊ณผ ๊ฐ์ด ์ปดํ์ผ๋ฉ๋๋ค.
{ color: red; } :hover { color: blue; }
์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์ด ์ด์ํฉ๋๋ค.
style-resources-loader๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ถ ์ ์ญ ๋ณ์๋ ์ฝ์ ํฉ๋๋ค. ์๋ง๋ ๊ทธ๊ฒ๊ณผ ๊ด๋ จ์ด์๋ ๊ฒ์ผ๊น ์?
{
test: /\.less$/i,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
hmr: process.env.NODE_ENV === 'development',
reloadAll: true,
},
},
{
loader: 'css-loader',
},
{
loader: 'postcss-loader',
options: {
config: {
path: path.resolve(__dirname, '../postcss.config.js'),
},
},
},
{
loader: 'less-loader',
options: {
lessOptions: {
javascriptEnabled: true,
paths: [path.resolve(cwd, 'node_modules')],
},
},
},
{
loader: 'style-resources-loader',
options:{
patterns: path.resolve(
cwd,
'./node_modules/@somemodule/style/index.less',
),
injector: 'prepend',
},
},
],
},
๋ด ์ฝ๋ :
๋๋ฒ๊ฑฐ less.render
์ถ๋ ฅ : ์ ํ๊ธฐ ์์
@{bundle-root-class}
๋ณ์๋ settingBundle
์
๋๋ค. ์ฒซ ๋ฒ์งธ ์ค์ ๋ณ์๊ฐ ์ปดํ์ผ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ฌ์ ํ ๋จ์ํ ์ฌ์์ฐ์ ์ฐพ์ ์ ์์ต๋๋ค. ํซ ๋ชจ๋ ๊ต์ฒด๊ฐ ํธ๋ฆฌ๊ฑฐ๋๊ณ ๋ณ๊ฒฝ๋ ํ์ผ์ ์ปดํ์ผ ๋ ์ถ๋ ฅ์ด ์ฌ๋ฐ๋ฅธ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ ๋งค์ฐ ์ด์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌธ์ ๋ ์ ํ๊ธฐ ๋ณด๊ฐ์์๋ง ๋ฐ์ํฉ๋๋ค.
<strong i="6">@import</strong> "./lib.less";
.@{prefix}-button {
val: @prefix;
}
์ปดํ์ผ :
{
val: foo;
}
(๋ณด๊ฐ ๋ ๋ถ๋ถ๋ฟ๋ง ์๋๋ผ ์ ์ฒด ์ ํ๊ธฐ๊ฐ ์์ต๋๋ค.)
ํํ
๋ณ๊ฒฝ๋ ํ์ผ์ ์ปดํ์ผ ๋ ์ถ๋ ฅ์ด ์ฌ๋ฐ๋ฅธ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ๋ํด ์กฐ๊ธ ๋ ํ์ฅ ํ ์ ์์ต๋๊น? Less์์ ์ปดํ์ผ ๋ ์ถ๋ ฅ์ด ์ฌ๋ฐ๋ฅธ ๊ฒ ๊ฐ์ง๋ง ์ฌ๋ฐ๋ฅด๊ฒ ๋์ฒด๋์ง ์์ต๋๊น?
ํซ ๋ชจ๋ ๊ต์ฒด๊ฐ ํธ๋ฆฌ๊ฑฐ๋๊ณ ๋ณ๊ฒฝ๋ ํ์ผ์ ์ปดํ์ผ ๋ ์ถ๋ ฅ์ด ์ฌ๋ฐ๋ฅธ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ ๋งค์ฐ ์ด์ํฉ๋๋ค.
@Justineo ์ด๊ฒ์ ์ ์ฉํ ๋จ์์ ๋๋ค. ์ด ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ๊ณผ ๊ด๋ จ์ด์์ ์ ์์ต๋๋ค. https://github.com/less/less.js/issues/3434
๊ฐ๋จํ ๋งํด, ํธ๋ฆฌ ์บ์ฑ์ Less์์ ํ๋์ ์ ๊ฑฐ๋์์ง๋ง ์ผ๋ถ ์๋๋ฆฌ์ค์์๋ ์ฑ๋ฅ์ ๋๋ฌด ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ ๊ฐ์์ ๋ค์ ๋ฃ์์ต๋๋ค. Less๊ฐ ์ผ๋ถ ์ํฌํธ ํธ๋ฆฌ ์ํ๋ฅผ ์ฌ์ค์ ํ์ง ์์ ์ ์์ต๋๋ค. ์ด๋ less.parse๊ฐ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋๋ "๋ผ์ด๋ธ"ํ๊ฒฝ์์๋ง ๋ฌธ์ ๋ฅผ ์ ๋ฐํฉ๋๋ค. ์, ๊ทธ ์ด๋ก ์ ์ฌ์์ฐ์ผ๋ก ํ ์คํธ ํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
ํธ์ ๋ด์ ๊ฐ๊ธฐ
์ํ๊น๊ฒ๋ ์ฌ์ ํ์ด ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์ ์์ผ๋ฏ๋ก ๋๋ฒ๊น ํ ์ ์์ต๋๋ค. โน๏ธ ๋๊ตฐ๊ฐ ์ฝ๊ฒ ์ฌํ ํ ์์๋ repo๋ฅผ ๋ง๋ค ์ ์๋ค๋ฉด ๋จ๊ณ๋ณ๋ก ์งํํ ์ ์์ต๋๋ค.
3.13.0์์ ๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. (์์ง๋ ์ต์ํ์ ์ฌ์์ฐ์ ์ฐพ์ผ๋ ค๊ณ ํฉ๋๋ค.)
๊ด๋ จ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.// button.less <strong i="9">@import</strong> "./lib.less"; .@{prefix}-button { color: red; &:hover { color: blue; } }
// lib.less <strong i="12">@plugin</strong> "~some-less-plugin"; // where <strong i="13">@prefix</strong> is injected which preprocessing plugins
๋ค์๊ณผ ๊ฐ์ด ์ปดํ์ผ๋ฉ๋๋ค.
{ color: red; } :hover { color: blue; }
์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์ด ์ด์ํฉ๋๋ค.
style-resources-loader๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ถ ์ ์ญ ๋ณ์๋ ์ฝ์ ํฉ๋๋ค. ์๋ง๋ ๊ทธ๊ฒ๊ณผ ๊ด๋ จ์ด์๋ ๊ฒ์ผ๊น ์?
{ test: /\.less$/i, use: [ { loader: MiniCssExtractPlugin.loader, options: { hmr: process.env.NODE_ENV === 'development', reloadAll: true, }, }, { loader: 'css-loader', }, { loader: 'postcss-loader', options: { config: { path: path.resolve(__dirname, '../postcss.config.js'), }, }, }, { loader: 'less-loader', options: { lessOptions: { javascriptEnabled: true, paths: [path.resolve(cwd, 'node_modules')], }, }, }, { loader: 'style-resources-loader', options:{ patterns: path.resolve( cwd, './node_modules/@somemodule/style/index.less', ), injector: 'prepend', }, }, ], },
+1
@plugin + sourcemap์ด ์ ์ผ๋ฉด์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
@ matthew-dean ๐
@PengJiyuan ๋ณต์ ๊ฐ๋ฅํ ์ ์ฅ์์์ ์ฌํ ๊ฐ๋ฅํ ์์ ๋ฅผ ๋ง๋ค ์ ์์ต๋๊น?
+1
์ด ์ฝ๋๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ํธ๋ฆฌ ๋
ธ๋์ ์๋ชป๋ fileInfo๊ฐ ์์ต๋๋ค. ๋ณ๋ ฌ์ ๊ฒฝ์ฐ inputSource๊ฐ ์ ์๋์ง ์์ต๋๋ค.
+1
์ด ์ฝ๋๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ํธ๋ฆฌ ๋ ธ๋์ ์๋ชป๋ fileInfo๊ฐ ์์ต๋๋ค. ๋ณ๋ ฌ์ ๊ฒฝ์ฐ inputSource๊ฐ ์ ์๋์ง ์์ต๋๋ค.
@ matthew-dean ์ ๊น, ์ฐ๋ฆฌ๋ ๋ฏธ๋ ์ ์ฅ์๋ฅผ ๋ง๋ญ๋๋ค. ์ด ์ฝ๋ ์ค์ ์ฐพ์์ต๋๋ค. ์ ์ํ๊ฒ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
+1
์ด ์ฝ๋๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ํธ๋ฆฌ ๋ ธ๋์ ์๋ชป๋ fileInfo๊ฐ ์์ต๋๋ค. ๋ณ๋ ฌ์ ๊ฒฝ์ฐ inputSource๊ฐ ์ ์๋์ง ์์ต๋๋ค.
์ด ์ฝ๋ ์ค์ 3.10.0 ์ดํ๋ก ๋ํ๋ฌ์ต๋๋ค.
@PengJiyuan ๋ณต์ ๊ฐ๋ฅํ ์ ์ฅ์์์ ์ฌํ ๊ฐ๋ฅํ ์์ ๋ฅผ ๋ง๋ค ์ ์์ต๋๊น?
https://github.com/kirazxyun/less-question
์ด ์ ์ฅ์๋ ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์ ์์ต๋๋ค. 'npm run build'๋ก ์คํ ํ ๋ค์ dist ํด๋์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
@PengJiyuan ๋ณต์ ๊ฐ๋ฅํ ์ ์ฅ์์์ ์ฌํ ๊ฐ๋ฅํ ์์ ๋ฅผ ๋ง๋ค ์ ์์ต๋๊น?
https://github.com/kirazxyun/less-question
์ด ์ ์ฅ์๋ ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์ ์์ต๋๋ค. 'npm run build'๋ก ์คํ ํ ๋ค์ dist ํด๋์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
@ ๋งคํ ๋
@ matthew-dean @plugin์ ์ฌ์ฉ
@PengJiyuan ๋ง์ต๋๋ค. ์์ค ๋งต ๋น๋๊ฐ ์๋ํ์ง ์๋ ๊ฒฝ์ฐ ํด๋น ์ฝ๋๊ฐ ์ฒญํฌ ์ถ๋ ฅ์ ์คํจํด์๋ ์๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์์ผํฉ๋๋ค.
if (inputSource === undefined) {
this._css.push(chunk);
return;
}
ํ์ผ ์ค ํ๋์ ์๋ชป๋ ๊ฐ์ ธ ์ค๊ธฐ ๋งคํ์ด์๋ ์ด์ ๋ฅผ ํ์ ํ๋ ์ฅ๊ธฐ์ ์ธ ์์ ์ผ๋ก ๋จ๊ธฐ ์์ ์ด๋ฉ๋๋ค. (๋ณ๋ ฌ๋ก ์ปดํ์ผ ํ ๋ ์๋ง๋ ์ฌ์ฌ์ฉ ๋ ๊ฒ์ ๋๋ค.)
๊ทธ๋์ ๊ณง ์์ ๋ฐ์ฐฝ๊ณ ํด๊ฒฐ์ํ๊ณ ๊ทธ ์์ธ์ ์์๋ผ ์ ์์ต๋๋ค.
@PengJiyuan @kirazxyun @Justineo ๋ฑ [email protected]
ํ
์คํธ ํด๋ณด์ธ์
[email protected]๋ก ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค
@ matthew-dean ์๋ํฉ๋๋ค, ๊ฐ์ฌํฉ๋๋ค ๐
@ matthew-dean์ [email protected]์ผ๋ก ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์์ ํ์ธํ๊ณ ๊ณง ๊ณต์ ๋ฆด๋ฆฌ์ค๋ฅผ ๊ธฐ๋ํฉ๋๋ค.
[email protected] ๋ก ํด๊ฒฐ๋ฉ๋๋ค
3.13.1 ๊ฒ์ ๋จ
์ด ์์ ์ฌํญ์ด ํฌํจ ๋ 4.0.0๋ ๊ฒ์๋์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@PengJiyuan @kirazxyun @Justineo ๋ฑ
[email protected]
ํ ์คํธ ํด๋ณด์ธ์