Русская Википедия:PostCSS

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:Карточка программы

PostCSSпрограмма, которая автоматизирует рутинные операции с CSS с помощью расширений, написанных на языке JavaScript[1]. Используется при разработке Википедии[2][3], Facebook[4] и GitHub[5][6]. Один из самых часто загружаемых с npm инструментов для работы с CSS[7]. Разработана Андреем Ситником в компании «Злые марсиане»[8].

Принцип работы

Структура

Файл:PostCSS scheme ru.svg
Схема работы PostCSS

В отличие от Sass и LESS, PostCSS не является языком шаблонов, компилируемых в CSS. PostCSS — платформа, на которой можно создать разные инструменты работы CSS[9]. В частности, на PostCSS можно создать и язык шаблонов, такой как Sass и LESS[10].

Ядро PostCSS состоит из:[11]

  • парсера CSS, который генерирует дерево объектов (AST) из строки CSS-кода;
  • набора классов, из которого состоит это дерево;
  • генератора CSS, который генерирует строку CSS по дереву объектов;
  • генератора карт кода для сделанных в CSS изменений.

Все полезные функции предоставляются расширениями — небольшими программами, которые работают с деревом объектов. После того, как ядро преобразует CSS-строку в дерево объектов, расширения по очереди анализируют и изменяют это дерево. Затем ядро PostCSS генерирует новую CSS-строку по дереву, которое было изменено расширениями.

Использование

И ядро, и расширения PostCSS написаны на языке JavaScript. Все они распространяются через систему npm.

PostCSS предоставляет API для низкоуровневой работы на языке JavaScript:

// Загружаем ядро и расширения из npm
const postcss = require('postcss')
const autoprefixer = require('autoprefixer')
const precss = require('precss')

// Указываем, какие расширения мы хотим использовать
const processor = postcss([autoprefixer, precss])

// Указываем CSS-код и имя входящего/исходящего файла
processor.process('a {}', { from: './app.css', to: './app.build.css' })
  // Используем Promise API на случай асинхронных расширений
  .then(result => {
    // Выводим CSS-код после обработки
    console.log(result.css)
    // Выводим предупреждения от расширений
    for ( let message of result.warnings() ) {
      console.warn(message.toString())
    }
  })

Существуют официальные инструменты для использования PostCSS с такими системами сборки, как Webpack[12], Gulp[13], Grunt[14]. Отдельно поставляется консольный интерфейс[15]. С помощью сборщика Browserify или Webpack, PostCSS может быть запущен в браузере[16].

Синтаксисы

Разработчик, использующий PostCSS, может сменить парсер и генератор — тогда PostCSS будет работать с такими исходниками как: LESS[17], SCSS[18], Sass[19]. Но сам PostCSS не может компилировать LESS, SCSS или Sass в CSS, он лишь изменяет оригинальные исходные файлы — например, сортирует CSS-свойства или ищет ошибки в коде.

Также в нём можно использовать синтаксис SugarSS, вдохновлённый компактным синтаксисом Sass и Stylus[20].

Расширения

Для PostCSS написано более 300 расширений[21]. Расширения PostCSS могут решить большинство задач обработки CSS — от анализа и сортировки свойств до сжатия. При этом качество и популярность расширений сильно разнятся.

Полный список расширений можно найти на postcss.parts. Несколько примеров:

  • Автопрефиксер[22] — добавляет и чистит браузерные префиксы. Это самое популярное расширение для PostCSS — согласно оценке [[|en]] (SitePoint)[23], в марте 2016 им пользовалось 56% разработчиков.
  • CSS Modules[24] — автоматическая система изоляции CSS-селекторов и организации кода. Встроена в популярный сборщик Webpack[25].
  • Stylelint[26]анализирует CSS-код на предмет наличия в нем ошибок, а также следования принятому стилю. Используется в Википедии[3], Facebook[4] и GitHub[6]. Другое расширение stylefmt[27] исправляет CSS-код согласно настройкам Stylelint.
  • PreCSS[28] — набор расширений, которые повторяют часть функций препроцессоров типа Sass или LESS.
  • postcss-preset-env[29] — набор расширений для эмуляции функций из незаконченных черновиков CSS-спецификаций.
  • cssnano[30] — уменьшает размер CSS-кода, убирая пробелы и переписывая код в сжатой форме. Используется в Webpack, BBC и JSFiddle[31].
  • RTLCSS[32] — изменяет CSS-код так, чтобы дизайн подходил для письма справа налево (как в арабском и иврите). Используется в WordPress[33].
  • postcss-assets[34], postcss-inline-svg[35] и postcss-sprites[36] для работы с графикой.

