Как я могу использовать стороннюю библиотеку CSS в CSS компонента Angular без дублирования библиотеки?

#css #angular #typescript #sass

#css #angular #typescript #sass

Вопрос:

У меня есть два компонента, которые оба полагаются на эффекты от hover.css . Оба компонента имеют файлы SASS, которые (упрощенно) выглядят примерно так:

 @import '~hover.css/scss/hover';

.some-class a {
  @include underline-from-left;
}
  

Кроме того, у меня есть hover.css библиотека, включенная в мои глобальные стили в style.css :

 @import '~hover.css/scss/hover';

.some-global-class {
  @include some-other-mixin-from-hover;
}
  

Все это работает и отлично компилируется, за исключением довольно большой ложки дегтя, которую я получаю полностью hover.css в своем скомпилированном приложении три раза — один раз в styles.js и дважды в main.js (по одному разу для каждого компонента). Очевидно, что это не устойчивый шаблон.

Однако, если я не @import наведу.css на свои компоненты, Angular не будет их компилировать, потому что они ссылаются на mixin, который невозможно найти. Я пробовал глубокую привязку только к тем эффектам, которые мне нужны из hover.css , но это осиное гнездо, потому что эти файлы имеют нижестоящие зависимости от других частей библиотеки наведения. Очевидно, что это не относится конкретно к hover, но к любому сценарию, в котором вы хотели бы импортировать и использовать библиотеку поставщика в файле CSS компонента Angular без дублирования библиотеки.

Есть идеи?

Ответ №1:

Что у вас есть в вашем hover.scss файле? Это только mixins или другой CSS? Если у вас есть только миксины, то все должно быть в порядке, если у вас есть какой-то CSS, то он будет взят. Например:

Это не приведет к повторению:

 @mixin underline-from-left {
    text-decoration: underline;
}
  

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

 @mixin underline-from-left {
    text-decoration: underline;
}

span {
    display: block;
}
  

Возможно, идея состоит в том, чтобы отделить mixins от фактического CSS, а затем импортировать только файл mixins.

Комментарии:

1. Извините, я должен уточнить, hover.css — это не мой файл, это сторонняя библиотека от ianlunn.github.io/Hover — это просто называется hover.css. Я не могу контролировать разделение CSS и миксинов — и да, я понимаю, что в конечном итоге возникает проблема. Это довольно большой файл, потому что он полон CSS.

2. После публикации этого вопроса я потратил годы на поиски решения и сдался. Много говорят о методах одноразового импорта, но ни один из них, который я мог бы использовать в Angular CLI, обернутый вокруг webpack, и, по слухам, он запланирован для SASS v4, но, похоже, он находился в стадии разработки в течение многих лет. На самом деле я довольно слабо завишу от этой библиотеки, поэтому сейчас я просто выбрал нужные мне миксины в свой собственный файл SASS. Это далеко от идеала, потому что сейчас у меня заблокирована версия, но, по крайней мере, размер моего пакета уменьшен.