Как лучше добиться полноценной работы SCSS модулей во Vue 3?

Ссылка скопирована
1 ответ

По вводным: сделал во Vue 3 SCSS модули. Но когда делаешь:

<style module lang="scss"> .root { &__header { ... } } </style>

Сейчас ситуация такая: tS не видит, что в $styles помимо.root, есть ещё и root__header (а в рантайме он по сути есть и корректно работает).
Сейчас ситуация такая: если указать не &__header, а явно.root__header, то всё работает и TS видит оба класса. Хотелось бы не дублировать и сохранить синтаксис с "&".

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
WordPress-редакция Ответ

SCSS-модули во Vue 3 нормально работают, если проект собран через Vite/Vue CLI и установлен препроцессор Sass. Важно различать обычный scoped SCSS и CSS Modules. Это разные механики: <style scoped lang="scss"> изолирует стили по data-атрибутам, а <style module lang="scss"> создаёт объект классов.

Для Vite установите Sass:

npm install -D sass

npm install -D sass

Обычный scoped SCSS:

&lt;template&gt;
  &lt;div class="card"&gt;Text&lt;/div&gt;
&lt;/template&gt;
 
&lt;style scoped lang="scss"&gt;
.card {
  padding: 16px;
  &amp;:hover {
    color: #2563eb;
  }
}
&lt;/style&gt;

&lt;template&gt; &lt;div class="card"&gt;Text&lt;/div&gt; &lt;/template&gt; &lt;style scoped lang="scss"&gt; .card { padding: 16px; &amp;:hover { color: #2563eb; } } &lt;/style&gt;

CSS Modules во Vue:

&lt;template&gt;
  &lt;div :class="$style.card"&gt;Text&lt;/div&gt;
&lt;/template&gt;
 
&lt;style module lang="scss"&gt;
.card {
  padding: 16px;
}
&lt;/style&gt;

&lt;template&gt; &lt;div :class="$style.card"&gt;Text&lt;/div&gt; &lt;/template&gt; &lt;style module lang="scss"&gt; .card { padding: 16px; } &lt;/style&gt;

Если используете Composition API и хотите получить классы в script:

&lt;script setup&gt;
import { useCssModule } from 'vue'
const styles = useCssModule()
&lt;/script&gt;

&lt;script setup&gt; import { useCssModule } from 'vue' const styles = useCssModule() &lt;/script&gt;

Частая путаница: класс из CSS Modules нельзя писать как обычный class="card", он будет переименован. Нужно использовать $style.card. А для scoped стилей наоборот не нужен $style.

Если нужны глобальные переменные/mixins SCSS, настройте additionalData в Vite, но не импортируйте огромные CSS-файлы в каждый компонент.

Итог: поставьте sass, выберите либо scoped SCSS, либо CSS Modules, и используйте правильный синтаксис. Для большинства компонентов достаточно <style scoped lang="scss">; modules нужны, когда классы должны быть доступны как JS-объект.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно