Less.js: modifyVars werden nicht weitergegeben

Erstellt am 23. Feb. 2018  ·  6Kommentare  ·  Quelle: less/less.js

Ich habe eine index.less-Datei, die entscheidet, welche Variablendatei von einer Variablen geladen werden soll:

@theme-variant: "a-theme.less";

<strong i="6">@import</strong> "./@{theme-variant}";

Ich habe weniger Dateien, die in diese Indexdatei geladen werden:

<strong i="10">@import</strong> "~theme-variant-variables";

Ich setze einen Wert für die Variable in meiner webpack.config.js -Datei:

lessOptions.modifyVars = {
   "theme-variant": `"${v}-theme.less"`
}

Wenn ich den Inhalt der index.less-Datei in eine direkt importierte less-Datei verschiebe, funktioniert alles wie erwartet, ich kann die basierend auf der Webpack-Konfigurationslogik ausgewählte Variablendatei umschalten, leider, wenn ich versuche, diese beiden Zeilen von less in a zu zentralisieren Datei, die die direkt importierten weniger Dateien selbst importieren, funktioniert es nicht mehr. Ich sehe weniger Loader-Aufrufe weniger mit der erwarteten Konfiguration, also vermute ich, dass der Less-Compiler keine Variablen/Optionen an weniger importierte Dateien weitergibt. Wird das erwartet?

Alle 6 Kommentare

Ich nehme an, das ist dasselbe wie in #2772 - siehe Mitte der Diskussion dort (z. B. hat modifyVars seine Auswirkung auf die Definition der Variablen, aber es kommt, nachdem die Interessenbekundung des Imports bereits ausgewertet wurde ). Siehe aber auch https://github.com/less/less.js/issues/1400#issuecomment -137128461.

Kurz gesagt, der Punkt ist: Variableninterpolation innerhalb von Importanweisungen ist eine praktische Sache, aber sie widerspricht direkt dem Lazy-Evaluation-Prinzip. Wenn es also um eine komplexe Strukturierung geht, sollte man besser andere Wege finden, um eine solche Anpassung zu erreichen (z. B. verschiedene Verzeichnisse für verschiedene Themendateien verwenden und dann die entsprechende paths -Option zum Umschalten festlegen).

Danke für die Antwort. Die Variable wird in Less-Dateien aktualisiert, die direkt von JS importiert werden, es sind nur Dateien, die von anderen Less-Dateien importiert werden, deren Variable nicht aktualisiert wird. Lazy Evaluation tritt sicherlich in beiden Fällen auf? Es sieht so aus, als würde die Modify-Var-Logik/Konfiguration nicht auf die weniger importierten Dateien angewendet/weitergegeben. Oder übersehe ich etwas?

Die Variable wird in Less-Dateien aktualisiert, die direkt von JS importiert werden, es sind nur Dateien, die von anderen Less-Dateien importiert werden, deren Variable nicht aktualisiert wird.

Nun, es ist schwieriger als das. Beachten Sie, dass der Compiler, damit die Lazy-Evaluation funktioniert, verschiedene Sprachentitäten (im selben Bereich) nach Typen auswerten muss, nicht in der Reihenfolge, in der sie im Code erscheinen, von höherer zu niedrigerer Ebene, dh (ungefähr): imports -> mixins - > Variablen.
Wenn Sie jetzt <strong i="9">@import</strong> "@{var}"; haben, ist der Compiler gezwungen, die angegebene Variable vor dem Import (und allen nachfolgenden Importen) auszuwerten - und das verdirbt die ganze Sache (im Allgemeinen ist das Ergebnis eines solchen Missbrauchs einfach undefiniert - es funktioniert in einem Fall (meistens sehr einfach) und in anderen nicht).

Der Compiler kann kein konsistentes Verhalten garantieren, wenn zwei direkt widersprüchliche Features kombiniert werden.

Mit anderen Worten, es ist nicht so, dass modifyVars Variablen in nachfolgenden Importen nicht "aktualisiert", aber die aktualisierten Variablenwerte selbst können keine Auswirkungen auf Importe der äußeren Ebene haben (weil diese Importe bereits "fertig" sind).


Und selbst wenn die Dokumente sagen:

Beachten Sie, dass vor v2.0.0 nur Variablen berücksichtigt wurden, die im Root- oder aktuellen Gültigkeitsbereich deklariert wurden, und dass bei der Suche nach einer Variablen nur die aktuelle Datei und aufrufende Dateien berücksichtigt wurden.

... es ist nicht wirklich viel besser nach v2. Es hat mehr Kombinationen/Anwendungsfälle verbessert/behoben, kann aber nicht alle beheben. Weitere Einzelheiten finden Sie unter Nr. 1108 und speziell unter Nr. 2246.


Es sieht so aus, als würde die Modify-Var-Logik/Konfiguration nicht auf die weniger importierten Dateien angewendet/weitergegeben.

Nein (einfach, weil die Dateien am Ende alle zusammen als ein einziger großer String ausgewertet werden). Wenn das Problem nicht woanders liegt, fügen Sie zur Überprüfung einfach Folgendes hinzu:
foo {bar: @theme-variant}
zu den gewünschten Dateien und sehen Sie sich das Ergebnis an.

Übrigens. Für Ihren Anwendungsfall (wenn es bei „*-theme.less“ nur um Variablen/Mixins für ein bestimmtes Thema geht), könnten Sie Folgendes versuchen:

  • Belassen Sie die Voreinstellung <strong i="7">@import</strong> "a-theme.less"; so, dass sie dort explizit ist (dh ohne Interpolation) oder entfernen Sie sie vollständig.
  • Mit modifyVars setzen Sie die Import-Anweisung selbst (zB <strong i="11">@import</strong> "custom-theme.less"; direkt).

Beachten Sie, dass modifyVars zwar so tut, als würde es nur um Variablen gehen, bla-bla-bla - in Wirklichkeit aber nichts anderes tut, als einen beliebigen Text an das Ende der Root-Datei anzuhängen. Dh bei lessc sind es wirklich nur --modify-vars="whatever-less-code foo {bar: baz;}" . Ich weiß aber nicht, welche Formate der Less-Loader von Webpack passieren kann, hmm... lessOptions.modifyVars = "an arbitrary code"; vielleicht?

Das ist offensichtlich ein Hack, aber tatsächlich ist es ein ziemlich vorhersehbarer Hack (da er nur das modifyVars -Format missbraucht und nicht die Sprache selbst, wie es die anfängliche Combo tut).

Vielen Dank für Ihre Antworten und Ideen @seven-phases-max. Ich werde im Laufe der Woche weiter nachforschen und habe eine Erinnerung eingerichtet, dieses Problem später in der Woche zu aktualisieren/zu schließen. Danke noch einmal.

Ich werde dies dann schließen, da es eher ein erwartetes (in diesem Fall als "undefiniert/nicht spezifiziert" definiertes) Verhalten als ein Problem ist, das tatsächlich irgendwie behoben werden könnte.
Obwohl Verbesserungsideen und besonders PRs immer willkommen sind ... Ich glaube nicht, dass sich irgendjemand in absehbarer Zeit damit befassen wird.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen