Как управлять таблицами стилей SCSS в монорепозитории с разными переменными, разделяющими библиотеки?

У меня есть angular monorepo, настроенный через Nrwl, и я использую Тематика Angular Material, который использует SASS.

Я хочу, чтобы исходные файлы SCSS импортировались на уровне проекта, где я переопределю цветовые переменные по умолчанию для тематики.

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу импортировать исходные файлы SCSS в другие приложения / библиотеки в моем монорепозитории и в проекты за пределами этого монорепозитория.

Я могу написать свой импорт как:

@import "../other-lib/style.scss";

... который будет работать для всего, что находится внутри монорепозитория.

Или я могу написать это так:

@import "~@my-organization/other-lib/style.scss";

... который не будет работать внутри моего монорепозитория, AFAIK.

Как заставить его работать в обоих контекстах?

Это настроено примерно так, как показано на диаграмме ниже.

Как управлять таблицами стилей SCSS в монорепозитории с разными переменными, разделяющими библиотеки?

У меня точно такой же вопрос. Я могу поместить их все где-нибудь в каталог верхнего уровня и просто выполнить обычный долгий импорт. Настройка «путей», похоже, не работает (вы настраиваете путь, но оператор импорта в таблице стилей не распознает его). Я подумал, что попробую импортировать их в файл styles.scss в библиотеке и попытаться экспортировать, но здесь пока не повезло (хотя я еще не пробовал все, что не думаю). Определенно утомительный, природа sass и т. д. Интуитивно кажется очень монорежимной, но импорт чрезвычайно многословен. Какая здесь устоявшаяся практика?

Tim Consolazio 01.07.2019 14:42

На данный момент мы будем использовать переменные css в нашем проекте. Мы также изучаем решения css-in-js на будущее.

Kevin Beal 02.07.2019 19:28
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
27
2
4 700
1

Ответы 1

Думаю, у меня здесь что-то есть, это решение, которое я принял после некоторого разговора с командой NRWL.

Я создаю рабочее пространство NX, сначала создавая проект с помощью angular CLI, а затем добавляя расширения, например:

  • нг новый мойпроект (cd в корень myproject)
  • нг добавить @ nrwl / workspace

Кроме того, на сегодняшний день (10 июля 2019 г.) я сообщил об ошибке, что, хотя рабочая область уже имеет тип angular, а установка @nrwl распознает это и устанавливает @ nrwl / angular, она неправильно настраивает значение по умолчанию. schematics, что означает, что команды «ng» не будут выполняться без добавления «@ nrwl / angular:» перед командой (например, «ng @ nrwl / angular: g module mymod»). Итак, вам нужно запустить установку (выберите scss и любой другой бегунок e2e, который вы хотите):

  • нг добавить @ nrwl / angular

Он сообщит вам, что @ nrwl / angular уже установлен, но изменит файлы конфигурации, чтобы распознать angular как коллекцию схем по умолчанию, и ваши команды ng снова будут работать, как ожидалось.

Вот и все по рабочему пространству. Теперь создайте библиотеку:

  • ng g lib scss --directory = таблицы стилей

Это поместит библиотеку с именем scss в libs-> таблицы стилей. В каталоге "lib" этой библиотеки сделайте дамп всех ваших файлов scss. Предположим, вы поместили файл "variables.scss" в этот каталог lib.

Это делает несколько вещей:

  • Когда вы создали библиотеку, в вашу конфигурацию репозитория добавляется запись «paths». Это позволяет вам использовать ресурсы в библиотеке, используя этот путь вместо длинного относительного импорта. Обратите внимание, что просто добавить эту запись и попытаться импортировать файлы scss в другие файлы scss без оболочки библиотеки не работает. Очевидно, вам нужна эта библиотека, чтобы разрешить этот путь.

Если вы посмотрите, то увидите, что запись «paths» выглядит примерно так:

"@ nameofrepo-nameoflib"

Чтобы использовать ресурсы scss в библиотеке в angular.json, вам нужно вручную (не идеально, но он есть) добавить приведенный ниже фрагмент в раздел build.options КАЖДОГО И КАЖДОГО ПРОЕКТА, КОТОРЫЙ ВЫ ХОТИТЕ ИСПОЛЬЗОВАТЬ. В.

Итак, да, если у вас десять проектов, каждый будет иметь запись проекта в angular.json, каждый из них будет иметь блок build.options (обычно оканчивающийся на «scripts []», по крайней мере, в моей ванильной установке), и вы нужно добавить это в каждый из этих разделов опций (эта информация там есть, но я хотел подтвердить, что это прямо от команды NRWL):

