Décrivez le bogue
J'ai rencontré une erreur lorsque j'utilise la nouvelle fonctionnalité de syntaxe CSS Media Queries Level 4 à VS Code dans le composant Svelte.
<style>
<strong i="9">@media</strong> (width >= 768px) { // <--- error line
.nav {
padding: 16px 24px;
}
}
</style>
J'utilise la dernière version de Sapper :
// ...
"sapper": "^0.27.15",
"svelte": "^3.23.2"
}
Mais Svelte linter m'affiche toujours cette erreur (voir aussi capture d'écran 1) :
Colon is expected. If you expect this syntax to work, here are some suggestions:
If you use less/SCSS with `svelte-preprocessor`, did you add `lang="scss"`/`lang="less"`
to you `style` tag? If you use SCSS, it may be necessary to add the path to your NODE
runtime to the setting `svelte.language-server.runtime`, or use `sass` instead of `node-sass`.
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.svelte(css-syntax-error)
OK, je vois cette erreur dans les fichiers *.css
normaux, mais si je définis le paramètre de validation CSS VS Code css.validate
sur false
cette erreur a disparu.
J'essaie de définir svelte.plugin.css.diagnostics.enable
sur false
, mais je vois toujours le message css-syntax-error
de Svelte (voir aussi capture d'écran 2).
Reproduire
Étapes pour reproduire le comportement :
<style>...</style>
dans le composant *.svelte
Comportement prévisible
Aucune erreur après l'ajout d'une nouvelle syntaxe CSS.
Captures d'écran
Système (veuillez compléter les informations suivantes) :
Versions VS Code et Node :
Version: 1.46.0
Commit: a5d1cc28bb5da32ec67e86cc50f84c67cc690321
Date: 2020-06-10T08:59:06.977Z
Electron: 7.3.1
Chrome: 78.0.3904.130
Node.js: 12.8.1
V8: 7.8.279.23-electron.0
OS: Darwin x64 18.7.0
Contexte supplémentaire
Une solution possible, peut-être, permet d'ajouter une valeur spéciale à l'attribut <style lang="...">...</style>
pour prendre en charge toutes les nouvelles fonctionnalités CSS, car il ne s'agit que d'un _mauvais problème UX/vue_.
Toute nouvelle syntaxe après npm run build
traitée par le plugin postcss-media-minmax
vers l'ancienne syntaxe CSS, comme :
<strong i="61">@media</strong> (width >= 768px) ---> <strong i="62">@media</strong> (min-width: 786px)
Pouvez-vous essayer de configurer le prétraitement après cela et voir si l'erreur svelte existe toujours ? Cela devrait être similaire à votre configuration de construction, dans votre cas, cela devrait être postcss.
En ce qui concerne l'erreur css, nous utilisons le service de langage css de vscode, nous ne pouvons donc pas faire grand-chose tant qu'ils ne prennent pas en charge cette syntaxe.
@jasonulu123 salut ! Merci pour votre réponse.
Voici mon rollup.config.js
pour Sapeur :
import resolve from "@rollup/plugin-node-resolve";
import replace from "@rollup/plugin-replace";
import commonjs from "@rollup/plugin-commonjs";
import svelte from "rollup-plugin-svelte";
import babel from "@rollup/plugin-babel";
import { terser } from "rollup-plugin-terser";
// Import svelte-preprocess
import sveltePreprocess from "svelte-preprocess";
// Import PostCSS plugins
import autoprefixer from "autoprefixer";
import pimport from "postcss-import";
import minmax from "postcss-media-minmax";
import csso from "postcss-csso";
import config from "sapper/config/rollup.js";
import pkg from "./package.json";
const mode = process.env.NODE_ENV;
const dev = mode === "development";
const legacy = !!process.env.SAPPER_LEGACY_BUILD;
const onwarn = (warning, onwarn) =>
(warning.code === "CIRCULAR_DEPENDENCY" &&
/[/\\]@sapper[/\\]/.test(warning.message)) ||
onwarn(warning);
// Define svelte-preprocess
const preprocess = sveltePreprocess({
postcss: {
plugins: [pimport, minmax, autoprefixer, csso], // --> add PostCSS plugins
},
});
export default {
client: {
input: config.client.input(),
output: config.client.output(),
plugins: [
replace({
"process.browser": true,
"process.env.NODE_ENV": JSON.stringify(mode),
}),
svelte({
dev,
preprocess, // --> add sveltePreprocess
hydratable: true,
emitCss: true,
}),
resolve({
browser: true,
dedupe: ["svelte"],
}),
commonjs(),
legacy &&
babel({
extensions: [".js", ".mjs", ".html", ".svelte"],
babelHelpers: "runtime",
exclude: ["node_modules/@babel/**"],
presets: [
[
"@babel/preset-env",
{
targets: "> 0.25%, not dead",
},
],
],
plugins: [
"@babel/plugin-syntax-dynamic-import",
[
"@babel/plugin-transform-runtime",
{
useESModules: true,
},
],
],
}),
!dev &&
terser({
module: true,
}),
],
preserveEntrySignatures: false,
onwarn,
},
server: {
input: config.server.input(),
output: config.server.output(),
plugins: [
replace({
"process.browser": false,
"process.env.NODE_ENV": JSON.stringify(mode),
}),
svelte({
generate: "ssr",
preprocess, // --> add sveltePreprocess
dev,
}),
resolve({
dedupe: ["svelte"],
}),
commonjs(),
],
external: Object.keys(pkg.dependencies).concat(
require("module").builtinModules ||
Object.keys(process.binding("natives"))
),
preserveEntrySignatures: "strict",
onwarn,
},
serviceworker: {
input: config.serviceworker.input(),
output: config.serviceworker.output(),
plugins: [
resolve(),
replace({
"process.browser": true,
"process.env.NODE_ENV": JSON.stringify(mode),
}),
commonjs(),
!dev && terser(),
],
preserveEntrySignatures: false,
onwarn,
},
};
Corrigez-moi s'il vous plaît si je me trompe, mais avec rollup.config.js
je n'ai pas besoin de créer svelte.config.js
fichier séparé sveltePreprocess({...})
? 🤔
Si je définis l'attribut lang
(ou type
) pour <style>
à postcss
(ou text/postcss
), je vois la même erreur et très coloration syntaxique étrange à tout le code CSS :
Copiez simplement la section de prétraitement dans svelte.config.js ou déplacez-la vers svelte.config.js et exigez-la de votre configuration de build. Le serveur de langage utilise svelte pour compiler votre code en interne, il doit donc également savoir le prétraiter.
@jasonulu123 merci ! Cette erreur de résolution :
// svelte.config.js
const sveltePreprocess = require("svelte-preprocess");
const autoprefixer = require("autoprefixer");
const pimport = require("postcss-import");
const minmax = require("postcss-media-minmax");
const csso = require("postcss-csso");
module.exports = {
preprocess: sveltePreprocess({
postcss: {
plugins: [pimport, minmax, autoprefixer, csso],
},
}),
};
Mais comment mettre en évidence la syntaxe en CSS normal, comme avant ?
Si votre CSS n'a pas de syntaxe spécifique postcss. Vous pouvez supprimer l'attribut lang.
@jasonulu123 merci !
De plus, j'ai défini svelte.plugin.css.diagnostics.enable
sur false
pour supprimer cette erreur CSS :
) expectedcss(css-rparentexpected)
Commentaire le plus utile
@jasonulu123 merci !
De plus, j'ai défini
svelte.plugin.css.diagnostics.enable
surfalse
pour supprimer cette erreur CSS :