Нужны ли препроцессоры в 2019 году

Liudmila Mzhachikh
6 min readJun 15, 2019

--

Препроцессоры давно стали неотъемлемым инструментом в арсенале верстальщика. Они дают нам все, что нам нужно: переменные, миксины, вложенность… Погодите. А разве современный CSS так не умеет? Или умеет? А нам точно еще нужны препроцессоры?

История

Интернет появился в начале 90х. В 1994 году впервые возникает идея о создании языка для стилизации веб-страниц. И спустя 2 года появляется CSS. CSS1 умел не много, и поддержка в браузерах была настоящей болью.

Но время шло, CSS развивался, еще спустя 2 года появился CSS2, затем, CSS2.1. Но по-прежнему оставалось много проблем:

  • Не было переменных
  • Не было вложеннности
  • Не было модульности
  • Оставались проблемы с кроссбраузерностью

И вот тогда появились они — препроцессоры!

Они были призваны решить проблемы нативного CSS и давали нам набор новых крутых фич.

И, казалось, на этом препроцессоры победили, и так мы будем жить всегда. Но и CSS все это время не стоял на месте. И вот, в марте этого года CSSWG одобрила черновик Таба Аткинса, который реализует в CSS вложенные селекторы — одну из главных фич, ради которых используют препроцессоры!

Так неужели CSS еще не проэволюционировал достаточно, чтобы уже оставить препроцессоры в прошлом? Давайте сравнивать основные фичи.

Вложенность

Как уже было сказано выше, в марте 2019 года одобрили черновик о вложенности. Он реализует в CSS новый синтаксис с & и директиву @nest.

Это пока не совсем та вложенность, которая есть в препроцессорах. Есть 2 ограничения:

  1. Нет склеивания классов в стиле БЭМ-а
  2. & всегда должен идти первым

Но больше селекторов можно реализовать, как раз, при помощи директивы nest. Например:

Увы, вложенность в CSS пока существует только на уровне спецификации, и браузерных решений нет :( Но ведь это только начало).

Переменные

Я уже писала о CSS Сustom Properties, у них куча преимуществ по сравнению с препроцессорными:

  • Ведут себя как обычные CSS-свойтсва свойства (наследование, каскад)
  • Знают о DOM-структуре
  • Можно использовать в SVG
  • Доступны из JS

С браузерной поддержкой у них уже тоже все хорошо:

Помимо CSS custom properties, в CSS есть еще один вид переменных: CSS environment variables. Они задаются user-agent-ом браузера и их можно использовать, чтобы адаптировать верстку под новые девайсы. Подробнее о них можно почитать тут.

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

Миксины

В CSS есть директива, которая нативно повторяет миксины — @apply. О том, как ее использовать, можно почитать здесь.

Но предложение Таба Аткинса отклонили, так что миксинов в CSS не предвидется.

Но так ли они нужны? Наиболее частый юзкейс для использования миксинов — генерация вендорных префиксов. Необходимость в этом отпала с появлением Autoprefixer-a. И проблему дублирования кода вполне можно решить правильной архитектурой верстки. Миксин легко реализуется применением нужных классов.

Математические функции

У нас уже был calc() с очень хорошей браузерной поддержкой.

И совсем недавно CSSWG приняла решение о добавлении новыйх математических функций в CSS:

Модульность

На самом деле модульность в CSS была всегда. CSS import-ы были с нами еще с IE5.5. Но мы ими не пользовались из-за багов в старых браузерах и из-за хорошей практики сокращать количество запросов к серверу. Но с приходом HTTP/2 эта необходимость отпала.

Но, по сравнению с препроцессорным, у нативного import-а есть крутое преимущество: подгрузка в зависимости от условий.

То есть я могу подгрузить отдельно стили для печати, мобильных и т.д. Препроцессорный import работает на этапе компиляции, когда доступа к media-queries нет.

Подводя промежуточные итоги, кроме миксинов в CSS уже либо есть препроцессорные фичи, либо они скоро появятся. При этом нативные переменные на голову выше препроцессорных.