"stylePreprocessorOptions": {
    "includePaths": ["libs/stylesheets/scss/src/lib"]
},
"extractCss": true

Теперь предположим, что вы создали приложение и добавили указанную выше конфигурацию в запись в angular.json:

приложение ng g myapp

И что в этом приложении вы создали функциональный модуль и компонент:

(cd в apps / myapp / src)

моя функция модуля ng g компонент ng g myfeature

Это создаст папку с модулем и компонентом, активы и т. д.

ПРИМЕЧАНИЕ. По состоянию на ту же дату, что и выше, существует проблема, заключающаяся в том, что при непосредственном создании компонента таким образом создается файл .css, даже если для проекта выбран тип .scss. Убедитесь, что вы переименовали этот файл и изменили на него указатель компонента.

В myfeature.component.scss вы должны импортировать "variables.scss" из своей библиотеки следующим образом:

@import "переменные"

Обратите внимание, что нет символа "~" (который разрешается в node_modules). И, если у вас есть подкаталоги в каталоге "lib" (например, utils), просто укажите путь к нему, как и следовало ожидать:

@import "utils / somefile"

Опять же ... вы ДОЛЖНЫ настроить параметры препроцессора, как указано в КАЖДОЙ записи проекта в angular.json!

Еще одна проблема: эти пути могут или не могут показаться разрешенными в вашей среде IDE. Как ни странно, кажется, что некоторые делают, а некоторые нет. Не совсем уверен в шаблоне здесь, но имейте в виду, что ваша IDE может показывать ошибку там, где ее технически нет.

Это хорошо работает для моих проектов.

Как мы можем использовать эти переменные из другой библиотеки?

maxime1992 23.09.2019 08:55

Не уверен, что я понимаю, вы имеете в виду, как использовать переменные стиля из одной библиотеки стилей в другой библиотеке стилей?

Tim Consolazio 24.09.2019 12:42

Да. У меня есть библиотека, содержащая все мои переменные scss, и я хочу импортировать их из другой библиотеки, но, похоже, она не работает

maxime1992 25.09.2019 12:49

Держу пари, это твой конфиг. Как вы создавали библиотеки, видите ли вы пути к ним в angular.json? Определенно потребуется дополнительная информация о вашей настройке.

Tim Consolazio 25.09.2019 14:26

Я думал, что мне нужно использовать stylePreprocessorOptions для библиотек, но на самом деле, просто поместив это в само приложение, сработало! Большое спасибо

maxime1992 26.09.2019 12:03

Я бы сделал, но ... Я не тот, кто просил!

maxime1992 27.09.2019 22:41

Если вы уже используете serve до внесения этого изменения, сборка, запущенная наблюдателем, завершится ошибкой. Просто завершите процесс подачи и перезапустите его, и он будет работать. Мне потребовалось несколько минут, чтобы понять это. У меня до сих пор нет поддержки IDE для имен переменных, хотя в vscode.

crush 04.10.2019 04:47

Как правило, всякий раз, когда вы вносите изменения на уровне мета-конфигурации, вы должны перезапускать все запущенные процессы, чтобы загрузить эти изменения в среду выполнения. Я не думаю, что angular.json изменит какие-либо горячие часы.

Tim Consolazio 04.10.2019 15:23

знаете ли вы, как справиться с этой же ситуацией с помощью простого CSS?

Optiq 22.03.2020 07:58

Вы пробовали ту же процедуру, но только с CSS? Я не вижу причины, по которой это не сработает.

Tim Consolazio 23.03.2020 11:39

Как использовать эту библиотеку (scss) в другом приложении angular, которое не является частью monorepo и создано angular cli?

Jose Loor 02.12.2020 03:24

Вы должны создать его и распространить (в виде файла или в реестр), как обычно. Если вы используете рабочую область nx, установите ng-packagr и используйте его для сборки своей библиотеки. Затем упакуйте его, и у вас будет архив, который вы можете распространять. Обратите внимание, что для разработки вы можете npm ссылаться на встроенную (но распакованную) библиотеку. Это поместит указатель в ваши node_modules на созданные биты, что дает вам преимущество, позволяющее работать с библиотекой и приложением одновременно, и даже видеть обновления --watch, когда вы вносите изменения в любой из них.

Tim Consolazio 16.12.2020 19:07

Другие вопросы по теме