Некоторые инструменты, не являясь расширениями PostCSS, используют PostCSS для своей работы. Например, популярный сборщик Webpack содержит PostCSS для работы с CSS[37].

Критика

Хотя отдельные расширения и подвергались критике[38], другие стали стандартом «де-факто». Например, Google рекомендует Автопрефиксер для решения проблемы браузерных префиксов в CSS[39].

В целом, PostCSS был тепло встречен индустрией[40]. Даже разработчики Sass считают PostCSS хорошим дополнением к Sass[41].

Главный обсуждаемый вопрос — стоит ли сделать систему сборки CSS только на расширениях PostCSS. С одной стороны, расширения PreCSS или postcss-cssnext могут заменить многие функции Sass и LESS[42]. Синтаксис SugarSS может заменить компактный синтаксис Sass и Stylus[43]. Но с другой стороны, сам автор PostCSS не советует уходить от Sass и LESS в старых проектах[44].

Преимущества

  • Функциональность. Многие расширения PostCSS не имеют аналогов[45]. Поэтому PostCSS используется даже в тех проектах, где уже есть Sass или LESS[46].
  • Унификация. Расширения PostCSS позволяют решать практически все задачи сборки CSS[47] — от поиска ошибок в коде до сжатия. В итоге все инструменты для CSS могут использовать один парсер, единую архитектуру и общие инструменты разработки. Все расширения будут использовать единожды разобранное дерево объектов, что положительно сказывается на производительности[9].
  • Модульность. Каждый пользователь сам выбирает расширения PostCSS и может отключить ненужные расширения ради производительности[48]. Поскольку для решения одних и тех же проблем существуют разные расширения, пользователь может выбрать наиболее подходящие ему инструменты[49]. Автор PostCSS считает, что конкуренция расширений стимулирует их развитие[11].
  • Скорость работы. PostCSS обладает одним из самых быстрых парсеров CSS, среди написанных на JS[50]. На базовых задачах препроцессора он может работать в 20 раз быстрее Ruby Sass и в 4 раза быстрее LESS[51]. Но реальная производительность сильно зависит от количества расширений. Даже сами авторы PostCSS замечают, что современные препроцессоры и так работают слишком быстро, и ускорение часто будет не видно[52].

Недостатки

  • Сложность настройки. Некоторых разработчиков пугает, что надо выбирать расширения и настраивать, чтобы они работали совместно[53]. Готовые наборы расширений лишь частично решают эту проблему.
  • Нестандартный синтаксис. Каждый проект может использовать свой набор расширений. Новый разработчик может не понять, что неизвестная ему функция связана с непопулярным расширением PostCSS[41]. Автор рекомендует postcss-use, чтобы явно указывать расширения для каждого файла[44], но такой подход используется не всеми[54].
  • Отдельные парсеры для селекторов и значений. PostCSS сохраняет CSS-селекторы и значения свойств как строки, не разбирая их дальше. Расширения должны использовать дополнительные парсеры для их разбора. Команда PostCSS собирается исправить это в будущих версиях[55].
  • Последовательная обработка. Каждое расширение по очереди проходит по дереву объектов, что может сказаться на производительности при большом количестве расширений. Теоретически, некоторые вложенные функции не могут быть обработаны расширениями. Команда PostCSS собирается исправить это в будущих версиях[56].

История

Впервые идея модульного инструмента для CSS была предложена TJ Holowaychuk 1 сентября 2012 в проекте Rework[57]. 28 февраля 2013 TJ рассказал о ней публично[58].

14 марта 2013 Андрей Ситник в компании «Злые марсиане» сделал расширение Автопрефиксер на базе Rework[59]. Изначально расширение даже называлось «rework-vendors»[60].

