SlideShare une entreprise Scribd logo
1  sur  149
Télécharger pour lire hors ligne
CSSO — минимизируем CSS
Роман Дворнов
Avito
Москва 2015
Работаю в Avito
Делаю SPA
Автор basis.js
Я…
За любую движуху, 

кроме голодовки ;)
О чем поговорим
• Немного истории
• Минификация CSS
• CSSO
• Почему? Как? Зачем?
3
4
4
5
«Хэппи-энда» не будет
6
Все CSS-минификаторы врут
Историческая 

справка
Это был теплый летний вечер 

в древней Греции…
8
2000-е
Быстрые браузеры 

и железо
«тяжелые» сайты,

«толстые» клиенты
8
2000-е
Быстрые браузеры 

и железо
«тяжелые» сайты,

«толстые» клиенты
CSS – много,
нужно сжимать
9
2000-е
YUI Compressor
The Yahoo! JavaScript and CSS Compressor
10
github.com/yui/yuicompressor
середина 2000х
YUI Compressor
• Написан на Java
• Регулярные выражения
11
YUI Compressor
• Написан на Java
• Регулярные выражения
11
Почему?
Почему?
Потому что Node.js и AST –
наше всё
CSSO
CSS Optimizer от Яндекса
13
github.com/css/csso
2011
Проект забросили :(
14
2013
Время шло, проблемы копились…
Хватит это терпеть!
16
17
Письмо «счастья»
Так я стал мейтенером CSSO :)
В то же время, в паралельном мире…
clean-css
Fast and efficient Node.js library for minifying CSS
19
github.com/jakubpawlowicz/clean-css
2011
Активно набирает
популярность и развивается
начиная с 2013
20
cssnano
A modular minifier, built on top of the PostCSS
21
github.com/ben-eb/cssnano
2015
Главный плюс – PostCSS
Cырой, но смелый
22
23
cssnanocsso clean-css
YUI Compressor fork
ycssmin
Наши герои
23
cssnanocsso clean-css
YUI Compressor fork
ycssmin
Наши герои
23
cssnanocsso clean-css
YUI Compressor fork
ycssmin
Наши герои
23
cssnanocsso clean-css
YUI Compressor fork
ycssmin
Наши герои
23
cssnanocsso clean-css
YUI Compressor fork
ycssmin
Наши герои
23
cssnanocsso clean-css
YUI Compressor fork
ycssmin
Наши герои
23
cssnanocsso clean-css
YUI Compressor fork
ycssmin
Наши герои
23
cssnanocsso clean-css
YUI Compressor fork
ycssmin
Наши герои
А если сравнить?
25
clean-css 3.4.8 cssnano 3.4.0 csso 1.4.4 csso-next
bootstrap.css)
147 427 байт
118 186)
284 ms
117 440)
1 925 ms
121 476)
1 104 ms
118 437)
507 ms
foundation.css)
200 341 байт
142 667)
464 ms
145 030)
1 992 ms
149 537)
1 477 ms
147 943)
979 ms
normalize.css)
7 707 байт
1792)
5 ms
1824)
17 ms
1 855)
19 ms
1831)
18 ms
reset.css)
1 092 байт
758 )
3 ms
773)
13 ms
747)
20 ms
747)
25 ms
goalsmashers.github.io/css-minification-benchmark/
Выглядит как-то так…
Библиотеки пишутся
оптимально
27
Реальный CSS – нет
28
29
clean-css 3.4.8 cssnano 3.4.0 csso 1.4.4 csso-next
ActiAgent.ru)
602 233 байт
430 240)
1 213 ms
439 730)
23 270 ms
439 030)
3 460 ms
438 302)
1 771 ms
в gzip ~54Kb – фактор сжатия 8
и в теории, результат можно улучшить
Наши цифры
Минификация
Все минификаторы работают похоже
Виды минификации
• Удаление
• Замена значений
• Структурная оптимизация
32
Кажется, минификация CSS –
это про знание спецификаций
33
На деле – постоянно что-то вылазит
Потому что
• Спецификации меняются
• Разная поддержка браузерами
• Баги браузеров
• Хаки
35
Самое главное
минифицированный CSS 

