Веб-компоненты и общие стили - PullRequest
0 голосов
/ 19 октября 2018

Это один из тех вопросов «что нам делать с этим»?Как вы знаете, веб-компоненты должны быть небольшими, содержащими приложения для веб-сайтов.Однако иногда их необходимо стилизовать в зависимости от сайта, на котором они размещены.


Пример: компонент «Подпишитесь на нашу рассылку».Этот компонент будет иметь несколько ключевых элементов:

  • Поле ввода
  • Кнопка
  • Может быть, recaptcha
  • Метод, который говорит с вашим сервисомпосле нажатия кнопки (передача по электронной почте)

Мы будем использовать Google и YouTube в качестве примеров.Цветовая схема Google - синяя (давайте представим), а цветовая схема YouTube - красная.Тогда компонент будет выглядеть примерно так: <newsletter-signup></newsletter-signup> на странице, на которой вы его встраиваете. Это есть и у Google, и у YouTube.

Проблема возникает, когда компонент должен наследовать стили от Google и YouTube., Несколько устаревших селекторов CSS были бы хороши для этого, потому что таблицы стилей Google и YouTube могли просто включать цвета для Shadow DOM, поэтому нам не пришлось бы копировать / вставлять стили.Компонент теоретически не должен ничего знать о стилях от хоста, потому что мы хотим, чтобы он наследовал от хоста (Google и YouTube).

В данный момент я создаю веб-компонент с использованием Angular 6,который имеет много стилей, потому что он имеет много элементов.Я копирую / вставляю стили, Bootstrap, значки и т. Д. С хост-сайта, а затем стилизую их на основе <newsletter-signup brand="google"></newsletter-signup>.Так, если бренд - Google, цвета должны быть, например, красным.

Это действительно плохо по нескольким причинам:

  1. Стили должны обновляться как на веб-компоненте, так и на хосте
  2. Дублированный код никогда не обновляетсяхорошая идея
  3. Если все стили скопированы 1: 1, количество байтов, необходимое для стилей, удваивается

Как бы я, как разработчик, учел это?Как создать стили на хосте, а затем применить их к моему веб-компоненту (назовите его наследованием)?Я уверен, что у кого-то была такая же проблема с Shadow DOM, как и у меня.Спасибо за чтение.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Одна из самых важных функций веб-компонентов: Мой хост (страница, на которой я встраиваю свой веб-компонент) не должен зависеть от веб-компонента и не знать о веб-компоненте .

Что это в основном означает: стили моего веб-компонента не должны передаваться хосту.

Если мой хост решит обновить стили, это должно повлиять на мой веб-компонент.А не наоборот.Чтобы решить эту проблему, я импортировал внешние стили со своего хоста прямо в файл CSS, используя @import.Вот пример:

import url("https://my-host.com/styles/core.css");

my-component {
    //all styles goes here
}

Я сделал это с помощью SASS, но это можно сделать с помощью обычного CSS.


Это не очень хорошее решение, но оно делает то, что я хочу: Наследовать стили от хоста.Несмотря на то, что мне пришлось бы импортировать все имеющиеся таблицы стилей, они все еще работают.

Недостаток моего решения: при загрузке страницы она отправляет запрос на стиль из элемента <link> внутри <head> -тег мой хозяин, но также и стиль внутри моего import.Таким образом, стили загружаются дважды.Для нашего приложения, предназначенного только для внутреннего использования, не имеет значения, запрашиваем ли мы дополнительные данные размером ~ 200 КБ.

0 голосов
/ 28 октября 2018

Я понимаю, что вы не хотите писать такие же правила для вашего общего компонента (селектора)

, т. Е. Вы хотите делать стили, в которых находится ваш общий селектор.

Вещи, которые выможно сделать, чтобы справиться с этим:

1.Создайте свой собственный логический фреймворк CSS

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

"styles": [
          "node_modules/bootstrap/dist/css/bootstrap.min.css",
          "src/styles/app.scss"
        ],

Этот app.scss должен быть написан так, чтобы вы могли его переопределить.

Отправка правил в качестве ввода

отправка пользовательских правил Obj и использование в элементах, которые вы хотите переопределить.

<newsletter [input]="customRulesObj"></newsletter>

component.ts

customRulesObj = new CustomRulesClass();
customRulesObj.color = 'red';

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

Расширение этого компонента из общего компонента

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

export class NewsLetterComponent extends CSSComponent implements OnInit
  {


  }

css-component.ts

В этом компоненте можно логически определять css для каждого хоста, текущего маршрутизатора и других кратных условий if else.Вы можете определить правила, изменив условия регистра и связав эти правила с компонентом, который вы расширили.

...