При росте Автопрефиксера были обнаружены проблемы в реализации Rework[61]. Поэтому 7 сентября 2013[62] Андрей Ситник начал разработку PostCSS на основе идей Rework[63].

Через 3 месяца вышел первый плагин для PostCSS — grunt-pixrem[64]. 22 декабря 2013[65] в версии 1.0 Автопрефиксер перешёл на PostCSS.

PostCSS активно использует тему алхимии в своей символике[66]. Логотипом проекта является знак философского камня[67]. Мажорные и минорные версии PostCSS получают имена демонов «Гоетии»[68]. Например, имя версии 1.0.0 — «Маркиз Декарабиа».

Определённые проблемы возникли с термином «постпроцессор»[69]. Команда PostCSS использовала этот термин, чтобы показать, что PostCSS не является языком шаблонов (препроцессором), а работает с CSS[70]. Но другие разработчики считают, что термин «постпроцессор» лучше подходит для инструментов, которые работают в браузере[38] (например, -prefix-free). Выпуск расширения PreCSS окончательно усложнил ситуацию. Теперь команда PostCSS использует термин «процессор», вместо «постпроцессор»[71].

Примечания

Шаблон:Примечания

Ссылки

  1. Шаблон:Cite web
  2. Шаблон:Cite web
  3. 3,0 3,1 Шаблон:Cite web
  4. 4,0 4,1 Шаблон:Cite web
  5. Настройки PostCSS в системе сборки GitHub Шаблон:Webarchive
  6. 6,0 6,1 Шаблон:Cite web
  7. Шаблон:Cite web
  8. Шаблон:Cite web
  9. 9,0 9,1 Шаблон:Cite web
  10. Шаблон:Cite web
  11. 11,0 11,1 Шаблон:Cite web
  12. Шаблон:Cite web
  13. Шаблон:Cite web
  14. Шаблон:Cite web
  15. Шаблон:Cite web
  16. Шаблон:Cite web
  17. postcss-less
  18. Шаблон:Cite web
  19. Шаблон:Статья
  20. Шаблон:Cite web
  21. Шаблон:Cite web
  22. Шаблон:Cite web
  23. Шаблон:Cite web
  24. Шаблон:Cite web
  25. Зависимости css-loader
  26. Шаблон:Cite web
  27. Шаблон:Cite web
  28. Шаблон:Cite web
  29. Шаблон:Cite web
  30. Шаблон:Cite web
  31. Шаблон:Cite web
  32. Шаблон:Cite web
  33. Шаблон:Cite web
  34. Шаблон:Cite web
  35. Шаблон:Cite web
  36. Шаблон:Cite web
  37. Встроенные расширения в Webpack
  38. 38,0 38,1 Шаблон:Cite web
  39. Шаблон:Cite web
  40. Шаблон:Cite web
  41. 41,0 41,1 Шаблон:Cite web
  42. Шаблон:Cite web
  43. Шаблон:Cite web
  44. 44,0 44,1 Шаблон:Cite web
  45. Шаблон:Cite web
  46. Шаблон:Cite web
  47. Шаблон:Cite web
  48. Шаблон:Cite web
  49. Шаблон:Cite web
  50. Шаблон:Cite web
  51. Шаблон:Cite web
  52. Шаблон:Cite web
  53. The Sad State of Web Development Шаблон:Webarchive
  54. Шаблон:Cite web
  55. Шаблон:Cite web
  56. Шаблон:Cite web
  57. Шаблон:Cite web
  58. Modular CSS preprocessing with rework Шаблон:Webarchive
  59. Шаблон:Cite web
  60. Шаблон:Cite web
  61. Шаблон:Cite web
  62. Шаблон:Cite web
  63. Шаблон:Cite web
  64. Шаблон:Cite web
  65. Шаблон:Cite web
  66. Шаблон:Cite web
  67. Шаблон:Cite web
  68. Шаблон:Cite web
  69. CSS pre- vs. post-processing Шаблон:Webarchive
  70. Шаблон:Cite web
  71. Шаблон:Cite web