Language-tools: Das Attribut "lang" des Style-Tags löst eine Warnung von Svelte Beta aus

Erstellt am 29. Mai 2020  ·  30Kommentare  ·  Quelle: sveltejs/language-tools

Beschreibe den Fehler
Wenn Sie ein lang -Attribut im <style> -Tag der Komponente angeben, gibt Svelte Beta für VS-Code die folgende Warnung aus:

The file cannot be parsed because script or style require a preprocessor that doesn't seem to be setup. Did you setup a `svelte.config.js`? See https://github.com/sveltejs/language-tools/tree/master/packages/svelte-vscode#using-with-preprocessors for more info.

Dies geschieht nur, wenn das Attribut lang für die Komponente <style> . Wenn das lang-Attribut aus dem <style> -Tag entfernt wird, verschwindet die Warnung, unabhängig davon, ob das <script> -Tag ein lang -Attribut enthält.

Fortpflanzen
Schritte zum Reproduzieren des Verhaltens:

  1. Erstellen Sie ein neues Svelte + Webpack-Projekt mit: degit svelte/template-webpack
  2. Installieren Sie TypeScript, Node Sass und Svelte Preprocess: npm i -D typescript node-sass svelte-preprocess
  3. Erstellen Sie eine svelte.config.js:
const sveltePreprocess = require('svelte-preprocess')

module.exports = {
  preprocess: sveltePreprocess()
}
  1. Starten Sie Svelte Beta in VS Code neu
  2. Fügen Sie lang="scss" zu <style> in src/App.svelte
  3. Datei speichern. Die Svelte Beta-Warnung sollte auf dem <script> -Tag erscheinen

Erwartetes Verhalten
Es wird erwartet, dass Svelte Beta keine Warnungen oder Fehler zurückgibt.

Screenshots
SvelteWarning
SvelteWarning001
SvelteWarning002
SvelteWarning003

System:

  • Betriebssystem: Windows 10
  • IDE: VSCode 1.45.0
  • Plugin / Paket: "Svelte Beta"

Zusätzlicher Kontext
Häufig empfohlene / offensichtliche Korrekturen, die nicht funktionierten:

  • _Double, Triple und Quadruple haben überprüft, ob ich eine svelte.config.js -Datei im Stammverzeichnis meines Projekts habe._
  • Es wurde versucht, die Laufzeit auf den Pfad zu Node.js festzulegen: C:\Program Files\nodejs\node.exe
  • Versuchte die folgenden Varianten von svelte.config.js:
const sveltePreprocess = require('svelte-preprocess')

module.exports = {
  preprocess: [sveltePreprocess()]
}

`` `js
const sveltePreprocess = require ('svelte-preprocess')

module.exports = {
Vorprozess: sveltePreprocess ({
sass: wahr
})
}}

```js
const sveltePreprocess = require('svelte-preprocess')

module.exports = {
  preprocess: sveltePreprocess({
    sass: true,
    typescript: true
  })
}
  • Die Webpack-Konfiguration verwendet Vorverarbeitungsoptionen, die von svelte.config.js exportiert wurden, und kompiliert Svelte-Code ohne Fehler oder Warnungen.
bug

Hilfreichster Kommentar

Ich habe es versucht und das Problem, auf das ich stoße , kann behoben werden, indem svelte.language-server.runtime wie von @dummdidumm vorgeschlagen festgelegt wird.
@JoeBobMiles Sie können versuchen, node-sass in einer js-Datei zu benötigen und die Datei mit dem Knoten ausführen, um festzustellen, ob Fehler vorliegen.

const nodeSass = require('node-sass')

console.log(nodeSass)

Alle 30 Kommentare

Dies passiert mir auch, sobald ich eine Sprache oder ein Detail deaktiviere, das auf die Sprache des über src="./xxx.scss" importierten Stils verweist, hört das System am Anfang der Seite auf, sich darüber zu beschweren.

