csso — минимизируем css
TRANSCRIPT
![Page 1: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/1.jpg)
CSSO — минимизируем CSS
Роман Дворнов Avito
Москва 2015
![Page 2: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/2.jpg)
Работаю в Avito
Делаю SPA
Автор basis.js
Я…
За любую движуху, кроме голодовки ;)
![Page 3: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/3.jpg)
О чем поговорим
• Немного истории
• Минификация CSS
• CSSO
• Почему? Как? Зачем?
3
![Page 4: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/4.jpg)
4
![Page 5: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/5.jpg)
4
![Page 6: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/6.jpg)
5
«Хэппи-энда» не будет
![Page 7: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/7.jpg)
6
Все CSS-минификаторы врут
![Page 8: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/8.jpg)
Историческая справка
Это был теплый летний вечер в древней Греции…
![Page 9: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/9.jpg)
8
2000-е
Быстрые браузеры и железо
«тяжелые» сайты,«толстые» клиенты
![Page 10: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/10.jpg)
8
2000-е
Быстрые браузеры и железо
«тяжелые» сайты,«толстые» клиенты
![Page 11: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/11.jpg)
CSS – много, нужно сжимать
9
2000-е
![Page 12: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/12.jpg)
YUI Compressor The Yahoo! JavaScript and CSS Compressor
10
github.com/yui/yuicompressor
середина 2000х
![Page 13: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/13.jpg)
YUI Compressor• Написан на Java
• Регулярные выражения
11
![Page 14: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/14.jpg)
YUI Compressor• Написан на Java
• Регулярные выражения
11
![Page 15: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/15.jpg)
Почему?
![Page 16: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/16.jpg)
Почему?
Потому что Node.js и AST – наше всё
![Page 18: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/18.jpg)
Проект забросили :(
14
2013
![Page 19: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/19.jpg)
Время шло, проблемы копились…
![Page 20: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/20.jpg)
Хватит это терпеть!
16
![Page 21: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/21.jpg)
17
Письмо «счастья»
Так я стал мейтенером CSSO :)
![Page 22: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/22.jpg)
В то же время, в паралельном мире…
![Page 23: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/23.jpg)
clean-css Fast and efficient Node.js library for minifying CSS
19
github.com/jakubpawlowicz/clean-css
2011
![Page 24: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/24.jpg)
Активно набирает популярность и развивается
начиная с 2013
20
![Page 25: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/25.jpg)
cssnano A modular minifier, built on top of the PostCSS
21
github.com/ben-eb/cssnano
2015
![Page 26: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/26.jpg)
Главный плюс – PostCSS Cырой, но смелый
22
![Page 27: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/27.jpg)
23
cssnanocsso clean-cssYUI Compressor fork
ycssmin
Наши герои
![Page 28: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/28.jpg)
23
cssnanocsso clean-cssYUI Compressor fork
ycssmin
Наши герои
![Page 29: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/29.jpg)
23
cssnanocsso clean-cssYUI Compressor fork
ycssmin
Наши герои
![Page 30: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/30.jpg)
23
cssnanocsso clean-cssYUI Compressor fork
ycssmin
Наши герои
![Page 31: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/31.jpg)
23
cssnanocsso clean-cssYUI Compressor fork
ycssmin
Наши герои
![Page 32: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/32.jpg)
23
cssnanocsso clean-cssYUI Compressor fork
ycssmin
Наши герои
![Page 33: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/33.jpg)
23
cssnanocsso clean-cssYUI Compressor fork
ycssmin
Наши герои
![Page 34: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/34.jpg)
23
cssnanocsso clean-cssYUI Compressor fork
ycssmin
Наши герои
![Page 35: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/35.jpg)
А если сравнить?
![Page 36: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/36.jpg)
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/
![Page 37: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/37.jpg)
Выглядит как-то так…
![Page 38: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/38.jpg)
Библиотеки пишутся оптимально
27
![Page 39: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/39.jpg)
Реальный CSS – нет
28
![Page 40: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/40.jpg)
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 и в теории, результат можно улучшить
Наши цифры
![Page 41: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/41.jpg)
Минификация
![Page 42: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/42.jpg)
Все минификаторы работают похоже
![Page 43: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/43.jpg)
Виды минификации
• Удаление
• Замена значений
• Структурная оптимизация
32
![Page 44: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/44.jpg)
Кажется, минификация CSS – это про знание спецификаций
33
![Page 45: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/45.jpg)
На деле – постоянно что-то вылазит
![Page 46: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/46.jpg)
Потому что
• Спецификации меняются
• Разная поддержка браузерами
• Баги браузеров
• Хаки
35
![Page 47: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/47.jpg)
Самое главное минифицированный CSS
должен делать то же самое, что и оригинальный
36
![Page 48: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/48.jpg)
Удаление
![Page 49: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/49.jpg)
Комментарии
![Page 50: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/50.jpg)
Все просто – удаляем все комметарии!
39
![Page 51: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/51.jpg)
40
.h/* .. */1:before { con/* .. */tent: "I'm evil";}
Оригинальный CSS (не сработает)Пример №1
![Page 52: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/52.jpg)
40
.h/* .. */1:before { con/* .. */tent: "I'm evil";}
Оригинальный CSS (не сработает)
.h1:before { content: "I'm evil";}
csso, clean-css (заботает!)
Пример №1
![Page 53: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/53.jpg)
40
.h/* .. */1:before { con/* .. */tent: "I'm evil";}
Оригинальный CSS (не сработает)
.h1:before { content: "I'm evil";}
csso, clean-css (заботает!)
НЕВЕРН
О
Пример №1
![Page 54: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/54.jpg)
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
![Page 55: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/55.jpg)
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
![Page 56: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/56.jpg)
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
![Page 57: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/57.jpg)
41
.h/* .. */1:before { con/* .. */tent: "I'm evil";}
Оригинальный CSS (не сработает)
Правильно
Удалять то, что явно не сработает (декларации, правила)
Пример №1
![Page 58: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/58.jpg)
42
@media all and/* .. */(..) { * { color: green; }}
Оригинальный CSS (работает)Пример №2
![Page 59: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/59.jpg)
42
@media all and/* .. */(..) { * { color: green; }}
Оригинальный CSS (работает)
@media all and(..) { * { color: green; }}
csso, clean-css (не работает)
Пример №2
![Page 60: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/60.jpg)
42
@media all and/* .. */(..) { * { color: green; }}
Оригинальный CSS (работает)
@media all and(..) { * { color: green; }}
csso, clean-css (не работает)
НЕВЕРН
О
Пример №2
![Page 61: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/61.jpg)
42
@media all and/* .. */(..) { * { color: green; }}
Оригинальный CSS (работает)
@media all and(..) { * { color: green; }}
csso, clean-css (не работает)
@media all and (..) { * { color: green; }}
cssnano
НЕВЕРН
О
Пример №2
![Page 62: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/62.jpg)
42
@media all and/* .. */(..) { * { color: green; }}
Оригинальный CSS (работает)
@media all and(..) { * { color: green; }}
csso, clean-css (не работает)
@media all and (..) { * { color: green; }}
cssnano ✔
НЕВЕРН
О
Пример №2
![Page 63: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/63.jpg)
Пробельные символы
![Page 64: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/64.jpg)
Основной выигрыш
44
![Page 65: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/65.jpg)
Нужно учитывать особенности спецификаций
45
![Page 66: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/66.jpg)
46
calc(4 * 2em - 10% / 3)Оригинальный CSS
Не правильно
calc(4*2em-10%/3)
Правильно
calc(4*2em - 10%/3)
![Page 67: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/67.jpg)
Другое
![Page 68: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/68.jpg)
Чтобы бы еще такого удалить?• Правила с неверными селекторами
• Неверные декларации
• Пустые правила
• Неверно расположенные @import, @charset
• …
48
![Page 69: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/69.jpg)
Чтобы бы еще такого удалить?• Единицы измерения у нулей0px " 0
• Кавычки[attr="name"] " [attr=name] url('image.png') " url(image.png)
• …
49
![Page 70: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/70.jpg)
Нюансы, нюансы…• 0px " 0 можно
50
![Page 71: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/71.jpg)
Нюансы, нюансы…• 0px " 0 можно
• 0deg " 0 нельзя, так как не длина
50
![Page 72: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/72.jpg)
Нюансы, нюансы…• 0px " 0 можно
• 0deg " 0 нельзя, так как не длина
• flex: 1 0 0px " flex: 1 0 0 нельзя, сломается в IE
50
![Page 73: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/73.jpg)
Замена
![Page 74: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/74.jpg)
Замена значений на более короткие эквиваленты
52
![Page 75: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/75.jpg)
Наиболее интересное: цвет• 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 " #483d8b53
![Page 76: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/76.jpg)
Что еще• Нормализация чисел: 0.00 " 0 или 0.123 " .123
• Специфика для свойств
• font-weight:bold " font-weight:700
• background:none " background:0 0
• from " 0%, 100% " to в @keyframes
• …
54
![Page 77: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/77.jpg)
Не сильно эффективно
![Page 78: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/78.jpg)
Структурная оптимизация
![Page 79: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/79.jpg)
Слияние и перемещение деклараций и правил
57
![Page 80: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/80.jpg)
Самая сложная и ресурсоемкая оптимизация
![Page 81: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/81.jpg)
59
.foo { color: red; color: green;}
.foo { color: green;}
Удаление ненужных деклараций
![Page 82: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/82.jpg)
60
.foo { color: red; color: rgba(…);}
.foo { color: rgba(…);}
Удаление ненужных деклараций
Правильно?
![Page 83: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/83.jpg)
60
.foo { color: red; color: rgba(…);}
.foo { color: rgba(…);} НЕВ
ЕРНО
В старых браузерахне поддерживается rgba()
Удаление ненужных деклараций
Правильно?
![Page 84: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/84.jpg)
61
.foo { color: red;}.bar { color: green;}.qux { color: red;}
.foo, .qux { color: red;}.bar { color: green;}
ПерегруппировкаПравильно?
![Page 85: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/85.jpg)
61
.foo { color: red;}.bar { color: green;}.qux { color: red;}
.foo, .qux { color: red;}.bar { color: green;}
НЕВЕРН
О
Разный эффект, например:<div class="bar qux">
ПерегруппировкаПравильно?
![Page 86: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/86.jpg)
62
span { color: red;}div { color: green;}ul { color: red;}
span, ul { color: red;}div { color: green;}
ПерегруппировкаПравильно?
![Page 87: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/87.jpg)
62
span { color: red;}div { color: green;}ul { color: red;}
span, ul { color: red;}div { color: green;}
Правильно, у элементов одно имя
ПерегруппировкаПравильно?
![Page 88: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/88.jpg)
63
.foo { color: red;}span { color: green;}.bar { color: red;}
.foo, .bar { color: red;}span { color: green;}
ПерегруппировкаПравильно?
![Page 89: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/89.jpg)
63
.foo { color: red;}span { color: green;}.bar { color: red;}
.foo, .bar { color: red;}span { color: green;}
Правильно,разная специфичность –порядок не важен
ПерегруппировкаПравильно?
![Page 90: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/90.jpg)
64
.foo { color: red; width: 100px;}.bar { color: green; width: 100px;}
.foo, .bar { width: 100px;}.foo { color: red;}.bar { color: green;}
Вынос общих частей
![Page 91: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/91.jpg)
Выносить можно в каждом случае по-разному
65
![Page 92: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/92.jpg)
66
.foo { color: red;}.bar { color: red; color: rgba(..);}
.foo, .bar { color: red;}.bar { color: rgba(..);}
Вынос общих частей
В данном примере можно только в начало
![Page 93: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/93.jpg)
67
.foo { color: rgba(..);}.bar { color: red; color: rgba(..);}
.bar { color: red;}.foo, .bar { color: rgba(..);}
Вынос общих частей
В данном примере можно только в конец
![Page 94: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/94.jpg)
Очень много нюансов, нужно знать специфику свойств и селекторов
68
![Page 95: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/95.jpg)
Подводя итоги• Похожие методы
• Основной выигрыш дает удаление пробелов
• Реструктуризация делается в лоб → ошибки изменения семантики
• У всех есть ошибки
69
![Page 96: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/96.jpg)
70
Так почему же CSSO?
![Page 97: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/97.jpg)
71
![Page 98: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/98.jpg)
Смотрим под капот
![Page 99: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/99.jpg)
73
CSS
сжатый CSS
Процесс минификации
![Page 100: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/100.jpg)
73
CSS
сжатый CSS
Парсер
Процесс минификации
![Page 101: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/101.jpg)
73
CSS
сжатый CSS
ASTПарсер
Процесс минификации
![Page 102: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/102.jpg)
73
CSS
сжатый CSS
ASTПарсер
Компрессор
Процесс минификации
![Page 103: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/103.jpg)
73
CSS
сжатый CSS
AST
AST
Парсер
Компрессор
Процесс минификации
![Page 104: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/104.jpg)
73
CSS
сжатый CSS
AST
AST
Парсер
Компрессор
Транслятор
Процесс минификации
![Page 105: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/105.jpg)
73
CSS
сжатый CSS
AST
AST
Парсер
Компрессор
Транслятор
Процесс минификации
![Page 106: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/106.jpg)
73
CSS
сжатый CSS
AST
AST
Парсер
Компрессор
Транслятор
Процесс минификации
Минификатор
![Page 107: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/107.jpg)
74
AST
Наш процесс сборки
Компрессор
Минификатор
![Page 108: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/108.jpg)
74
AST
Наш процесс сборки
Компрессор
Минификатор
![Page 109: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/109.jpg)
74
AST
Наш процесс сборки
Анализ …Обработка ссылок
Компрессор
Сокращение имен
Сборщик
Минификатор
![Page 110: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/110.jpg)
74
AST
Наш процесс сборки
Анализ …Обработка ссылок
Компрессор
Сокращение имен
Сборщик
Минификатор
Транслятор
![Page 111: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/111.jpg)
Минификатор должен быть опциональным и предоставлять возможность вмешательства
75
![Page 112: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/112.jpg)
В этом плане• CSSO – детальное AST (gonzales), хорошо подходит для этой задачи
• clean-css – использует внутреннее представление, не подходит
• cssnano – лишь компрессор, использует AST PostCSS, сам парсит селекторы и значения
76
![Page 113: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/113.jpg)
CSSO – рефакторинг
![Page 114: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/114.jpg)
Этап 1 – 1.3.12• Первый патч
• Разобрал PR
• Разобрал и классифицировал тикеты
78
![Page 115: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/115.jpg)
Этап 2 – 1.4• Перенес наши фиксы в CSSO
• Обновление API и инфраструктуры
• Реорганизация файлов
• Исправлено множество багов (60+ тикетов)
• Базовый рефакторинг компрессора79
![Page 116: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/116.jpg)
Этап 3 – в работе• Рефакторинг компрессора
• Внутренний формат AST
• Ускорение компрессии в 2-3 раза
80
![Page 117: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/117.jpg)
Планы
![Page 118: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/118.jpg)
Главная цель – лучший минификатор
![Page 119: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/119.jpg)
Направление работы• Новые алгоритмы: быстрее и правильно
• Режим линтера
• Source Maps
• Новые оптимизации
• Новый парсер
• Инструменты83
![Page 120: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/120.jpg)
Новые оптимизации
![Page 121: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/121.jpg)
85
.foo { color: red;}.bar { color: green;}.qux { color: red;}
.foo, .qux { color: red;}.bar { color: green;}
Трансформация не безопасна,7так как мы не знаем как используется CSS в разметке
Вспомним пример
![Page 122: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/122.jpg)
Но что, если мы знаем как используется?
86
![Page 123: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/123.jpg)
Это позволит• Делать больше структурных изменений
• Удалять мертвый код
• Девать советы о неоптимальном CSS (лишний код, слишком сильный селектор и т.д.)
87
![Page 124: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/124.jpg)
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)
Вспомним таблицу
![Page 125: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/125.jpg)
Специфично для проекта, зависит от стека и подходов
создания CSS
89
![Page 126: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/126.jpg)
Новый парсер
![Page 127: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/127.jpg)
Чтобы лучше понимать CSS, нужно много деталей
о свойствах, значениях и селекторах
91
![Page 128: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/128.jpg)
Такие детали может предоставлять парсерНо такого пока нет
92
![Page 129: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/129.jpg)
Начало работы github.com/lahmatiy/css-parser
93
Первые результаты оптимистичные
![Page 130: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/130.jpg)
Цели перед парсером• Скорость и эффективность по памяти
• Толерантность к ошибкам
• Детальное AST (информация о свойствах, значениях, селекторах и @-правилах)
• Поддержка поточности
94
![Page 131: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/131.jpg)
Инструменты
![Page 132: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/132.jpg)
Инструментов для разработки крайне мало
96
![Page 133: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/133.jpg)
Все плохо• Нет хорошего детального парсера
• Нет стандарта AST
• Нет инструментов для анализа
• Нет инструментов для сравнения
• Даже линтеров нет (кроме проверки стиля)
97
![Page 134: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/134.jpg)
AST
![Page 135: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/135.jpg)
AST
Форматирование
![Page 136: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/136.jpg)
AST
Компрессор
Форматирование
![Page 137: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/137.jpg)
AST
Компрессор
Форматирование
AST
![Page 138: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/138.jpg)
AST
Компрессор
Линтер
Форматирование
AST
![Page 139: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/139.jpg)
AST
Компрессор
Линтер
Форматирование
AST
![Page 140: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/140.jpg)
AST
Компрессор
Линтер
Форматирование
Анализ
AST
![Page 141: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/141.jpg)
AST
Компрессор
Линтер
Форматирование
Анализ
AST
Отчет
![Page 142: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/142.jpg)
AST
Компрессор
Линтер
Форматирование
Анализ
и т.д.
AST
Отчет
…
![Page 143: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/143.jpg)
99
github.com/lahmatiy/css-ast-explorer
Инструменты для инструментов
![Page 144: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/144.jpg)
В заключении
![Page 145: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/145.jpg)
Выбирайте с умом
![Page 146: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/146.jpg)
Любите CSS, читайте спеки
![Page 147: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/147.jpg)
103
Делайте инструменты
![Page 148: CSSO — минимизируем CSS](https://reader038.vdocuments.site/reader038/viewer/2022110218/58f1332b1a28abd7488b461f/html5/thumbnails/148.jpg)
Сделаем CSS лучше!