должен делать то же самое, 

что и оригинальный
36
Удаление
Комментарии
Все просто – 

удаляем все комметарии!
39
40
.h/* .. */1:before {	
con/* .. */tent: "I'm evil";	
}
Оригинальный CSS (не сработает)
Пример №1
40
.h/* .. */1:before {	
con/* .. */tent: "I'm evil";	
}
Оригинальный CSS (не сработает)
.h1:before {	
content: "I'm evil";	
}
csso, clean-css (заботает!)
Пример №1
40
.h/* .. */1:before {	
con/* .. */tent: "I'm evil";	
}
Оригинальный CSS (не сработает)
.h1:before {	
content: "I'm evil";	
}
csso, clean-css (заботает!)
НЕВЕРНО
Пример №1
40
.h/* .. */1:before {	
con/* .. */tent: "I'm evil";	
}
Оригинальный CSS (не сработает)
.h1:before {	
content: "I'm evil";	
}
csso, clean-css (заботает!)
.h 1:before {	
content: "I'm evil";	
}
cssnano (все странно)
НЕВЕРНО
Пример №1
40
.h/* .. */1:before {	
con/* .. */tent: "I'm evil";	
}
Оригинальный CSS (не сработает)
.h1:before {	
content: "I'm evil";	
}
csso, clean-css (заботает!)
.h 1:before {	
content: "I'm evil";	
}
cssnano (все странно)
CssSyntaxError
НЕВЕРНО
Пример №1
40
.h/* .. */1:before {	
con/* .. */tent: "I'm evil";	
}
Оригинальный CSS (не сработает)
.h1:before {	
content: "I'm evil";	
}
csso, clean-css (заботает!)
.h 1:before {	
content: "I'm evil";	
}
cssnano (все странно)
CssSyntaxError
НЕВЕРНО
НЕВЕРНО
Пример №1
41
.h/* .. */1:before {	
con/* .. */tent: "I'm evil";	
}
Оригинальный CSS (не сработает)
Правильно
Удалять то, что явно не сработает (декларации, правила)
Пример №1
42
@media all and/* .. */(..) {	
* { color: green; }	
}
Оригинальный CSS (работает)
Пример №2
42
@media all and/* .. */(..) {	
* { color: green; }	
}
Оригинальный CSS (работает)
@media all and(..) {	
* { color: green; }	
}
csso, clean-css (не работает)
Пример №2
42
@media all and/* .. */(..) {	
* { color: green; }	
}
Оригинальный CSS (работает)
@media all and(..) {	
* { color: green; }	
}
csso, clean-css (не работает)
НЕВЕРНО
Пример №2
42
@media all and/* .. */(..) {	
* { color: green; }	
}
Оригинальный CSS (работает)
@media all and(..) {	
* { color: green; }	
}
csso, clean-css (не работает)
@media all and (..) {	
* { color: green; }	
}
cssnano
НЕВЕРНО
Пример №2
42
@media all and/* .. */(..) {	
* { color: green; }	
}
Оригинальный CSS (работает)
@media all and(..) {	
* { color: green; }	
}
csso, clean-css (не работает)
@media all and (..) {	
* { color: green; }	
}
cssnano ✔
НЕВЕРНО
Пример №2
Пробельные символы
Основной выигрыш
44
Нужно учитывать особенности
спецификаций
45
46
calc(4 * 2em - 10% / 3)
Оригинальный CSS
Не правильно
calc(4*2em-10%/3)
Правильно
calc(4*2em - 10%/3)
Другое
Чтобы бы еще такого удалить?
• Правила с неверными селекторами
• Неверные декларации
• Пустые правила
• Неверно расположенные @import, @charset
• …
48
Чтобы бы еще такого удалить?
• Единицы измерения у нулей

0px " 0
• Кавычки

[attr="name"] " [attr=name]

url('image.png') " url(image.png)
• …
49
Нюансы, нюансы…
• 0px " 0

можно
50
Нюансы, нюансы…
• 0px " 0

можно
• 0deg " 0

нельзя, так как не длина
50
Нюансы, нюансы…
• 0px " 0

можно
• 0deg " 0

нельзя, так как не длина
• flex: 1 0 0px " flex: 1 0 0