Da es für scss passiert, bin ich mir sehr sicher, dass es sich um ein Node-Sass-Problem wie dieses handelt .

Könnten Sie Output-> Svelte in VSCode öffnen (Ansicht unten, auch wo sich Ihr Terminal befindet), den Fehler reproduzieren und hier die Ausgabe einfügen?

Möglicherweise verwandt: # 32

Nichts, was lokal und global mit Node-sass gemacht wurde, hat das Ergebnis auch nach mehreren Neuladungen verändert.

Dies ist die Ausgabe von Svelte (beachten Sie, dass ich 3.20.1 habe, da ein Fehler in der aktualisierten Version es mir nicht ermöglicht, das ebenfalls gemeldete Projekt zu aktualisieren).

loading config for /PATH/TO/PROJECT/src/Button.svelte
Using Svelte v3.20.1 from /PATH/TO/PROJECT/node_modules/svelte/compiler
Using Svelte v3.20.1 from /PATH/TO/PROJECT/node_modules/svelte/compiler
loading config for /PATH/TO/PROJECT/node_modules/@smui/common/H6.svelte
Using Svelte v3.20.1 from /PATH/TO/PROJECT/node_modules/svelte/compiler
Using Svelte v3.20.1 from /PATH/TO/PROJECT/node_modules/svelte/compiler
loading config for /PATH/TO/PROJECT/src/App.svelte
Using Svelte v3.20.1 from /PATH/TO/PROJECT/node_modules/svelte/compiler
Using Svelte v3.20.1 from /PATH/TO/PROJECT/node_modules/svelte/compiler
loading config for /PATH/TO/PROJECT/src/App.svelte
Using Svelte v3.20.1 from /PATH/TO/PROJECT/node_modules/svelte/compiler
Using Svelte v3.20.1 from /PATH/TO/PROJECT/node_modules/svelte/compiler
loading config for /PATH/TO/PROJECT/src/App.svelte
Using Svelte v3.20.1 from /PATH/TO/PROJECT/node_modules/svelte/compiler
Using Svelte v3.20.1 from /PATH/TO/PROJECT/node_modules/svelte/compiler

Das Flusen-SCSS könnte verwandt sein, und ich hatte es auch, als ich Inline-SCSS hatte, aber nur als Randnotiz, dies ist kein Fehler, es ist eine Warnung oben in der Datei. Es muss kein SCSS analysiert werden.

Ich glaube, das hat etwas mit dieser htmlxparser.ts zu

@dummdidumm Ich habe diese Ausgabe tatsächlich überprüft, bevor ich diesen Fehler

Da es für scss passiert, bin ich mir sehr sicher, dass es sich um ein Node-Sass-Problem wie dieses handelt.

Ich bin skeptisch, dass dies der Fall sein würde, aber ich werde untersuchen und sehen, was ich finde.

Aus der @ Egus- Ausgabe kann ich schließen, dass das svelte.config.js gefunden wurde. Wenn die Konfiguration nicht gefunden, aber benötigt wird (da lang / type auf script / style ), wird eine No svelte.config.js found but one is needed Nachricht angezeigt würde im Protokoll erscheinen.
Es hat auch nichts mit dem htmlxparser von svelte2tsx zu tun, da dort keine Vorverarbeitung durchgeführt wird. Dies schlägt hier fehl

Hier ist das Protokoll, das ich erhalten habe, als ich die Svelte-Ausgabe überprüft habe (Pfade anonymisiert; Schrägstriche wie bei der Anzeige im VS-Code):

