- Можно использовать собственный тег для каждого компонента.
- Нет ограничений по количеству и расположению внутри элемента.
- Нельзя поставить в простые инпуты, требуется
for="prev"
.
- Можно поставить почти в любом месте (кроме
input
,textarea
).
- Не даёт использовать шаблоны
<script type="text/html">
(варианты шаблонов). Решается комментированием содержимого и разворачиванием при использовании.
- Нельзя поставить внутри
<select>
, между<tbody/tr/td>
и т.д.
- Вешаются на любой тег.
- Все
<xsl:attribute>
должны идти первыми, а то… - Сложно сделать отдельный атрибут для каждого компонента (почему — см. ниже). Приходится объединять в один, из-за этого следующие два пункта.
- Неудобно объявлять несколько компонентов, особенно с шаблонами и условиями.
- Проблемы с запятыми при перестановке, добавлении и удалении компонентов.
- Сложно написать настоящий JSON из-за кавычек.
- Можно писать выражения и функции.
- Неудобно работать с JS в XSL.
-
Нет селектора «имя атрибута начинается с». Чтобы найти компоненты, потребуется маркер вроде
jsx-component
, который легко забывается и требует дополнительной логики для установки (например, компонент подключается черезapply-templates
, значит и маркер должен быть там же, а не ставиться безусловно). -
Найти нужные атрибуты не так-то просто и, очевидно, затратнее, чем получить известный атрибут.
-
Именование. Если использовать произвольные имена, будет трэш и проблемы как в Блоко, когда пришлось наворачивать сложный генератор уникальных ID. Если использовать порядковый номер, как раньше, могут быть трудноуловимые баги с одинаковыми номерами. Если использовать имена компонентов, то
HH/Salarystat/Report/HighlightCells
нужно конвертировать вdata-component-hh-salarystat-report-highlightcells
, а вdataset
попадётcomponentHhSalarystatReportHighlightcells
. Конвертировать нужно будет постоянно в голове, при поиске и т.п., и для XSL это тоже нетривиальная задача. -
Везде, где нет XSL — в hh.ru, документации, шаблонах Jinja или HoganJS, — придётся наворачивать препроцессоры или писать всё вручную, и чем проще это будет сделать, тем лучше. В наше время система компонентов не должна создавать проблем при использовании на статичных страницах, любой сахар в шаблонизаторах (читай
<b:component>
) — отдельная история.
- Легко получать:
var components = el.onclick();
.
- Для поиска элементов требуется маркер.
- Описывает каждый компонент отдельно.
- Скрывает реализацию привязки компонента к тегу.
- В параметры нельзя передавать функции и выражения.
- Избавление от eval, защита от XSS.
- Параметры можно передать прямо в компонент.
- Параметры можно передать прямо в компонент.
- Скрывает реализацию и формат передачи параметров компонента.
- Унифицирует и структурирует параметры по типам (
trl
,templates
,cssClasses
), позволяя строить внутреннее API (this.trl()
,this.template()
,this.cssClass
). - Легко формировать, легко обрабатывать (
trl-js
), самовалидируется. - В XML нет JS.