TL; DR: Мой вопрос в том, как объединить некоторые из моих файлов sass в один файл sass?
Я разрабатываю библиотеку компонентов Angular и упаковываю ее с помощью ng-packagr. Назовем его @my-lib/ngx-components.
Потребители моей библиотеки будут импортировать мои компоненты, например @my-lib/ngx-components/navbar.
Я решил добавить к компонентам поддержку тем.
Например, у меня есть компонент панели навигации с цветами по умолчанию (фон, текст, наведение и т. д.). Я хочу, чтобы пользователи моей библиотеки могли переопределить эти цвета своей собственной темой. Вот почему я написал mixin, который принимает ввод $theme и переопределяет некоторые правила css следующим образом (это базовая версия того, что у меня есть)
_navbar-theme.sass
@mixin navbar-theme($theme)
$primary-color: map-get($theme, primary-color)
$secondary-color: map-get($theme, secondary-color)
$color: map-get($theme, color)
.navbar
background-color: $primary-color
color: $color
&:hover
background-color: $secondary-color
Каждый компонент имеет свой собственный файл *-theme.sass.
У меня также есть глобальный файл _theming.sass, который импортирует все это следующим образом
_theming.sass
@import './components/navbar/navbar-theme'
@import './components/button/button-theme'
@import './components/dropdown/dropdown-theme'
Я хочу экспортировать этот файл _theming.sass из моей библиотеки, чтобы люди могли импортировать этот файл в свой собственный файл sass как @import '~@my-lib/ngx-components/theming' и начать использовать все доступные mixin.
Если они хотят иметь собственные navbar, button и т. д., Они должны иметь возможность использовать эти mixin с одним импортом.
Я попытался сделать это похоже на настройку темы angular-material.
Сначала я попробовал node-sass, который уже находится в моих зависимостях. Но он пытается встроить sass в css, поэтому он пропускает миксины в выходном файле.
Затем я посмотрел, что сделал angular-material. Они используют scss-пакет
Я подумал: «Это именно то, что я хочу». Однако для этого требуются файлы scss, а не файлы sass. Он не может читать файлы sass.
Затем я подумал: «Хорошо, я могу отказаться от sass и начать использовать scss. Как мне преобразовать все эти файлы в scss, не просматривая их вручную». Затем я нашел sass-convert. В этом вопросе было сказано, что я могу использовать его в командной строке. Однако, когда я устанавливаю sass-convert с npm глобально, он не дает мне исполняемого файла командной строки. Думаю, мне нужен Gulp для его использования.
Я с самого начала хотел использовать Gulp, потому что это означает еще один инструмент для изучения и усложняет кодовую базу.
В этот момент я чувствую себя "Хэл ремонт лампочки"
TL; DR: Мой вопрос в том, как объединить некоторые из моих файлов sass в один файл sass?
Кроме того, если вы можете предложить решение, для которого требуется веб-пакет, это тоже нормально.