Initialize language server at c:/PATH/TO/PROJECT/
Initialize new ts service at  
loading config for c:/PATH/TO/PROJECT/src/App.svelte
Using Svelte v3.22.3 from c:\PATH\TO\PROJECT\node_modules\svelte\compiler
Using Svelte v3.22.3 from c:\PATH\TO\PROJECT\node_modules\svelte\compiler
loading config for c:/PATH/TO/PROJECT/src/App.svelte
Using Svelte v3.22.3 from c:\PATH\TO\PROJECT\node_modules\svelte\compiler
Using Svelte v3.22.3 from c:\PATH\TO\PROJECT\node_modules\svelte\compiler
loading config for c:/PATH/TO/PROJECT/src/App.svelte
Using Svelte v3.22.3 from c:\PATH\TO\PROJECT\node_modules\svelte\compiler
Using Svelte v3.22.3 from c:\PATH\TO\PROJECT\node_modules\svelte\compiler
loading config for c:/PATH/TO/PROJECT/src/App.svelte
Using Svelte v3.22.3 from c:\PATH\TO\PROJECT\node_modules\svelte\compiler
Using Svelte v3.22.3 from c:\PATH\TO\PROJECT\node_modules\svelte\compiler
loading config for c:/PATH/TO/PROJECT/src/App.svelte
Using Svelte v3.22.3 from c:\PATH\TO\PROJECT\node_modules\svelte\compiler
Using Svelte v3.22.3 from c:\PATH\TO\PROJECT\node_modules\svelte\compiler

Fast identisch mit der VS-Code-Ausgabe von @Egnus , außer für die Svelte-Version und das Hinzufügen von Initializing new ts service at . Ich bin mir nicht sicher, ob dies von Bedeutung ist, aber der Wechsel der Schrägstriche zwischen den Nachrichten fällt mir auf.

Außerdem wurde überprüft, ob Node-Sass mit meiner Version von Windows und Node.js kompatibel ist. node-sass v4.14.1 (neueste Version ab sofort) ist mit meiner Version von node v13.7 kompatibel.

Könnten Sie bitte noch einmal nachsehen? Ich habe ein Update mit mehr Protokollierung in diesem Bereich gepusht und auch die benutzerbezogene Fehlermeldung ein wenig aktualisiert.

Beziehen Sie sich auf das Commit oben? In diesem Fall hatte ich nach dem Zusammenführen des Commits überprüft und das neue Update vor dem Überprüfen installiert.

Die Erweiterung wird jeden Abend veröffentlicht, das letzte Mal vor ungefähr 8 Stunden, sodass Ihr Protokoll vor 14 Stunden wahrscheinlich mit der "alten" Version übereinstimmt.

Ah ich sehe. Ich werde das neue Protokoll erhalten, wenn ich das nächste Mal in der Lage bin.

Ich werde es auch in ein paar Stunden oder vorher überprüfen

Mmmm interessant, du hattest recht:

Preprocessing failed
Error: Cannot find any of modules: node-sass,sass
    at Object.exports.importAny (/PATH/TO/PROJECT/node_modules/svelte-preprocess/dist/utils.js:1:2844)

Ich werde überprüfen, warum svelte.config.js es nicht verwendet und zurückkommen

Ok, es scheint also, dass svelte-preprocess node-sass weder global noch lokal von VSCode findet. Während die gleiche Rollup-Konfiguration die folgenden svelte.config.js importiert.

// svelte.config.js
const sveltePreprocess = require('svelte-preprocess');

module.exports = {
  preprocess: sveltePreprocess({
    scss: {
      includePaths: ['x', 'y', 'z'],
    },
    typescript: {
      extensions: ['x', 'y', 'z'],
      includePaths: ['x', 'y', 'z'],
    },
  }),
  // ...other svelte options
};

// The following alternative should make SCSS to work but nothing else will. Why the auto preprocess does not work here?

// import sass from 'node-sass';
// module.exports = {
//   preprocess: {
//     style: async ({ content, attributes }) => {
//       if (attributes.type !== 'text/scss') {
//         return;
//       }

//       const result = await sass.renderSync({
//         data: content,
//         sourceMap: 'style.css.map',
//         omitSourceMapUrl: true,
//       });

//       return {
//         code: result.css.toString('utf8'),
//         map: result.map.toString('utf8'),
//       };
//     },
//   },
// };

