Автор этой статьи затронул по-моему мнению очень важную тему, но может как-то не очень подробно её раскрыл, написание комментария с ответом вылилось в этот пост.

Речь пойдет именно о тегах с кастомными именами, не о веб-компонентах.

Давайте посмотрим на то как мы сейчас пишем html

<div class=loader">wait</div>

обратите внимание что в этом конкретно примере важно для разработчика, а что является бойлерплейтом? Мы видим что есть loader с контентом wait и этот элемент блочный(но это неточно надо глянуть в css стили еще), а вот <div class=""></div> это типовой/boilerplate код.

В препроцессоре html pug(jade) созданном чтобы упростить набор html-кода то же самое было бы записано просто вот так:

.loader wait

кому-то он кажется уже чем-то черезчур, типа сложно такую мешанину где из разделителей только пробелы читать, местами я с ними согласен.

Но посмотрите как легко и нативно мы можем избавится от большей части шаблонного кода

<loader>wait</loader>

Используя свои имена тегов мы тем самым пишем и читаем меньше бойлерплейта.

Было шаблонного кода: <div class=""></div>

Стало шаблонного кода: <></>

Была смысловая конструкция из 3х частей: <тег атрибут="значение">
Стала смысловая конструкция из одной: <тег>

Есть и другие плюсы. Вот вы слегка прокрутили код в своей ide и видите в конце блока следующее

    . . . 
      </span></p>
    </div>
  </div>
</div>

что это у нас закрывается? Да, вверху страницы у этих тегов есть классы и id и может какие-то другие опознавательные признаки, но что касается закрытия, в каком-то коде можно встретить комментарии с классом закрывающегося тега где-то нет, а можно писать так

     . . .  
      </upper-case></p>
    </call-to-action>
  </slide-item>
</swipe-slider>

Обратите внимание что я советую сократить написание бойлерплейт кода, а не тупо заменять стандартные теги на свои. То есть заголовок лучше написать так

<h1 class="rainbow">My title</h1>

а не так

<rainbow role="heading" aria-level="1">My title</rainbow>

потому что в данном случае, использование кастомного тега увеличивает количество шаблонного-кода, а не уменьшает.

Помимо этого так же стоит отдавать предпочтение тегам main footer article section aside когда они подходят по смыслу вместо div .

Написание css стилей с использованием селекторов по именам тегов так же становится проще. Хотелось бы еще сказать про то в каких случаях использовать классы, в каких атрибуты , а когда dataset (атрибуты с data-) и что хватит пихать все в одни только css-классы что show это не класс тега а состояние, но это пожалуй потянет на отдельную статью.

В соответствии со спецификацией html имена своих тегов обязательно должны содержать разделитель "черточка" - но я лично не нашел доводов против использования имен без черточек, <mytag> - работает на всех устройствах до которых удалось дотянуться, ровно так же как и <my-tag> , там нет какого-то лага / дополнительного парсинга или чего-то еще, разве что из него нельзя позже сделать веб-компонент, без переименовывания.

Что касается SEO - то поисковикам совершенно без разницы<div class="bar">(а скорее после компиляции реактом это будет какой-нибудь <div class="sc-dd348ae-0">) или <bar> и если бы дело было только в SEO то хотя бы закрытые авторизацией SPA писали бы уже с использованием кастомных имён.

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

Давайте будем писать более лаконичный и выразительный код, ну или как минимум не сопротивляться таким вот "нововведениям" в вашей кодовой базе. Это ведь даже не какое-то ноу-хау, не очередной модный фреймворк о котором потом все забудут - это обычный html который так работает уже больше 10 лет, на котором вы и так пишете но делаете это... ну как в примерах выше :-)

Полезные ссылки по теме

https://web.dev/articles/customelements?hl=ru
https://html.spec.whatwg.org/multipage/custom-elements.html
https://custom-elements-everywhere.com/
https://matthewjamestaylor.com/custom-tags

Комментарии (79)