Алексей Андросов
Старший разработчик интерфейсов
WSD, Санкт-Петербург, 8 июня 2013 года
Алексей Андросов
Старший разработчик интерфейсов
WSD, Санкт-Петербург, 8 июня 2013 года
Borschik, CSSO и SVGO
Презентация: bit.ly/doochik-wsd-spb
page.css
@import url("b-header/b-header.css");
@import url("b-footer/b-footer.css");
Запускаем
$ borschik --input=page.css
Получаем
/* b-header/b-header.css begin */
.b-header {...}
/* b-header/b-header.css end */
/* b-footer/b-footer.css begin */
.b-footer {...}
/* b-footer/b-footer.css end */
Правильное раскрытие путей
b-footer/b-footer.css
.b-footer {
background: url("bg.png");
}
Правильное раскрытие путей
В page.css получим
.b-footer {
background: url("b-footer/bg.png");
}
borschik:include
в /**/ раскрываются без преобразований
page.js
/* borschik:include:b-header/b-header.js */
/* borschik:include:b-footer/b-footer.js */
Запускаем
$ borschik --input=page.js
Получаем
/* b-header/b-header.js begin */
...b-header/b-header.js content ...
/* b-header/b-header.js end */
/* b-footer/b-footer.js begin */
...b-footer/b-footer.js content ...
/* b-footer/b-footer.js end */
"borschik:include"
раскрывается через JSON.stringify
page.js
var prj = {};
prj.STATIC_HOST = "borschik:include:configs/host.txt";
host.txt
http://yandex.st
Получаем
var prj = {};
prj.STATIC_HOST = "http://yandex.st";
{
"paths" : {
"./": "/",
"css/": "//yandex.st/my-prj/css/"
}
}
css/style.css
background: url("../imgs/bg1.png")
Правило
"./": "/"
Результат
background: url("/imgs/bg1.png")
css/style.css
background: url("bg2.png")
Правило
"css/": "//yandex.st/my-prj/css/"
Результат
background: url("//yandex.st/my-prj/css/bg2.png")
Загрузка ресурсов (например, картинок) по урлу, зависящему от содержимого файла (хеш-суммы)
Все ссылки на ресурсы заменяются на хеш от контента файла и создается файл, у которого имя – хеш
{
"freeze_paths" : {
"css": "../_"
}
}
css/style.css
.style {
background: url("hot.png");
}
Запускаем
$ borschik --input=css/style.css --freeze=yes
.style {
background: url("../_/jUK5O9GsR0hf0.png");
}
Можно фризить:
GitHub: github.com/bem/borschik
GitHub: github.com/bem/borschik
Подробная статья: bit.ly/ru-borschik
Всё про заморозку в моем докладе на Я.Субботнике:
bit.ly/doochik-kiev
Строит AST дерево
AST дает полное понимание всех деклараций и селекторов.
А значит можно менять структуру самих CSS-деклараций!
.merge0 {color: red}
.merge1 {color: blue}
.merge1 {margin: 0}
↓
.merge0 {color: red}
.merge1 {color: blue; margin: 0}
.property0 {margin: 1em}
.property1 {margin: 0}
.property2 {margin: 0}
↓
.property0 {margin: 1em}
.property1, property2 {margin: 0}
.split0 {color: red; border: none; margin: 0}
.split1 {color: blue; border: none; margin: 0}
↓
.split0 {color: red}
.split1 {color: blue}
.split0, split1 {border: none; margin: 0}
.override {padding: 1em; margin: 0; padding: 0}
↓
.override {margin: 0; padding: 0}
В тестах использовались
Ajax Minifier | CSSO | CSScomb + CSSO | CSSmin | |
---|---|---|---|---|
source | 127352 | |||
source.gz | 18384 | |||
min | 105710 | 105644 | 105644 | 106035 |
min.gz | 17103 | 17085 | 17097 | 17101 |
Ajax Minifier | CSSO | CSScomb + CSSO | CSSmin | |
---|---|---|---|---|
source | 32456 | |||
source.gz | 6101 | |||
min | 25669 | 25250 | 24756 | 25645 |
min.gz | 4918 | 4885 | 4659 | 4899 |
Ajax Minifier | CSSO | CSScomb + CSSO | CSSmin | |
---|---|---|---|---|
source | 136008 | |||
source.gz | 19410 | |||
min | 94010 | 92884 | 92884 | 93995 |
min.gz | 13209 | 13128 | 13136 | 13206 |
Ajax Minifier | CSSO | CSScomb + CSSO | CSSmin | |
---|---|---|---|---|
source | 371466 | |||
source.gz | 53235 | |||
min | 250373 | 247153 | 247153 | 249066 |
min.gz | 41212 | 41064 | 40631 | 40987 |
Github github.com/css/csso
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In .
SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://
www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="120px" height="120px" viewBox="0 0 120 120"
enable-background="new 0 0 120 120" xml:space="preserve">
<g>
<g>
<circle fill="#ff0000" cx="60px" cy="60px" r="50px"/>
</g>
</g>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In .
SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://
www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="120px" height="120px" viewBox="0 0 120 120"
enable-background="new 0 0 120 120" xml:space="preserve">
<g>
<g>
<circle fill="#ff0000" cx="60px" cy="60px" r="50px"/>
</g>
</g>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In .
SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://
www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="120px" height="120px" viewBox="0 0 120 120"
enable-background="new 0 0 120 120" xml:space="preserve">
<g>
<g>
<circle fill="#ff0000" cx="60px" cy="60px" r="50px"/>
</g>
</g>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In .
SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://
www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="120px" height="120px" viewBox="0 0 120 120"
enable-background="new 0 0 120 120" xml:space="preserve">
<g>
<g>
<circle fill="#ff0000" cx="60px" cy="60px" r="50px"/>
</g>
</g>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In .
SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://
www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="120px" height="120px" viewBox="0 0 120 120"
enable-background="new 0 0 120 120" xml:space="preserve">
<g>
<g>
<circle fill="#ff0000" cx="60px" cy="60px" r="50px"/>
</g>
</g>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In .
SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://
www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="120px" height="120px" viewBox="0 0 120 120"
enable-background="new 0 0 120 120" xml:space="preserve">
<g>
<g>
<circle fill="#ff0000" cx="60px" cy="60px" r="50px"/>
</g>
</g>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In .
SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://
www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="120px" height="120px" viewBox="0 0 120 120"
enable-background="new 0 0 120 120" xml:space="preserve">
<g>
<g>
<circle fill="#ff0000" cx="60px" cy="60px" r="50px"/>
</g>
</g>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In .
SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://
www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="120px" height="120px" viewBox="0 0 120 120"
enable-background="new 0 0 120 120" xml:space="preserve">
<g>
<g>
<circle fill="red#ff0000" cx="60px" cy="60px" r="50px"/>
</g>
</g>
</svg>
<style>
в атрибуты<style>
в атрибуты<style>
в атрибутыPath
<style>
в атрибутыPath
Polyline
<style>
в атрибутыPath
Polyline
<style>
в атрибутыPath
Polyline
Github github.com/svg/svgo