Könnte ein Problem von Svelte Beta sein? Ich habe zu diesem Zeitpunkt keine Ahnung, wie ich den Pfad von Node-Sass zum VSCode bestimmen soll, abgesehen davon, dass ich den Vorprozess selbst geschrieben habe.

Ich bekomme das auf Master und ich glaube nicht, dass ich Node-Sass auf meinem Computer installiert habe. Typoskript funktioniert (!!!) Es gibt nur diese ziemlich nervige Flusenwarnung.

.
├── home.svelte
├── node_modules
│   ├── <strong i="6">@types</strong>
│   ├── detect-indent
│   ├── min-indent
│   ├── strip-indent
│   └── svelte-preprocess
├── package-lock.json
├── package.json
└── svelte.config.js

home.svelte

<script lang="typescript">
  export let title: string = "10";
</script>

<style>
  h2 {
    background: blue;
  }
</style>

<html lang="en">
  <h2>{parseInt(title, 10)}</h2>
</html>

svelte.config.js

const sveltePreprocess = require('svelte-preprocess')

module.exports = {
  preprocess: sveltePreprocess(),
}

CleanShot 2020-06-02 at 21 37 06@2x

Gerne testen wir etwas weiter, um dies einzugrenzen.


Ich würde auch svelte.config.js entfernen und nur einige gängige Konfigurationen einbinden lassen. Ich freue mich, eine PR zu öffnen, um dies zu ermöglichen. Bearbeiten , ich _think_ https://github.com/sveltejs/language-tools/pull/87 hat dies möglich gemacht 👏

mm Ich bin neugierig

Aha! Danke für den Zeiger!

Okay, das zeigt, dass ich nur herumgespielt habe und dies noch nicht mit einer echten App getestet habe 😆

Es gibt zwei implizite Abhängigkeiten, die im Nachhinein offensichtlich sind, aber die Warnung führt Sie in die Irre:

  1. Fehler: Modul 'svelte / package.json' kann nicht gefunden werden
  2. Fehler: [svelte-preprocess] Fehler beim Transformieren von 'Typoskript'. Modul 'Typoskript' kann nicht gefunden werden

Ich denke, es wäre cool, ein Fallback-Typescript und Svelte anzubieten, damit die Leute schnell herumspielen können, ähnlich wie VSCode mit Typescript funktioniert.

Zum Backen: Ich habe auch darüber nachgedacht, aber ich denke, die schlanke Community ist möglicherweise bereits zu sehr an benutzerdefinierte Präprozessoren gewöhnt. Wenn wir all dies im Plugin haben würden, würde dies bedeuten, Abhängigkeiten wie Node-Sass, Less, Babel, hinzuzufügen und zu installieren. Dies bläht das Plugin auf.

Um auf das spezifische Problem zurückzukommen: Es gibt zwei Probleme:

  1. Die Modulauflösung ist manchmal fehlerhaft. Warum ist etwas, das untersucht werden muss. Es ist auch erwähnenswert, dass Setups wie Garns PNP nicht funktionieren.
  2. node-sass reagiert sehr empfindlich auf die verwendete Knotenversion. Für mich ist es immer genug, die Laufzeitumgebung in den schlanken Beta-Einstellungen auf die ausführbare Datei meines Knotens festzulegen, die auch vom Rest der App verwendet wird. Wenn Sie dies nicht tun, wird die Knotenversion von VSCode verwendet, die möglicherweise nicht übereinstimmt.

@dummdidumm Ich fühle für Ihr Gefühl, aber ich persönlich denke, dass Typescript einen gewissen Bekanntheitsgrad erreicht hat, wo es erstklassige Unterstützung https://news.ycombinator.com/item?id=21376557

Ich persönlich würde den erstklassigen Babel-Support überspringen und sehen, wie viele Leute sich beschweren - die Konfiguration ist so unterschiedlich und kann eine Dose Würmer unterstützen.

