22
1 CSScomb.js вторая жизнь Михаил Трошев, Яндекс MoscowJS, 26 июня 2014

"CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

Embed Size (px)

Citation preview

Page 1: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

1

CSScomb.js вторая жизнь

Михаил Трошев, Яндекс MoscowJS, 26 июня 2014

Page 2: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

2

Статистика

Наша команда: 6 городов 30 разработчиков ~10 пул-реквестов в день

Page 3: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

3

Статистика

Наш код: > 1 Мб исходного CSS > 40 000 строк ~140 Кб после минификации

Page 4: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

4

Коллективная разработка

большой и старый проект непрерывная интеграция автобусное число коллективное владение кодом

Page 5: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

5

Коллективная разработка

код-ревью код-стайл

договоренности инструменты

Page 6: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

6

Инструменты

JavaScript: JSHint, JSCS, JSLint, ESLint CSS: ???

Page 7: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

7

Инструменты

CSScomb: + сортировка – ничего больше – PHP – RegExp

Page 8: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

8

Инструменты

TODO: CSScomb.js

Page 9: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

9

Слагаемые успеха

Page 10: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

10

Ингридиенты

парсер — Gonzales обвязка — JSCS модули — TODO тесты — TODO

Page 11: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

11

Схема работы

Page 12: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

12

Gonzales AST

color: rgb(255,0,0)"['declaration', ['property', ['ident', 'color']], ['propertyDelim'], ['value', ['s', ' '], ['function', ['ident', 'rgb'], ['functionBody', ['number', '255'], ['operator', ','], ['number', '0'], ['operator', ','], ['number', '0']]]]]

Page 13: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

13

Преобразование узлов

processTree: function(tree) { this._handlers.forEach(function(handler) { this.processNode(['tree', tree], 0, handler); }, this); return tree;},processNode: function(node, level, handler) { node.forEach(function(node) { var nodeType = node.shift(); handler.process(nodeType, node, level); node.unshift(nodeType); this.processNode(node, level, handler); }, this);}

Page 14: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

14

Обработчик

process: function(nodeType, node) { if (nodeType === 'string') { if (node[0][0] === '"' && this._value === 'single’) node[0] = node[0] .replace(/\\"/g, '"') .replace(/([^\\])'/g, '$1\\\'') .replace(/^"|"$/g, '\''); else if (node[0][0] === '\'' && this._value === 'double’) node[0] = node[0] .replace(/\\'/g, '\'') .replace(/([^\\])"/g, '$1\\\"') .replace(/^'|'$/g, '"'); }}

Page 15: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

15

На сегодняшний день

— консольный и модульный режимы работы — lint-режим — поддержка LESS и SASS — сортировка + 24 модуля — автоматическая генерация конфига (!!!) — плагин для grunt — плагины для IDE TODO: — поддержка Stylus

Page 16: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

16

На сегодняшний день

github.com/csscomb/csscomb.js

$ npm i csscomb версия — 2.0.5

мейнтейнер — @tonyganch

Page 17: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

17

Пример

.test{ -webkit-transition: -webkit-transform .6s; transition: transform .6s; -webkit-transform: scale(.6,.6); transform: scale(.6, .6)}.test{ -webkit-transition: -webkit-transform 0.6s; transition: transform 0.6s; -webkit-transform: scale(0.6, 0.6); transform: scale(0.6, 0.6);}

Page 18: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

18

Пример .select__separator{position:relative;z-index:3;float:left;width:100%;margin-top:-1px;border-top:1px solid;font:0/0 a}.select__separator{ font: 0/0 a; position: relative; z-index: 3; float: left; width: 100%; margin-top: -1px; border-top: 1px solid;}

Page 19: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

19

Полезные ссылки

https://github.com/csscomb/csscomb.js https://github.com/tonyganch/gonzales-pe https://github.com/csslint/csslint https://github.com/css/csso https://github.com/goalsmashers/clean-css https://github.com/jshint/jshint/ https://github.com/ikokostya/jshint-groups https://github.com/mdevils/node-jscs https://github.com/eslint/eslint https://github.com/ariya/esprima

Page 20: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

20

Спасибо за внимание!

Page 21: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

21

Михаил Трошев

Руководитель службы поисковых интерфейсов

mishanga.pro @ya_mishanga

Яндекс

Page 22: "CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12

22

Бонус-трек: оптимизация 170585 search.sort.css165145 search.css143685 search.csso.css143685 search.csso.sort.css142842 search.clean.sort.css142744 search.clean.css29315 search.sort.css.gzip29117 search.css.gzip27784 search.csso.css.gzip27663 search.clean.css.gzip27648 search.sort.css.gz27619 search.csso.sort.css.gzip27532 search.clean.sort.css.gzip27495 search.css.gz26357 search.csso.css.gz26319 search.clean.css.gz26208 search.csso.sort.css.gz26099 search.clean.sort.css.gz

*.gz — zopfli --i15 *.gzip — gzip -7 *.sort.* — после запуска csscomb *.csso.* — после csso *.clean.* — после clean-css Победитель: clean-css + csscomb + zopfli