Выскажем свое мнение или вопросы:
I want to export this _theming.sass file from my lib, so people can import this file in their own sass file as @import '~@my-lib/ngx-components/theming' and start using all of the mixins available. If they want to have custom navbar, button etc, they should be able to use those mixins with single import.
Вам нужно знать, какова ваша целевая аудитория. В основном люди используют angular cli для создания своих приложений, таких как шаблон.
Итак, вам нужно предоставить комплект css (люди просто хотят импортировать ваш css) и комплект sass (кто хочет использовать ваш объект или ваш миксин).
I want to export this _theming.sass file from my lib, so people can import this file in their own sass file as @import '~@my-lib/ngx-components/theming' and start using all of the mixins available. If they want to have custom navbar, button etc, they should be able to use those mixins with single import.
I tried to make it look like angular-material theming setup.
Во-первых, вам нужно знать, что @angular/material не экспортирует sass (они используют scss), но они экспортируют css, скомпилированный scss-bundle (как вы его упомянули), см. Их код и документацию тема.
I thought "this is exactly what I want." However, it requires scss files, not sass files. It cannot read sass files.
Я хотел бы процитировать этот отвечать:
Sass is a CSS pre-processor with syntax advancements. Style sheets in the advanced syntax are processed by the program, and turned into regular CSS style sheets. However, they do not extend the CSS standard itself.
Лучше вам перенести свой код из sass в scss (самостоятельно), это не так уж много (я думаю, я всегда пишу scss вместо файла sass).
Когда вы доставляете свои библиотеки компонентов, вы должны предоставить css и scss. Beacuse angular cli по умолчанию не предоставляет загрузчик scss.
Не используйте файл sass, используйте файл scss, см. Мой ответ наверху.
пакет scss + веб-пакет
Поскольку вам необходимо предоставить css, вы можете использовать плагин оболочки webpack для объединения scss. Scss должен предоставить cli, если вы хотите использовать cli.
Хорошо, для этого случая возьмем образец из модуля bootstrap @ 4. Структура использования начальной загрузки, подобная этой (Документы):
scss
|-- _variables.scss
|-- _mixins.scss
|-- _functions.scss
|-- ...
|-- index.scss
внутри index.scss будет так:
@import 'variables'
@import 'mixins'
@import 'functions'
...
Итак, этот scss вы должны поставить рядом с css. Как и bootstrap, так и mixin будет доступен потребителю. Также это хороший подход, когда потребитель находит файл scss в папке scss (легко указать, какой файл scss вставлен).
Для объединения в один файл вам необходимо создать средство запуска задач, чтобы сделать это. В вашем случае, если вы хотите использовать веб-пакет, вы можете создать для этого плагин.
Вот пример плагина:
вызвать вам config webpack:
plugins: [
new webpack.NoEmitOnErrorsPlugin(),
new SCSSBundlePlugin({
file: path.join(__dirname, 'src/index.scss')
})
],
Чтобы попробовать игровую площадку, проверьте привет-мир-загрузчик, затем:
# install dependency
npm install
# try play ground
npm run webpack
он создаст файл _theme.scss на ./dist.
Мой совет не использовать веб-пакет, вместо этого используйте средство запуска задач (gulp или grunt) в этом простом случае. Webpack тоже продвинутая и сложная для написания задача.
Спасибо, проверю. Работает ли он и с файлами sass, или мне все равно нужно их конвертировать?
@BunyaminCoskuner, я нацелен на файл scss, просто клонирую и npm run webpack. Если вы хотите попробовать с sass, измените расширение .scss в webpack.config.js и scss-bundle-plugin.js на расширение .sass. это просто дать вам представление
Хорошо, попробую и сообщу результат в течение нескольких часов. Спасибо за вашу помощь.
Я клонировал ваше репо, все заработало как есть. Когда я заменил файлы .scss на .sass и отредактировал webpack.config.js, он не смог прочитать файлы. Я думаю, мне нужно их преобразовать, но у меня слишком много файлов sass, и на их преобразование вручную уйдут часы. Ты хоть представляешь, как это сделать?
@BunyaminCoskuner, какой пример синтаксиса для импорта? Я использую импорт синтаксического анализа, как этот @import "foo";
Если хочешь, я могу открыть PR, а ты над этим поработаешь?
проверьте свое репо
@BunyaminCoskuner, только что обновился на github, можете проверить
Только что проверил и работает! Спасибо за помощь! Теперь у меня есть пример, над которым я могу работать. Наслаждайтесь своей наградой :)
Мое решение для файлов scss / sass Я использовал небольшой модуль bundle-scss
Он объединяет файлы по маске имени файла. Поэтому вам нужно передать правильную маску, например ./src/**/*.theme.scss, указать целевой файл и, возможно, ваш собственный порядок сортировки
Вам не нужно создавать один файл точки входа со всем импортом. bundle-scss получит все файлы по маске, проанализирует весь импорт и также включит эти файлы
Проблема в том, что мои файлы - это файлы sass. Если я смогу преобразовать их в файлы scss, обо всем остальном я позабочусь. Преобразовывать их вручную было бы слишком сложно. Есть ли какой-нибудь инструмент, который справляется с этим процессом?
На самом деле, я могу расширить этот модуль для использования с sass, также
Bundle-scss также поддерживает sass
как запустить его в vanilla js, а не s
Лучше запустить его в процессе сборки. в узле вы можете сделать что-то вроде const bundleScss = require("bundle-scss"); bundleScss(mask, dest, sort?), поскольку пакет результатов сохраняет файл результата на диске. и вы можете обрабатывать с помощью node-sass
Также существует широко используемый пакет под названием scss-пакет.
Его довольно просто использовать, вы просто создаете файл конфигурации со всей необходимой конфигурацией, а затем запускаете scss-bundle.
Это, например, будет использовать все файлы scss, импортированные в entry.scss, и перемещать их в out.scss. Все операции импорта будут разрешены, за исключением тем angular в этом примере, например @import '~@angular/material/theming';.
scss-bundle.config.json:
{
"bundlerOptions": {
"entryFile": "my-project/src/entry.scss",
"outFile": "dist/out.scss",
"rootDir": "my-project/src",
"project": "../../",
"ignoreImports": [
"~@angular/.*"
],
"logLevel": "debug"
}
}
Спасибо за интерес к этому вопросу. Давно решил. Моя первоначальная проблема заключалась в том, что я использовал sass вместо scss. Вот почему я сначала не мог использовать этот пакет.
ах, приятно знать! Подумал, что это может быть полезно другим парням, читающим этот вопрос :)
Добавьте комментарий, что угловой материал (угловые компоненты) использует его.
Я уже предоставляю css в своей библиотеке. Я просто хочу собрать несколько миксинов вместе и отправить один файл
theming.scss. Как вы предложили, я хочу изменить свои файлы sass на scss. Однако их много. Я не мог найти простого способа сделать это. Если вы можете помочь мне с этим, я дам вам награду.