Ich glaube auch nicht, dass es CSS-Lösungen gibt, die so einstimmig unterstützt werden. Da Svelte bereits eine großartige CSS-Lösung mit Gültigkeitsbereich anbietet, halte ich dies nicht für so notwendig wie getipptes Javascript.

Aha! Danke für den Zeiger!

Okay, das zeigt, dass ich nur herumgespielt habe und dies noch nicht mit einer echten App getestet habe 😆

Es gibt zwei implizite Abhängigkeiten, die im Nachhinein offensichtlich sind, aber die Warnung führt Sie in die Irre:

1. Error: Cannot find module 'svelte/package.json'

2. Error: [svelte-preprocess] Error transforming 'typescript'. Cannot find module 'typescript'

Ich denke, es wäre cool, ein Fallback-Typescript und Svelte anzubieten, damit die Leute schnell herumspielen können, ähnlich wie VSCode mit Typescript funktioniert.

Die package.json Sache ist interessant, muss das überprüfen. Es sollte auf die integrierte schlanke Version des Plugins zurückgreifen. Abgesehen davon funktioniert dies heute bereits nur für Typoskript. Sie müssen die Datei svelte.config.js vollständig löschen. Es wird dann ein Fallback verwendet, der mit Typoskript umgehen kann, aber nicht mehr. Dies ist nicht dokumentiert, da es in diesem Bereich derzeit einfach zu viele Schwankungen gibt.

Ja, das ist unglaublich! Ich habe svelte.config.js und svelte und typescript Abhängigkeiten hinzugefügt. Es wirkt wie ein Zauber!

Vielen Dank auch an beigebracht hat .

Ja, das Entfernen von svelte.config.js das Problem auch für mich gelöst

@dummdidumm Überprüft und

Initialize language server at  c:/PATH/TO/PROJECT/
Initialize new ts service at  
Trying to load config for c:/PATH/TO/PROJECT/src/App.svelte
Found config at  c:\PATH\TO\PROJECT\svelte.config.js
Using Svelte v3.22.3 from c:\PATH\TO\PROJECT\node_modules\svelte\compiler
Using Svelte v3.22.3 from c:\PATH\TO\PROJECT\node_modules\svelte\compiler
Preprocessing failed
Error: Cannot find any of modules: node-sass,sass
    at Object.exports.importAny (c:\PATH\TO\PROJECT\node_modules\svelte-preprocess\dist\utils.js:1:2844)

Ich habe auch mit dem Entfernen der svelte.config.js -Datei experimentiert, aber es hat in meinem Fall nicht funktioniert. Nach meinem Verständnis der Diskussion scheint dies jedoch nur dazu gedacht zu sein, Situationen zu beheben, in denen nur der Typoskript-Präprozessor verwendet wurde.

Die Frage, die sich dabei stellt, ist, ob Svelte nach node-sass oder sass sucht, um auf dem Systempfad zu sein, anstatt in node_modules ? Während ich node-sass lokal für das Projekt installiert habe, habe ich es nicht global installiert.

Der Fehler "Kein Modul kann gefunden werden: ..." kann auftreten, wenn das Paket nicht gefunden wird, weil die Modulauflösung es nicht gefunden hat oder weil es es gefunden hat, aber die Knotenversionen nicht übereinstimmten und Node-Sass dann auslöst ein Fehler. svelte-preprocess verschluckt beide Fehler und gibt nur "Keines der Module kann gefunden werden: ..." aus.

Ich habe es versucht und das Problem, auf das ich stoße , kann behoben werden, indem svelte.language-server.runtime wie von @dummdidumm vorgeschlagen festgelegt wird.
@JoeBobMiles Sie können versuchen, node-sass in einer js-Datei zu benötigen und die Datei mit dem Knoten ausführen, um festzustellen, ob Fehler vorliegen.

const nodeSass = require('node-sass')

console.log(nodeSass)

@JoeBobMiles Während dieser Testreihe habe ich nicht nur svelte.config.js sondern auch sass als DevDependency installiert (ich hatte nur Node-Sass) und Node-Sass global installiert.