нельзя, сломается в IE
50
Замена
Замена значений на более
короткие эквиваленты
52
Наиболее интересное: цвет
• hsl " rgb, hsla " rgba	
• rgb(100%, 0, 0) " rgb(255, 0, 0)	
• rgba(a, b, c, 1) " rgb(a, b, c)	
• нормализация: rgb(500, -100, 0) " rgb(255, 0, 0)
• rgb(255, 0, 0) " #ff0000	
• #aabbcc " #abc	
• #ff0000 " red, darkslateblue " #483d8b
53
Что еще
• Нормализация чисел: 0.00 " 0 или 0.123 " .123
• Специфика для свойств
• font-weight:bold " font-weight:700	
• background:none " background:0 0	
• from " 0%, 100% " to в @keyframes
• …
54
Не сильно эффективно
Структурная оптимизация
Слияние и перемещение
деклараций и правил
57
Самая сложная и ресурсоемкая
оптимизация
59
.foo {	
color: red;	
color: green;	
}
.foo {	
color: green;	
}
Удаление ненужных деклараций
60
.foo {	
color: red;	
color: rgba(…);	
}
.foo {	
color: rgba(…);	
}
Удаление ненужных деклараций
Правильно?
60
.foo {	
color: red;	
color: rgba(…);	
}
.foo {	
color: rgba(…);	
} НЕВЕРНО
В старых браузерах

не поддерживается rgba()
Удаление ненужных деклараций
Правильно?
61
.foo {	
color: red;	
}	
.bar {	
color: green;	
}	
.qux {	
color: red;	
}
.foo, .qux {	
color: red;	
}	
.bar {	
color: green;	
}
Перегруппировка
Правильно?
61
.foo {	
color: red;	
}	
.bar {	
color: green;	
}	
.qux {	
color: red;	
}
.foo, .qux {	
color: red;	
}	
.bar {	
color: green;	
}
НЕВЕРНО
Разный эффект, например:	
<div class="bar qux">
Перегруппировка
Правильно?
62
span {	
color: red;	
}	
div {	
color: green;	
}	
ul {	
color: red;	
}
span, ul {	
color: red;	
}	
div {	
color: green;	
}
Перегруппировка
Правильно?
62
span {	
color: red;	
}	
div {	
color: green;	
}	
ul {	
color: red;	
}
span, ul {	
color: red;	
}	
div {	
color: green;	
}
Правильно,

у элементов одно имя
Перегруппировка
Правильно?
63
.foo {	
color: red;	
}	
span {	
color: green;	
}	
.bar {	
color: red;	
}
.foo, .bar {	
color: red;	
}	
span {	
color: green;	
}
Перегруппировка
Правильно?
63
.foo {	
color: red;	
}	
span {	
color: green;	
}	
.bar {	
color: red;	
}
.foo, .bar {	
color: red;	
}	
span {	
color: green;	
}
Правильно,	
разная специфичность –	
порядок не важен
Перегруппировка
Правильно?
64
.foo {	
color: red;	
width: 100px;	
}	
.bar {	
color: green;	
width: 100px;	
}	
.foo, .bar {	
width: 100px;	
}	
.foo {	
color: red;	
}	
.bar {	
color: green;	
}	
Вынос общих частей
Выносить можно в каждом
случае по-разному
65
66
.foo {	
color: red;	
}	
.bar {	
color: red;	
color: rgba(..);	
}	
.foo, .bar {	
color: red;	
}	
.bar {	
color: rgba(..);	
}	
Вынос общих частей
В данном примере можно только в начало
67
.foo {	
color: rgba(..);	
}	
.bar {	
color: red;	
color: rgba(..);	
}	
.bar {	
color: red;	
}	
.foo, .bar {	
color: rgba(..);	
}
Вынос общих частей
В данном примере можно только в конец
Очень много нюансов,
нужно знать специфику 

