рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдереАрдорд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕реАрдПрд╕рдПрд╕ рдореЗрдВ рдХрдо рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЛрдбрдЬ рдХрдо рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдореИрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрдо рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рдХреЗрд╡рд▓ рдЙрд╕ рд╕реАрдПрд╕рдПрд╕ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдореИрдВ рдЕрдкрдиреЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╖рдпреЛрдВ рдореЗрдВ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдЪрд░ рдФрд░ рдорд┐рд╢реНрд░рдгреЛрдВ рдХреЛ рднреА рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП, рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рдереАрдо рдЪрд░ рдФрд░ рдорд┐рд╢реНрд░рдгреЛрдВ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рддреЛ, рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдЪрд░/рдорд┐рд╢реНрд░рдг рдФрд░ рд╕реАрдПрд╕рдПрд╕ рдирд┐рдпрдореЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдХрд░реЗрдВ рдореИрдВрдиреЗ 2 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдИ рд╣реИрдВ,
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП
|--sample_application
|--resources
| |--libraries
| |--bootstrap
| |--css
| | |--application.less
| |--less
| | |--application_variables.less
|--themes
|--red
| |--mixins
| | |--mixins.less
| |--variables
| | |--variables.less
| |--red.less
|--blue
| |--mixins
| | |--mixins.less
| |--variables
| | |--variables.less
| |--blue.less
|--themes.less
рдХрд┐рд╕ рдлрд╛рдЗрд▓ рдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдореЗрдВ рдХреНрдпрд╛ рд╣реИ?
1. /sample_application/themes/<-theme_name->/mixins/mixins.less
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд┐рдХреНрд╕рд┐рди рдФрд░ рдУрд╡рд░рд░рд╛рдЗрдб рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдорд┐рдХреНрд╕рд┐рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
.my-hover-mixin(@color) {
&:hover {
border: 2px solid @color;
}
}
/*Other theme specific mixins*/
2. /sample_application/themes/<-theme_name->/variables/variables.less
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд░ рдФрд░ рдУрд╡рд░рд░рд╛рдЗрдб рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдЪрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
@text-color:#333333;
@border-color:#999999;
@body-bg-color:red;
/*Other theme specific variables*/
3. /sample_application/themes/<-theme_name->/<-theme_name->.less
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рдорд┐рд╢реНрд░рдг рдФрд░ рдЪрд░ рдХреЗ рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
<strong i="10">@import</strong> "./variables/variables.less";
<strong i="11">@import</strong> "./mixins/mixins.less";
4. /sample_application/themes/theme.less
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреЛ рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рд╣реИрдВред рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдЬреЛ application_variables.less рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ рд╡рд┐рд╢реЗрд╖ рдереАрдо рдХреЗ рдЖрдзрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред рд▓рд╛рд▓.рд░рд╣рд┐рдд/рдиреАрд▓рд╛.рд╡рд┐рд╣реАрди
<strong i="17">@import</strong> "application_variables.less";
<strong i="18">@import</strong> "red/red.less";
5. /sample_application/resources/рдкреБрд╕реНрддрдХрд╛рд▓рдп/рдмреВрдЯрд╕реНрдЯреНрд░реИрдк/рд╕реАрдПрд╕рдПрд╕/application.less
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рд╣реИ рдЬреЛ /themes/themes.less рд╣реИ рдФрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк CSS рдирд┐рдпрдо рд╣реИрдВред
<strong i="24">@import</strong> "theme.less";
/*Bootstrap CSS rules*/
6. /sample_application/resources/рдкреБрд╕реНрддрдХрд╛рд▓рдп/рдмреВрдЯрд╕реНрдЯреНрд░реИрдк/рдХрдо/application_variables.less
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдЪрд░ рдФрд░ рдорд┐рд╢реНрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
/*Bootstrap variables and mixins*/
рдЕрдм рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдиреЛрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрдо рд╕рдВрдХрд▓рди рдХреЛ рдЦреБрд░рд╛рдХ рджреЗрддреА рд╣реИ рдЬреЛ рдХрд┐ рд╕рдВрдХрд▓рди-рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╣реИредjs
var fs = require("fs");
var less = require('less');
(function() {
var bsLessContent = fs.readFileSync("sample_application/resources/libraries/bootstrap/css/application.less");
less.render(bsLessContent.toString(), {
paths : [ "sample_application/themes/", "sample_application/resources/libraries/bootstrap/less/"],
compress : true
}, function(e, output) {
fs.writeFileSync("sample_application/resources/libraries/bootstrap/css/application.css", output);
});
})();
рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ:
{ [Error: 'application_variables.less' wasn't found]
type: 'File',
message: '\'application_variables.less\' wasn\'t found',
filename: 'sample_application\\themes\\theme.less',
index: 18,
line: 2,
callLine: NaN,
callExtract: undefined,
column: 0,
extract:
[ '<strong i="6">@import</strong> "application_variables.less";',
'<strong i="7">@import</strong> "red/red.less";' ] }
рддрдм рдореИрдВрдиреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрдереЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рджреЗ рд░рд╣рд╛ рд╣реИ
{ [Error: './../resources/libraries/bootstrap/less/application_variables.less' wasn't found]
type: 'File',
message: '\'./../resources/libraries/bootstrap/less/application_variables.less\' wasn\'t found',
filename: 'sample_application\\themes\\theme.less',
index: 18,
line: 2,
callLine: NaN,
callExtract: undefined,
column: 0,
extract:
[ '<strong i="11">@import</strong> "./../resources/libraries/bootstrap/less/application_variables.less";',
'<strong i="12">@import</strong> "red/red.less";' ] }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЪреВрдВрдХрд┐ рд╕реНрд░реЛрдд рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреЛ рдЖрдкреВрд░реНрддрд┐ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдкрде рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рдЖрдпрд╛рдд рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддрд╛ рдХрд┐ рдЖрдк рд╕рднреА рдкрде рдХреНрдпрд╛ рд╣реИрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИрдВ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ cwd
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдпрд╛рдд рдХреЗ рд╕рдордп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдпрд╛рджреГрдЪреНрдЫрд┐рдХ" рд╣реИ рдФрд░ рдпрд╣ рдЕрдм рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдмрд┐рдВрджреБ рдирд╣реАрдВ рд╣реИ ...) рдЬреИрд╕реЗ:
var fs = require('fs'),
path = require('path'),
less = require('less');
(function() {
var src = "foo/bar/baz.less";
less.render(fs.readFileSync(src).toString(), {
filename: path.resolve(src), // <- here we go
}, function(e, output) {
console.log(output.css);
});
})();
рд╡рд╣реА paths
рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВ рддреЛ рдЙрдиреНрд╣реЗрдВ filename
рд╕рд╛рдкреЗрдХреНрд╖ рдпрд╛ рддреЛ рдкреВрд░реНрдг рдпрд╛ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣ рд╕реАрдЦрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдХреИрд╕реЗ lessc
рд╕реНрд╡рдпрдВ рдЗрди рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред
рдзрдиреНрдпрд╡рд╛рдж рд╕рд╛рдд-рдЪрд░рдг-рдЕрдзрд┐рдХрддрдоред рдпрд╣ рд╕рдорд╛рдзрд╛рди рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рд░рд╣рд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЪреВрдВрдХрд┐ рд╕реНрд░реЛрдд рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреЛ рдЖрдкреВрд░реНрддрд┐ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдкрде рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рдЖрдпрд╛рдд рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддрд╛ рдХрд┐ рдЖрдк рд╕рднреА рдкрде рдХреНрдпрд╛ рд╣реИрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИрдВ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓
cwd
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдпрд╛рдд рдХреЗ рд╕рдордп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдпрд╛рджреГрдЪреНрдЫрд┐рдХ" рд╣реИ рдФрд░ рдпрд╣ рдЕрдм рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдмрд┐рдВрджреБ рдирд╣реАрдВ рд╣реИ ...) рдЬреИрд╕реЗ:рд╡рд╣реА
paths
рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВ рддреЛ рдЙрдиреНрд╣реЗрдВfilename
рд╕рд╛рдкреЗрдХреНрд╖ рдпрд╛ рддреЛ рдкреВрд░реНрдг рдпрд╛ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣ рд╕реАрдЦрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдХреИрд╕реЗlessc
рд╕реНрд╡рдпрдВ рдЗрди рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред