Ich habe LESS verwendet, um Theming in meiner Anwendung zu implementieren und das Modul nodejs less zu verwenden, um weniger Dateien in CSS zu kompilieren, aber in einem bestimmten Szenario funktioniert es nicht.
Ich verwende auch Bootstrap für meine Anwendung und verwende Bootstrap weniger Quellcode. Ich kompiliere nur das CSS, das ich in meiner Anwendung haben möchte.
Ich kann auch Bootstrap-Variablen und Mixins in meinen verschiedenen Designs überschreiben. Beim Kompilieren von Bootstrap muss ich also auch bestimmte Themenvariablen und Mixins berücksichtigen.
Unterscheiden Sie also Bootstrap-Variablen / Mixins und CSS-Regeln Ich habe 2 verschiedene Dateien erstellt,
Verzeichnisstruktur Für die Anwendung
|--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
Erklärung, welche Datei was enthält?
1. /sample_application/themes/<-theme_name->/mixins/mixins.less
Diese Datei enthält alle anwendungsspezifischen Mixins und überschriebenen Bootstrap-Mixins.
.my-hover-mixin(@color) {
&:hover {
border: 2px solid @color;
}
}
/*Other theme specific mixins*/
2. /sample_application/themes/<-theme_name->/variables/variables.less
Diese Datei enthält alle anwendungsspezifischen Variablen und überschriebenen Bootstrap-Variablen.
@text-color:#333333;
@border-color:#999999;
@body-bg-color:red;
/*Other theme specific variables*/
3. /sample_application/themes/<-theme_name->/<-theme_name->.less
Diese Datei enthält Dateiimporte von Mixins und Variablen für dieses spezielle Thema.
<strong i="10">@import</strong> "./variables/variables.less";
<strong i="11">@import</strong> "./mixins/mixins.less";
4. /sample_application/themes/theme.less
Diese Datei enthält zwei Dateiimporte. Die erste für Bootstrap-Variablen, die application_variables.less ist, und die zweite für den Basisdateiimport bestimmter Themen, z. rot.weniger/blau.weniger
<strong i="17">@import</strong> "application_variables.less";
<strong i="18">@import</strong> "red/red.less";
5. /sample_application/resources/libraries/bootstrap/css/application.less
Diese Datei enthält einen Dateiimport, der /themes/themes.less ist, und alle erforderlichen Bootstrap-CSS-Regeln.
<strong i="24">@import</strong> "theme.less";
/*Bootstrap CSS rules*/
6. /sample_application/resources/libraries/bootstrap/less/application_variables.less
Diese Datei enthält alle erforderlichen Bootstrap-Variablen und Mixins.
/*Bootstrap variables and mixins*/
Jetzt habe ich eine Knotenskriptdatei, die die Bootstrap-weniger Kompilierung dosiert, die compilieren-bootstrap.js ist
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);
});
})();
Aber wenn ich dieses Skript ausführe, erhalte ich folgende Fehlermeldung
{ [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";' ] }
Dann habe ich auch versucht, relative Pfade zu verwenden, aber es gibt immer noch den gleichen Fehler
{ [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";' ] }
Beachten Sie, dass Sie, da die Quelle dem Compiler als String bereitgestellt wird, den ursprünglichen Dateipfad explizit festlegen müssen, damit der Compiler ihn als Basis für Importe verwenden kann angeben sind relativ zu (höchstwahrscheinlich wird es nur cwd
aber es ist ziemlich "zufällig" zu dem Zeitpunkt, an dem es tatsächlich zu Importen kommt, und es zeigt nicht mehr unbedingt auf Ihr Projektstammverzeichnis...). Z.B:
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);
});
})();
Das gleiche gilt für die Option paths
, wenn ich mich in diesem Fall nicht irre, sollten sie entweder absolut oder relativ zu filename
. Im Allgemeinen ist es eine gute Idee zu lernen, wie lessc
selbst mit diesen Dingen umgeht.
Dank sieben-Phasen-max. Diese Lösung funktioniert gut und schließt das Problem.
Hilfreichster Kommentar
Beachten Sie, dass Sie, da die Quelle dem Compiler als String bereitgestellt wird, den ursprünglichen Dateipfad explizit festlegen müssen, damit der Compiler ihn als Basis für Importe verwenden kann angeben sind relativ zu (höchstwahrscheinlich wird es nur
cwd
aber es ist ziemlich "zufällig" zu dem Zeitpunkt, an dem es tatsächlich zu Importen kommt, und es zeigt nicht mehr unbedingt auf Ihr Projektstammverzeichnis...). Z.B:Das gleiche gilt für die Option
paths
, wenn ich mich in diesem Fall nicht irre, sollten sie entweder absolut oder relativ zufilename
. Im Allgemeinen ist es eine gute Idee zu lernen, wielessc
selbst mit diesen Dingen umgeht.