свойств и селекторов
68
Подводя итоги
• Похожие методы
• Основной выигрыш дает удаление пробелов
• Реструктуризация делается в лоб → ошибки
изменения семантики
• У всех есть ошибки
69
70
Так почему же CSSO?
71
Смотрим под капот
73
CSS
сжатый
CSS
Процесс минификации
73
CSS
сжатый
CSS
Парсер
Процесс минификации
73
CSS
сжатый
CSS
ASTПарсер
Процесс минификации
73
CSS
сжатый
CSS
ASTПарсер
Компрессор
Процесс минификации
73
CSS
сжатый
CSS
AST
AST
Парсер
Компрессор
Процесс минификации
73
CSS
сжатый
CSS
AST
AST
Парсер
Компрессор
Транслятор
Процесс минификации
73
CSS
сжатый
CSS
AST
AST
Парсер
Компрессор
Транслятор
Процесс минификации
73
CSS
сжатый
CSS
AST
AST
Парсер
Компрессор
Транслятор
Процесс минификации
Минификатор
74
AST
Наш процесс сборки
Компрессор
Минификатор
74
AST
Наш процесс сборки
Компрессор
Минификатор
74
AST
Наш процесс сборки
Анализ …
Обработка
ссылок
Компрессор
Сокращение
имен
Сборщик
Минификатор
74
AST
Наш процесс сборки
Анализ …
Обработка
ссылок
Компрессор
Сокращение
имен
Сборщик
Минификатор
Транслятор
Минификатор должен быть
опциональным и предоставлять
возможность вмешательства
75
В этом плане
• CSSO – детальное AST (gonzales), хорошо
подходит для этой задачи
• clean-css – использует внутреннее
представление, не подходит
• cssnano – лишь компрессор, использует 

AST PostCSS, сам парсит селекторы и значения
76
CSSO – рефакторинг
Этап 1 – 1.3.12
• Первый патч
• Разобрал PR
• Разобрал и классифицировал тикеты
78
Этап 2 – 1.4
• Перенес наши фиксы в CSSO
• Обновление API и инфраструктуры
• Реорганизация файлов
• Исправлено множество багов (60+ тикетов)
• Базовый рефакторинг компрессора
79
Этап 3 – в работе
• Рефакторинг компрессора
• Внутренний формат AST
• Ускорение компрессии в 2-3 раза
80
Планы
Главная цель – лучший минификатор
Направление работы
• Новые алгоритмы: быстрее и правильно
• Режим линтера
• Source Maps
• Новые оптимизации
• Новый парсер
• Инструменты
83
Новые оптимизации
85
.foo {	
color: red;	
}	
.bar {	
color: green;	
}	
.qux {	
color: red;	
}
.foo, .qux {	
color: red;	
}	
.bar {	
color: green;	
}
Трансформация не безопасна,7
так как мы не знаем как
используется CSS в разметке
Вспомним пример
Но что, если мы знаем как
используется?
86
Это позволит
• Делать больше структурных изменений
• Удалять мертвый код
• Девать советы о неоптимальном CSS 

(лишний код, слишком сильный селектор и т.д.)
87
88
clean-css 3.4.8 cssnano 3.4.0 csso 1.4.4 csso-next
ActiAgent.ru)
602 233 байт
430 240)
1 213 ms
439 730)
23 270 ms
439 030)
3 460 ms
438 302)
1 771 ms
Наколеночный тест – 307 041)
в gzip 48kb, фактор сжатия 6.4 (было 8)
Вспомним таблицу
Специфично для проекта,
зависит от стека и подходов
создания CSS
89
Новый парсер
Чтобы лучше понимать CSS,
нужно много деталей 

о свойствах, значениях и
селекторах
91
Такие детали может
предоставлять парсер