А что если мы хотим новые фичи уже сегодня?

CSS будущего уже сегодня

Postcss-preset-env — плагин, который представляет из себя набор полифиллов, он позволяет использовать новые фичи, которые еще не работают в браузерах.

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

Вы сами решаете, какие фичи и какие браузеры поддерживать. У него есть 5 уровней по фичам:

По умолчанию включается Stage2 — применятся все фичи, находящиеся в состоянии Working draft, и будут поддерживаться все браузеры.

И получается следующее:

Так в чем разница с препроцессорами? У PostCSS есть перед ними ряд преимуществ:

  • Он умеет все то же, что и препроцессоры
  • Но при этом мы продолжаем писать именно CSS, а не свой синтаксис
  • PostCSS модульный. А это значит, что можно заполифилить фичу, а как только она войдет в стандарт, убрать ненужный плагин и не тащить лишние зависимости.

Но с большой силой приходит большая отвественность! Ко всему надо подходить с умом. PostCSS — это тоже не совсем CSS. Не стоит увлекаться полифиллами. Плюс, полифилл не всегда может полностью повторить поведение фичи. Например, используя полифилл для CSS custom properties, вы теряете их главное преимущество — поведение как у CSS-свойств.

Но обычно, говоря о противостоянии препроцессоров и ванильного CSS, мы только сравниваем фичи. А ведь у процессоров тоже есть свои слабые стороны.

Проблемы препроцессоров

1. Свой синтаксис

У каждого препроцессора свой собственный синтаксис, и это уже не CSS.

Мне часто отвечают на этот аргумент: да что там учить! Да, я уверена, что любой человек с головой в состоянии освоить этот синтаксис. Но зачем что-то делать, если можно этого не делать:)

Но дело даже не в сложности изучения и не в том, что новому человеку, пришедшему в команду, и не работавшему с вашим препроцессором, придется к нему привыкать. Препроцессоры дают упрощенный синтаксис, и это палка о двух концах: каждый привыкает писать, как ему нравится. И дальше вам надо следить за кодстайлом, настраивать линтер, либо проверять его глазами в код-ревью. Я уверена, что можно потратить время и силы на что-то гораздо более важное.

2. Нужна компиляция

Каждый, кто использовал препроцессоры, видел такой экран:

Когда не понятно, что поломалось, и как это чинить.

И каждое изменения требует перекомпиляции! Это занимает время и жутко бесит.

3. Лишние зависимости

Любой препроцессор — это дополнительная зависимость. А Sass, например, еще тянет за собой compass.

4. Сложнее дебажить

Находим свойство в браузере:

Открываем исходник, там этого свойства нет:

Нельзя так просто взять и найти исходник, в котором задано свойство. Поэтому нужны специальные файлы — sourcemaps. На их генерацию также нужно дополнительное время, и это, опять же, лишний файл, который надо тащить за собой.

Если эти аргументы вас все еще не убедили, вот пара сайтов, которые отказались от препроцессоров в пользу PostCSS, и это далеко не полный список.

Выводы

  1. На самом деле у нас уже есть все, что нужно!
  2. А то, чего еще нет, скоро появится. Еще нереализованные фичи можно использовать уже сегодня с помощью PostCSS.
  3. CSS и инструменты работы с ним эволюционировали. Раньше мы вынуждены были использовать препроцессоры за неимением лучших решений. Но вместо того, чтобы держаться за старое, лучше использовать более современные инструменты.
  4. Не надо привязываться к технологиям, они имеют свойство устаревать. А CSS работает везде и будет с нами всегда.
  5. Вместо того, чтобы изучать препроцессоры, лучше следить за новинками CSS.

Подписывайтесь на блоги:

Телеграм: frontend_thoughts

Instagram: lucy_frontend

--

--

Liudmila Mzhachikh

Frontend developer at Mail.Ru Group 👩‍💻, leader of moscowcss community, conference speaker 🎤, write about IT, channel: t.me/frontend_thoughts