PostCSS

Поделись знанием:
Перейти к: навигация, поиск
PostCSS
Тип

Автоматизация работы с CSS

Разработчики

Андрей Ситник, Бэн Бриггс[1]

Написана на

JavaScript

Операционная система

Кроссплатформенная

Первый выпуск

4 ноября 2013[2]

Последняя версия

5.2.4 (Герцог Вапула) (30 сентября 2016[3])

Состояние

активное

Лицензия

Лицензия MIT[4]

Сайт

[postcss.org/ .org]

К:Википедия:Статьи без изображений (тип: не указан)К:Программное обеспечение, разработанное в 2013 году

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





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

Структура

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

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

  • парсера 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[16], Gulp[17], Grunt[18]. Отдельно поставляется консольный интерфейс[19]. С помощью сборщика Browserify или Webpack, PostCSS может быть запущен в браузере[20].

Синтаксисы

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

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

Расширения

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

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

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

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

Критика

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

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

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

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

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

Недостатки

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

История

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

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

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

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

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

Определённые проблемы возникли с термином «постпроцессор»[72]. Команда PostCSS использовала этот термин, чтобы показать, что PostCSS не является языком шаблонов (препроцессором), а работает с CSS[73]. Но другие разработчики считают, что термин «постпроцессор» лучше подходит для инструментов, которые работают в браузере[41] (например, [leaverou.github.io/prefixfree/ -prefix-free]). Выпуск расширения PreCSS окончательно усложнил ситуацию. Теперь команда PostCSS использует термин «процессор», вместо «постпроцессор»[74].

Напишите отзыв о статье "PostCSS"

Примечания

  1. [www.npmjs.com/package/postcss/access Разработчики, которые могут выкладывать версии PostCSS в npm]
  2. [github.com/postcss/postcss/commit/ad246924bbaca8b2baa51f9c4daf9ee2416b9879 Коммит обновления версии PostCSS до 0.1]
  3. [github.com/postcss/postcss/releases Выпуски PostCSS]
  4. [github.com/postcss/postcss/blob/master/LICENSE Лицензия в репозитории PostCSS]
  5. [webdesign.tutsplus.com/tutorials/postcss-deep-dive-what-you-need-to-know--cms-24535 Первая статья курса по PostCSS от Tuts+]
  6. 1 2 [github.com/wikimedia/portals/commit/998d7ce74c1f68397a52434ce9b85064de7d0008 Изменение, добавляющее PostCSS в систему сборку портала Википедии]
  7. 1 2 [github.com/wikimedia/stylelint-config-wikimedia Wikimedia Stylelint Config]
  8. 1 2 [code.facebook.com/posts/879890885467584/improving-css-quality-at-facebook-and-beyond/ Improving CSS quality at Facebook and beyond]
  9. [github.com/primer/primer/blob/master/.postcss.json Настройки PostCSS в системе сборки GitHub]
  10. 1 2 [github.com/primer/stylelint-config-primer Primer Stylelint Config]
  11. [www.npmtrends.com/postcss-vs-less-vs-node-sass-vs-stylus Сравнения количества загрузок препроцессоров]
  12. [github.com/postcss/postcss/commit/513f9c1b46a7085ac215e4de9bac5c617d5b2f26 Добавление спонсора в описание проекта]
  13. 1 2 [github.com/postcss/postcss/issues/861 Обсуждение, что такое PostCSS]
  14. [webdesign.tutsplus.com/tutorials/postcss-deep-dive-preprocessing-with-precss--cms-24583 PostCSS Deep Dive: Preprocessing with “PreCSS”]
  15. 1 2 [www.youtube.com/watch?v=1yUFTrAxTzg Andrey Sitnik - PostCSS: The Future After Sass and LESS]
  16. [github.com/postcss/postcss-loader postcss-loader]
  17. [github.com/postcss/gulp-postcss gulp-postcss]
  18. [github.com/nDmitry/grunt-postcss grunt-postcss]
  19. [github.com/postcss/postcss-cli postcss-cli]
  20. [github.com/postcss/postcss/issues/830 Running postcss in the browser]
  21. [github.com/webschik/postcss-less postcss-less]
  22. [github.com/postcss/postcss-scss postcss-scss]
  23. [github.com/postcss/sugarss sugarss]
  24. [github.com/himynameisdave/postcss-plugins Список расширений PostCSS]
  25. [github.com/postcss/autoprefixer autoprefixer]
  26. [www.sitepoint.com/results-ultimate-css-survey/ The Results of The Ultimate CSS Survey]
  27. [github.com/css-modules/css-modules css-modules]
  28. [github.com/webpack/css-loader/blob/5a003e00645d2ed0b3e759db06f58a08fbdd6745/package.json#L17-L20 Зависимости css-loader]
  29. [stylelint.io/ Stylelint]
  30. [github.com/morishitter/stylefmt stylefmt]
  31. [github.com/jonathantneal/precss precss]
  32. [cssnext.io/ cssnext.io]
  33. [cssnano.co/ cssnano.co]
  34. [github.com/ben-eb/cssnano/issues/45 Список пользователей cssnano]
  35. [rtlcss.com/ rtlcss.com]
  36. [bbpress.trac.wordpress.org/ticket/2848 RTL CSS generation: Switch from CSSJanus to RTLCSS]
  37. [github.com/assetsjs/postcss-assets postcss-assets]
  38. [github.com/TrySound/postcss-inline-svg postcss-inline-svg]
  39. [github.com/2createStudio/postcss-sprites postcss-sprites]
  40. [github.com/webpack/css-loader/blob/5a003e00645d2ed0b3e759db06f58a08fbdd6745/lib/processCss.js#L18 Встроенные расширения в Webpack]
  41. 1 2 [css-tricks.com/the-trouble-with-preprocessing-based-on-future-specs/ The Trouble With Preprocessing Based on Future Specs]
  42. [developers.google.com/web/tools/setup/setup-buildtools#dont-trip-up-with-vendor-prefixes Set Up Your Build Tools]
  43. [www.smashingmagazine.com/2015/12/introduction-to-postcss/ An Introduction To PostCSS]
  44. 1 2 [css-tricks.com/extending-sass-with-postcss/ Extending Sass with PostCSS]
  45. [benfrain.com/breaking-up-with-sass-postcss/ Breaking up with Sass: it’s not you, it’s me]
  46. [forums.meteor.com/t/css-modules-for-meteor-without-webpack/19682/25 Обсуждение SugarSS на форуме Meteor]
  47. 1 2 [www.youtube.com/watch?v=qhouBGNncGQ Используем PostCSS правильно | FrontTalks 2015]
  48. [www.sitepoint.com/postcss-mythbusting/ PostCSS Mythbusting: Four PostCSS Myths Busted]
  49. [webdesign.tutsplus.com/tutorials/using-postcss-together-with-sass-stylus-or-less--cms-24591 Using PostCSS Together with Sass, Stylus, or LESS]
  50. [slides.com/ai/stylelint-ru Stylelint — Как и зачем линтить CSS]
  51. [twitter.com/elmd_/status/766254562135113728 Обсуждение производительности PostCSS в Твиттере]
  52. [ashleynolan.co.uk/blog/postcss-a-review PostCSS – Sass Killer or Preprocessing Pretender?]
  53. [github.com/postcss/benchmark/blob/master/parsers.js PostCSS parsers benchmark]
  54. [github.com/postcss/benchmark/blob/master/preprocessors.js PostCSS preprocessors benchmark]
  55. [evilmartians.com/chronicles/postcss-1_5x-faster PostCSS becomes 1.5x faster]
  56. [medium.com/@wob/the-sad-state-of-web-development-1603a861d29f The Sad State of Web Development]
  57. [npm-stat.com/charts.html?package=postcss-use Статистика загрузок postcss-use]
  58. [github.com/postcss/postcss/issues/754 Integrate value & selector parsing into PostCSS core]
  59. [github.com/postcss/postcss/issues/296 Event based API]
  60. [github.com/reworkcss/rework/commit/0a7be255bfe753d03f93c7072351266fa636e80a Первый коммит в Rework]
  61. [tjholowaychuk.tumblr.com/post/44267035203/modular-css-preprocessing-with-rework Modular CSS preprocessing with rework]
  62. [github.com/postcss/autoprefixer/commit/d36346effe999e82fa8064076dc5f0e8f37e7e48 Первый коммит Автопрефиксера]
  63. [github.com/postcss/autoprefixer/commit/419a77d4d871a1d7be34ff7129e3cbf7fb755b0c Коммит переименования проекта в Автопрефиксер]
  64. [github.com/reworkcss/css/issues/20 Facilitate autoprefixer needs]
  65. [github.com/postcss/postcss/commit/2d96cea96e3a96f616c28f897358086a69caa506 Первый коммит в PostCSS]
  66. [evilmartians.com/chronicles/postcss-second-birthday PostCSS Second Birthday]
  67. [github.com/robwierzbowski/grunt-pixrem/commit/0f7b662277edfc12f02f5615c66630be5d137b3a Первый коммит в grunt-pixrem]
  68. [github.com/postcss/autoprefixer/releases/tag/1.0 Autoprefixer release 1.0 “Plus ultra”]
  69. [github.com/postcss/postcss.org/issues/4 Обсуждение дизайна сайта PostCSS]
  70. [twitter.com/postcss/status/632182461108240384 Твит про логотип PostCSS]
  71. [twitter.com/autoprefixer/status/413085919420219392 Твит про версии PostCSS]
  72. [silvenon.com/css-pre-vs-post-processing/ CSS pre- vs. post-processing]
  73. [codehipsters.com/2014/11/27/sitnik-interview.html Андрей Ситник: «Будущее за CSS постпроцессорами!»]
  74. [twitter.com/PostCSS/status/626046993006239744 Твит про отказ от термина постпроцессор]

Ссылки

  • [postcss.org/ Официальный сайт] (англ.)
  • [github.com/postcss/postcss Проект PostCSS] на сайте GitHub
  • [vk.com/postcss Официальная страница PostCSS] в социальной сети «ВКонтакте»
  • PostCSS (англ.) в «Твиттере»
  • [postcss.parts/ Каталог расширений] для PostCSS

Отрывок, характеризующий PostCSS

– Sire! – сказал он. – Votre Majeste signe dans ce moment la gloire de la nation et le salut de l'Europe! [Государь! Ваше величество подписывает в эту минуту славу народа и спасение Европы!]
Государь наклонением головы отпустил Мишо.


В то время как Россия была до половины завоевана, и жители Москвы бежали в дальние губернии, и ополченье за ополченьем поднималось на защиту отечества, невольно представляется нам, не жившим в то время, что все русские люди от мала до велика были заняты только тем, чтобы жертвовать собою, спасать отечество или плакать над его погибелью. Рассказы, описания того времени все без исключения говорят только о самопожертвовании, любви к отечеству, отчаянье, горе и геройстве русских. В действительности же это так не было. Нам кажется это так только потому, что мы видим из прошедшего один общий исторический интерес того времени и не видим всех тех личных, человеческих интересов, которые были у людей того времени. А между тем в действительности те личные интересы настоящего до такой степени значительнее общих интересов, что из за них никогда не чувствуется (вовсе не заметен даже) интерес общий. Большая часть людей того времени не обращали никакого внимания на общий ход дел, а руководились только личными интересами настоящего. И эти то люди были самыми полезными деятелями того времени.
Те же, которые пытались понять общий ход дел и с самопожертвованием и геройством хотели участвовать в нем, были самые бесполезные члены общества; они видели все навыворот, и все, что они делали для пользы, оказывалось бесполезным вздором, как полки Пьера, Мамонова, грабившие русские деревни, как корпия, щипанная барынями и никогда не доходившая до раненых, и т. п. Даже те, которые, любя поумничать и выразить свои чувства, толковали о настоящем положении России, невольно носили в речах своих отпечаток или притворства и лжи, или бесполезного осуждения и злобы на людей, обвиняемых за то, в чем никто не мог быть виноват. В исторических событиях очевиднее всего запрещение вкушения плода древа познания. Только одна бессознательная деятельность приносит плоды, и человек, играющий роль в историческом событии, никогда не понимает его значения. Ежели он пытается понять его, он поражается бесплодностью.
Значение совершавшегося тогда в России события тем незаметнее было, чем ближе было в нем участие человека. В Петербурге и губернских городах, отдаленных от Москвы, дамы и мужчины в ополченских мундирах оплакивали Россию и столицу и говорили о самопожертвовании и т. п.; но в армии, которая отступала за Москву, почти не говорили и не думали о Москве, и, глядя на ее пожарище, никто не клялся отомстить французам, а думали о следующей трети жалованья, о следующей стоянке, о Матрешке маркитантше и тому подобное…
Николай Ростов без всякой цели самопожертвования, а случайно, так как война застала его на службе, принимал близкое и продолжительное участие в защите отечества и потому без отчаяния и мрачных умозаключений смотрел на то, что совершалось тогда в России. Ежели бы у него спросили, что он думает о теперешнем положении России, он бы сказал, что ему думать нечего, что на то есть Кутузов и другие, а что он слышал, что комплектуются полки, и что, должно быть, драться еще долго будут, и что при теперешних обстоятельствах ему не мудрено года через два получить полк.
По тому, что он так смотрел на дело, он не только без сокрушения о том, что лишается участия в последней борьбе, принял известие о назначении его в командировку за ремонтом для дивизии в Воронеж, но и с величайшим удовольствием, которое он не скрывал и которое весьма хорошо понимали его товарищи.
За несколько дней до Бородинского сражения Николай получил деньги, бумаги и, послав вперед гусар, на почтовых поехал в Воронеж.
Только тот, кто испытал это, то есть пробыл несколько месяцев не переставая в атмосфере военной, боевой жизни, может понять то наслаждение, которое испытывал Николай, когда он выбрался из того района, до которого достигали войска своими фуражировками, подвозами провианта, гошпиталями; когда он, без солдат, фур, грязных следов присутствия лагеря, увидал деревни с мужиками и бабами, помещичьи дома, поля с пасущимся скотом, станционные дома с заснувшими смотрителями. Он почувствовал такую радость, как будто в первый раз все это видел. В особенности то, что долго удивляло и радовало его, – это были женщины, молодые, здоровые, за каждой из которых не было десятка ухаживающих офицеров, и женщины, которые рады и польщены были тем, что проезжий офицер шутит с ними.
В самом веселом расположении духа Николай ночью приехал в Воронеж в гостиницу, заказал себе все то, чего он долго лишен был в армии, и на другой день, чисто начисто выбрившись и надев давно не надеванную парадную форму, поехал являться к начальству.
Начальник ополчения был статский генерал, старый человек, который, видимо, забавлялся своим военным званием и чином. Он сердито (думая, что в этом военное свойство) принял Николая и значительно, как бы имея на то право и как бы обсуживая общий ход дела, одобряя и не одобряя, расспрашивал его. Николай был так весел, что ему только забавно было это.
От начальника ополчения он поехал к губернатору. Губернатор был маленький живой человечек, весьма ласковый и простой. Он указал Николаю на те заводы, в которых он мог достать лошадей, рекомендовал ему барышника в городе и помещика за двадцать верст от города, у которых были лучшие лошади, и обещал всякое содействие.
– Вы графа Ильи Андреевича сын? Моя жена очень дружна была с вашей матушкой. По четвергам у меня собираются; нынче четверг, милости прошу ко мне запросто, – сказал губернатор, отпуская его.
Прямо от губернатора Николай взял перекладную и, посадив с собою вахмистра, поскакал за двадцать верст на завод к помещику. Все в это первое время пребывания его в Воронеже было для Николая весело и легко, и все, как это бывает, когда человек сам хорошо расположен, все ладилось и спорилось.
Помещик, к которому приехал Николай, был старый кавалерист холостяк, лошадиный знаток, охотник, владетель коверной, столетней запеканки, старого венгерского и чудных лошадей.
Николай в два слова купил за шесть тысяч семнадцать жеребцов на подбор (как он говорил) для казового конца своего ремонта. Пообедав и выпив немножко лишнего венгерского, Ростов, расцеловавшись с помещиком, с которым он уже сошелся на «ты», по отвратительной дороге, в самом веселом расположении духа, поскакал назад, беспрестанно погоняя ямщика, с тем чтобы поспеть на вечер к губернатору.
Переодевшись, надушившись и облив голову холодной подои, Николай хотя несколько поздно, но с готовой фразой: vaut mieux tard que jamais, [лучше поздно, чем никогда,] явился к губернатору.
Это был не бал, и не сказано было, что будут танцевать; но все знали, что Катерина Петровна будет играть на клавикордах вальсы и экосезы и что будут танцевать, и все, рассчитывая на это, съехались по бальному.
Губернская жизнь в 1812 году была точно такая же, как и всегда, только с тою разницею, что в городе было оживленнее по случаю прибытия многих богатых семей из Москвы и что, как и во всем, что происходило в то время в России, была заметна какая то особенная размашистость – море по колено, трын трава в жизни, да еще в том, что тот пошлый разговор, который необходим между людьми и который прежде велся о погоде и об общих знакомых, теперь велся о Москве, о войске и Наполеоне.
Общество, собранное у губернатора, было лучшее общество Воронежа.
Дам было очень много, было несколько московских знакомых Николая; но мужчин не было никого, кто бы сколько нибудь мог соперничать с георгиевским кавалером, ремонтером гусаром и вместе с тем добродушным и благовоспитанным графом Ростовым. В числе мужчин был один пленный итальянец – офицер французской армии, и Николай чувствовал, что присутствие этого пленного еще более возвышало значение его – русского героя. Это был как будто трофей. Николай чувствовал это, и ему казалось, что все так же смотрели на итальянца, и Николай обласкал этого офицера с достоинством и воздержностью.
Как только вошел Николай в своей гусарской форме, распространяя вокруг себя запах духов и вина, и сам сказал и слышал несколько раз сказанные ему слова: vaut mieux tard que jamais, его обступили; все взгляды обратились на него, и он сразу почувствовал, что вступил в подобающее ему в губернии и всегда приятное, но теперь, после долгого лишения, опьянившее его удовольствием положение всеобщего любимца. Не только на станциях, постоялых дворах и в коверной помещика были льстившиеся его вниманием служанки; но здесь, на вечере губернатора, было (как показалось Николаю) неисчерпаемое количество молоденьких дам и хорошеньких девиц, которые с нетерпением только ждали того, чтобы Николай обратил на них внимание. Дамы и девицы кокетничали с ним, и старушки с первого дня уже захлопотали о том, как бы женить и остепенить этого молодца повесу гусара. В числе этих последних была сама жена губернатора, которая приняла Ростова, как близкого родственника, и называла его «Nicolas» и «ты».
Катерина Петровна действительно стала играть вальсы и экосезы, и начались танцы, в которых Николай еще более пленил своей ловкостью все губернское общество. Он удивил даже всех своей особенной, развязной манерой в танцах. Николай сам был несколько удивлен своей манерой танцевать в этот вечер. Он никогда так не танцевал в Москве и счел бы даже неприличным и mauvais genre [дурным тоном] такую слишком развязную манеру танца; но здесь он чувствовал потребность удивить их всех чем нибудь необыкновенным, чем нибудь таким, что они должны были принять за обыкновенное в столицах, но неизвестное еще им в провинции.
Во весь вечер Николай обращал больше всего внимания на голубоглазую, полную и миловидную блондинку, жену одного из губернских чиновников. С тем наивным убеждением развеселившихся молодых людей, что чужие жены сотворены для них, Ростов не отходил от этой дамы и дружески, несколько заговорщически, обращался с ее мужем, как будто они хотя и не говорили этого, но знали, как славно они сойдутся – то есть Николай с женой этого мужа. Муж, однако, казалось, не разделял этого убеждения и старался мрачно обращаться с Ростовым. Но добродушная наивность Николая была так безгранична, что иногда муж невольно поддавался веселому настроению духа Николая. К концу вечера, однако, по мере того как лицо жены становилось все румянее и оживленнее, лицо ее мужа становилось все грустнее и бледнее, как будто доля оживления была одна на обоих, и по мере того как она увеличивалась в жене, она уменьшалась в муже.


Николай, с несходящей улыбкой на лице, несколько изогнувшись на кресле, сидел, близко наклоняясь над блондинкой и говоря ей мифологические комплименты.
Переменяя бойко положение ног в натянутых рейтузах, распространяя от себя запах духов и любуясь и своей дамой, и собою, и красивыми формами своих ног под натянутыми кичкирами, Николай говорил блондинке, что он хочет здесь, в Воронеже, похитить одну даму.
– Какую же?
– Прелестную, божественную. Глаза у ней (Николай посмотрел на собеседницу) голубые, рот – кораллы, белизна… – он глядел на плечи, – стан – Дианы…
Муж подошел к ним и мрачно спросил у жены, о чем она говорит.
– А! Никита Иваныч, – сказал Николай, учтиво вставая. И, как бы желая, чтобы Никита Иваныч принял участие в его шутках, он начал и ему сообщать свое намерение похитить одну блондинку.
Муж улыбался угрюмо, жена весело. Добрая губернаторша с неодобрительным видом подошла к ним.
– Анна Игнатьевна хочет тебя видеть, Nicolas, – сказала она, таким голосом выговаривая слова: Анна Игнатьевна, что Ростову сейчас стало понятно, что Анна Игнатьевна очень важная дама. – Пойдем, Nicolas. Ведь ты позволил мне так называть тебя?
– О да, ma tante. Кто же это?
– Анна Игнатьевна Мальвинцева. Она слышала о тебе от своей племянницы, как ты спас ее… Угадаешь?..
– Мало ли я их там спасал! – сказал Николай.
– Ее племянницу, княжну Болконскую. Она здесь, в Воронеже, с теткой. Ого! как покраснел! Что, или?..
– И не думал, полноте, ma tante.
– Ну хорошо, хорошо. О! какой ты!
Губернаторша подводила его к высокой и очень толстой старухе в голубом токе, только что кончившей свою карточную партию с самыми важными лицами в городе. Это была Мальвинцева, тетка княжны Марьи по матери, богатая бездетная вдова, жившая всегда в Воронеже. Она стояла, рассчитываясь за карты, когда Ростов подошел к ней. Она строго и важно прищурилась, взглянула на него и продолжала бранить генерала, выигравшего у нее.
– Очень рада, мой милый, – сказала она, протянув ему руку. – Милости прошу ко мне.
Поговорив о княжне Марье и покойнике ее отце, которого, видимо, не любила Мальвинцева, и расспросив о том, что Николай знал о князе Андрее, который тоже, видимо, не пользовался ее милостями, важная старуха отпустила его, повторив приглашение быть у нее.
Николай обещал и опять покраснел, когда откланивался Мальвинцевой. При упоминании о княжне Марье Ростов испытывал непонятное для него самого чувство застенчивости, даже страха.
Отходя от Мальвинцевой, Ростов хотел вернуться к танцам, но маленькая губернаторша положила свою пухленькую ручку на рукав Николая и, сказав, что ей нужно поговорить с ним, повела его в диванную, из которой бывшие в ней вышли тотчас же, чтобы не мешать губернаторше.