Но такого пока нет
92
Начало работы
github.com/lahmatiy/css-parser
93
Первые результаты оптимистичные
Цели перед парсером
• Скорость и эффективность по памяти
• Толерантность к ошибкам
• Детальное AST (информация о свойствах,
значениях, селекторах и @-правилах)
• Поддержка поточности
94
Инструменты
Инструментов для разработки
крайне мало
96
Все плохо
• Нет хорошего детального парсера
• Нет стандарта AST
• Нет инструментов для анализа
• Нет инструментов для сравнения
• Даже линтеров нет (кроме проверки стиля)
97
AST
AST
Форматирование
AST
Компрессор
Форматирование
AST
Компрессор
Форматирование
AST
AST
Компрессор
Линтер
Форматирование
AST
AST
Компрессор
Линтер
Форматирование
AST
AST
Компрессор
Линтер
Форматирование
Анализ
AST
AST
Компрессор
Линтер
Форматирование
Анализ
AST
Отчет
AST
Компрессор
Линтер
Форматирование
Анализ
и т.д.
AST
Отчет
…
99
github.com/lahmatiy/css-ast-explorer
Инструменты для инструментов
В заключении
Выбирайте с умом
Любите CSS, читайте спеки
103
Делайте инструменты
Сделаем CSS лучше!
Роман Дворнов
@rdvornov
rdvornov@gmail.com
Вопросы?

Contenu connexe

Tendances

Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Ontico
 
Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...
Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...
Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...
Ontico
 
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Ontico
 
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Ontico
 

Tendances (20)

CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машин
 
Authentication security
Authentication securityAuthentication security
Authentication security
 
Баба Яга против!
Баба Яга против!Баба Яга против!
Баба Яга против!
 
CSSO — сжимаем CSS
CSSO — сжимаем CSSCSSO — сжимаем CSS
CSSO — сжимаем CSS
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструменты
 
Boost.Algorithm: что, зачем и почему
Boost.Algorithm: что, зачем и почемуBoost.Algorithm: что, зачем и почему
Boost.Algorithm: что, зачем и почему
 
React со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендерингReact со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендеринг
 
Unit-тестирование скриншотами: преодолеваем звуковой барьер
Unit-тестирование скриншотами: преодолеваем звуковой барьерUnit-тестирование скриншотами: преодолеваем звуковой барьер
Unit-тестирование скриншотами: преодолеваем звуковой барьер
 
PostgreSQL performance recipes
PostgreSQL performance recipesPostgreSQL performance recipes
PostgreSQL performance recipes
 
DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"
 
"Где еще живет скорость в web", Олег Елифантьев, MoscowJS 24
"Где еще живет скорость в web", Олег Елифантьев, MoscowJS 24"Где еще живет скорость в web", Олег Елифантьев, MoscowJS 24
"Где еще живет скорость в web", Олег Елифантьев, MoscowJS 24
 
Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...
Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...
Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...
 
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
 
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
 
Where is the space, Postgres?
Where is the space, Postgres?Where is the space, Postgres?
Where is the space, Postgres?
 
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
 
Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...
Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...
Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...
 
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
 
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
 

En vedette

Remote (dev)tools своими руками
Remote (dev)tools своими рукамиRemote (dev)tools своими руками
Remote (dev)tools своими руками
Roman Dvornov
 

En vedette (13)

CSSO – compress CSS (english version)
CSSO – compress CSS (english version)CSSO – compress CSS (english version)
CSSO – compress CSS (english version)
 
Инструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важныИнструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важны
 
CSS parsing: performance tips & tricks
CSS parsing: performance tips & tricksCSS parsing: performance tips & tricks
CSS parsing: performance tips & tricks
 
Парсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksПарсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricks
 
Maintainable CSS
Maintainable CSSMaintainable CSS
Maintainable CSS
 
Как сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееКак сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрее
 
Basis.js – «под капотом»
Basis.js – «под капотом»Basis.js – «под капотом»
Basis.js – «под капотом»
 
Как мы сделали PHP 7 в два раза быстрее PHP 5 / Дмитрий Стогов (Zend Technolo...
Как мы сделали PHP 7 в два раза быстрее PHP 5 / Дмитрий Стогов (Zend Technolo...Как мы сделали PHP 7 в два раза быстрее PHP 5 / Дмитрий Стогов (Zend Technolo...
Как мы сделали PHP 7 в два раза быстрее PHP 5 / Дмитрий Стогов (Zend Technolo...
 
Карточный домик
Карточный домикКарточный домик
Карточный домик
 
Remote (dev)tools своими руками
Remote (dev)tools своими рукамиRemote (dev)tools своими руками
Remote (dev)tools своими руками
 
Efficient, maintainable CSS
Efficient, maintainable CSSEfficient, maintainable CSS
Efficient, maintainable CSS
 
Жизнь в изоляции
Жизнь в изоляцииЖизнь в изоляции
Жизнь в изоляции
 
Atomic design
Atomic designAtomic design
Atomic design
 

Similaire à CSSO — минимизируем CSS

Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека...
Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека...Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека...
Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека...
Yandex
 
Регрессионное тестирование верстки
Регрессионное тестирование версткиРегрессионное тестирование верстки
Регрессионное тестирование верстки
Talks&Works
 
Иван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизацияИван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизация
Yandex
 
Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...
Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...
Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...
Yandex
 
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...
Yandex
 
Роман Комаров — «Механизм работы браузера»
Роман Комаров — «Механизм работы браузера»Роман Комаров — «Механизм работы браузера»
Роман Комаров — «Механизм работы браузера»
Yandex
 
Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"
Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"
Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"
Yandex
 

Similaire à CSSO — минимизируем CSS (20)

Иван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизацияИван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизация
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
 
Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека...
Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека...Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека...
Мастер-класс: Разрабатываем сайт с нуля на полном стеке БЭМ-технологий — Жека...
 
Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"
Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"
Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"
 
Code Style (in russian)
Code Style (in russian)Code Style (in russian)
Code Style (in russian)
 
Олег Мохов "Куда идём мы с Пятачком, или О том, куда движется вёрстка и верст...
Олег Мохов "Куда идём мы с Пятачком, или О том, куда движется вёрстка и верст...Олег Мохов "Куда идём мы с Пятачком, или О том, куда движется вёрстка и верст...
Олег Мохов "Куда идём мы с Пятачком, или О том, куда движется вёрстка и верст...
 
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
 
Регрессионное тестирование верстки
Регрессионное тестирование версткиРегрессионное тестирование верстки
Регрессионное тестирование верстки
 
Иван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизацияИван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизация
 
Вадим Макишвили "Вёрстка в IntelliJIDEA"
Вадим Макишвили "Вёрстка в IntelliJIDEA"Вадим Макишвили "Вёрстка в IntelliJIDEA"
Вадим Макишвили "Вёрстка в IntelliJIDEA"
 
My Open Source (Sept 2017)
My Open Source (Sept 2017)My Open Source (Sept 2017)
My Open Source (Sept 2017)
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
 
Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...
Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...
Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...
 
Как сделать Instagram в браузере — Дмитрий Дудин, xbSoftware
Как сделать Instagram в браузере — Дмитрий Дудин, xbSoftwareКак сделать Instagram в браузере — Дмитрий Дудин, xbSoftware
Как сделать Instagram в браузере — Дмитрий Дудин, xbSoftware
 
Mihail Korepanov
Mihail KorepanovMihail Korepanov
Mihail Korepanov
 
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...
 
Современная верстка с адекватными трудозатратами Максим Тимохин, технолог, И...
 Современная верстка с адекватными трудозатратами Максим Тимохин, технолог, И... Современная верстка с адекватными трудозатратами Максим Тимохин, технолог, И...
Современная верстка с адекватными трудозатратами Максим Тимохин, технолог, И...
 
Роман Комаров — «Механизм работы браузера»
Роман Комаров — «Механизм работы браузера»Роман Комаров — «Механизм работы браузера»
Роман Комаров — «Механизм работы браузера»
 
Denis Bugarchev
Denis BugarchevDenis Bugarchev
Denis Bugarchev
 
Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"
Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"
Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"
 

Plus de Roman Dvornov

Rempl – крутая платформа для крутых инструментов
Rempl – крутая платформа для крутых инструментовRempl – крутая платформа для крутых инструментов
Rempl – крутая платформа для крутых инструментов
Roman Dvornov
 
basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворк
Roman Dvornov
 

Plus de Roman Dvornov (8)

Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтенда
 
Rempl – крутая платформа для крутых инструментов
Rempl – крутая платформа для крутых инструментовRempl – крутая платформа для крутых инструментов
Rempl – крутая платформа для крутых инструментов
 
Component Inspector
Component InspectorComponent Inspector
Component Inspector
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Как построить DOM
Как построить DOMКак построить DOM
Как построить DOM
 
Компонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноКомпонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективно
 
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
 
basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворк
 

CSSO — минимизируем CSS