У меня есть angular monorepo, настроенный через Nrwl, и я использую Тематика Angular Material, который использует SASS.
Я хочу, чтобы исходные файлы SCSS импортировались на уровне проекта, где я переопределю цветовые переменные по умолчанию для тематики.
Проблема, с которой я сталкиваюсь, заключается в том, что я хочу импортировать исходные файлы SCSS в другие приложения / библиотеки в моем монорепозитории и в проекты за пределами этого монорепозитория.
Я могу написать свой импорт как:
@import "../other-lib/style.scss";
... который будет работать для всего, что находится внутри монорепозитория.
Или я могу написать это так:
@import "~@my-organization/other-lib/style.scss";
... который не будет работать внутри моего монорепозитория, AFAIK.
Как заставить его работать в обоих контекстах?
Это настроено примерно так, как показано на диаграмме ниже.
На данный момент мы будем использовать переменные css в нашем проекте. Мы также изучаем решения css-in-js на будущее.





Думаю, у меня здесь что-то есть, это решение, которое я принял после некоторого разговора с командой NRWL.
Я создаю рабочее пространство NX, сначала создавая проект с помощью angular CLI, а затем добавляя расширения, например:
Кроме того, на сегодняшний день (10 июля 2019 г.) я сообщил об ошибке, что, хотя рабочая область уже имеет тип angular, а установка @nrwl распознает это и устанавливает @ nrwl / angular, она неправильно настраивает значение по умолчанию. schematics, что означает, что команды «ng» не будут выполняться без добавления «@ nrwl / angular:» перед командой (например, «ng @ nrwl / angular: g module mymod»). Итак, вам нужно запустить установку (выберите scss и любой другой бегунок e2e, который вы хотите):
Он сообщит вам, что @ nrwl / angular уже установлен, но изменит файлы конфигурации, чтобы распознать angular как коллекцию схем по умолчанию, и ваши команды ng снова будут работать, как ожидалось.
Вот и все по рабочему пространству. Теперь создайте библиотеку:
Это поместит библиотеку с именем scss в libs-> таблицы стилей. В каталоге "lib" этой библиотеки сделайте дамп всех ваших файлов scss. Предположим, вы поместили файл "variables.scss" в этот каталог lib.
Это делает несколько вещей:
Если вы посмотрите, то увидите, что запись «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 может показывать ошибку там, где ее технически нет.
Это хорошо работает для моих проектов.
Как мы можем использовать эти переменные из другой библиотеки?
Не уверен, что я понимаю, вы имеете в виду, как использовать переменные стиля из одной библиотеки стилей в другой библиотеке стилей?
Да. У меня есть библиотека, содержащая все мои переменные scss, и я хочу импортировать их из другой библиотеки, но, похоже, она не работает
Держу пари, это твой конфиг. Как вы создавали библиотеки, видите ли вы пути к ним в angular.json? Определенно потребуется дополнительная информация о вашей настройке.
Я думал, что мне нужно использовать stylePreprocessorOptions для библиотек, но на самом деле, просто поместив это в само приложение, сработало! Большое спасибо
Я бы сделал, но ... Я не тот, кто просил!
Если вы уже используете serve до внесения этого изменения, сборка, запущенная наблюдателем, завершится ошибкой. Просто завершите процесс подачи и перезапустите его, и он будет работать. Мне потребовалось несколько минут, чтобы понять это. У меня до сих пор нет поддержки IDE для имен переменных, хотя в vscode.
Как правило, всякий раз, когда вы вносите изменения на уровне мета-конфигурации, вы должны перезапускать все запущенные процессы, чтобы загрузить эти изменения в среду выполнения. Я не думаю, что angular.json изменит какие-либо горячие часы.
знаете ли вы, как справиться с этой же ситуацией с помощью простого CSS?
Вы пробовали ту же процедуру, но только с CSS? Я не вижу причины, по которой это не сработает.
Как использовать эту библиотеку (scss) в другом приложении angular, которое не является частью monorepo и создано angular cli?
Вы должны создать его и распространить (в виде файла или в реестр), как обычно. Если вы используете рабочую область nx, установите ng-packagr и используйте его для сборки своей библиотеки. Затем упакуйте его, и у вас будет архив, который вы можете распространять. Обратите внимание, что для разработки вы можете npm ссылаться на встроенную (но распакованную) библиотеку. Это поместит указатель в ваши node_modules на созданные биты, что дает вам преимущество, позволяющее работать с библиотекой и приложением одновременно, и даже видеть обновления --watch, когда вы вносите изменения в любой из них.
У меня точно такой же вопрос. Я могу поместить их все где-нибудь в каталог верхнего уровня и просто выполнить обычный долгий импорт. Настройка «путей», похоже, не работает (вы настраиваете путь, но оператор импорта в таблице стилей не распознает его). Я подумал, что попробую импортировать их в файл styles.scss в библиотеке и попытаться экспортировать, но здесь пока не повезло (хотя я еще не пробовал все, что не думаю). Определенно утомительный, природа sass и т. д. Интуитивно кажется очень монорежимной, но импорт чрезвычайно многословен. Какая здесь устоявшаяся практика?