Nachdem dies bereits zuvor getan wurde, ohne Erfolg, als ich die JS-Datei entfernte, funktionierte Svelte Beta, aber ich weiß wirklich nicht, welche dieser anderen Details ich davon betroffen hatte, und ich kann es im Moment nicht testen.
Lassen Sie uns wissen, ob eine dieser zusätzlichen Änderungen das Problem lösen könnte. Starten Sie außerdem bei jedem Versuch die Sprachwerkzeuge und das vscode-Fenster neu.

@ jasonlyu123 Danke für den Rat. Bei Verwendung Ihres Code-Snippets habe ich keine Fehler erhalten, daher gehe ich davon aus, dass node-sass tatsächlich funktioniert. (Obwohl ich gerade beim Eingeben festgestellt habe, dass diese Überprüfung redundant war, da Webpack ohne Probleme kompiliert wurde.)

Es scheint jedoch, dass node-sass das Problem war. Nach der Installation von sass (und nur der Installation von sass ) hat Svelte Beta die Meldung von Warnungen eingestellt. Ich habe node-sass aus meinem Projekt entfernt und die Warnungen wurden nicht erneut angezeigt. Anscheinend suchte Svelte Beta nur nach sass anstatt nach sass oder node-sass .

Außerdem habe ich damit herumgespielt, den Wert von lang von scss auf sass zu ändern, und dabei ein komisches Verhalten beim Flusen bemerkt. Während sich Svelte Beta nicht mehr beschwert, scheint es dem CSS-Linter von VS Code nicht zu gefallen, die einrückungsbasierte Sass-Syntax in einem Style-Tag zu sehen:

SvelteWarning004

Obwohl ich denke, dass dies eher ein VS-Code-Problem als ein Svelte-Beta-Problem ist.

SASS wird derzeit leider nicht unterstützt. Wir verwenden https://github.com/microsoft/vscode-css-languageservice/tree/master/src für das Flusen usw. und diese Bibliothek unterstützt SASS nicht.

Obwohl Ihre Fehler durch Problemumgehungen behoben zu sein scheinen, möchte ich dies dennoch offen lassen, falls jemand anderes auf dieses Problem stößt, und auch, um diesem Problem auf den Grund zu gehen.

Ein bisschen Feedback zum Thema. Ich bin auf dasselbe Problem gestoßen und habe es durch Setzen von "svelte.language-server.runtime": "/<LOCAL_PATH>/bin/node" behoben.

Ich denke, dies liegt daran, dass die Standard-Knotenlaufzeit in der vscode-Erweiterung Code Helper (Renderer) elektronenspezifisch erstellt wurde, was Probleme beim Auflösen der nativen Bibliothek wie Node-Sass hat.

ps aux Ausgabe:

/Applications/Visual Studio Code.app/Contents/Frameworks/Code Helper (Renderer).app/Contents/MacOS/Code Helper (Renderer) --inspect=6009 /Users/username/.vscode/extensions/svelte.svelte-vscode-99.0.39/node_modules/svelte-language-server/bin/server.js --node-ipc --clientProcessId=72991

Müssen dies irgendwo dokumentieren. Oder besser, versuchen Sie standardmäßig, eine normale Knoten-Binärdatei für den Benutzer direkt in der Erweiterung zu finden, z. B. exec('/usr/bin/env which node') (Sie sind sich jedoch nicht sicher, wie Sie dies unter Windows tun sollen).

Es ist dokumentiert und die Warnung in der IDE weist ebenfalls darauf hin.

Warnungen werden in der kommenden Produktversion besser sein, können bereits jeden Abend getestet werden. Ich hoffe, dass dies das Problem in Zukunft eingrenzen wird. Da in diesem Problem bereits zu viele Dinge parallel ablaufen, von denen die meisten, wenn nicht alle, gelöst werden, werde ich dies schließen. Wenn ein SCSS-Problem auftritt, öffnen Sie bitte ein neues Problem.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen