Автоматизация
☠
или смерть!
Web Standards Days
СПб, 28 июня 2014
-
Антон Еремеев
-
Артём Пархоменко
Опасность!
- HTML
- CSS
- Организация кода
- Управление зависимостями
- Тестирование
Статические прототипы
- короче цикл внесения изменений
- отвязка от технологии
- не нужен сервер
Проблемы статического HTML
- сложно найти место, где править
- надо поддерживать много файлов
- сложно править таблицы и списки
Проблема 1:
Сложно найти место,
куда вносить исправления
Проблема 2:
Надо поддерживать много файлов
в актуальном состоянии
Проблема 3:
Таблицы и списки
Бонусы Assemble
- удобная конфигурация
postprocess
- огромная библиотека хелперов
- возможность писать свои
Проблемы CSS
- повторения в селекторах
- отсутствие конфигурации
- префиксы
- свой вариант
Обычно упоминают
- вложенность селекторов
- переменные
- миксины
- префиксы
Колонки без циклов
.columns {
&--column {
float: left;
&-1_2 {
width: 50%;
}
&-1_3 {
width: (100% / 3);
}
&-2_3 {
width: (100% / 3) * 2;
}
&-1_4 {
width: 25%;
}
&-2_4 {
@extend .columns--column-1_2;
}
&-3_4 {
width: 75%;
}
&-1_5 {
width: 20%;
}
&-2_5 {
width: 40%;
}
&-3_5 {
width: 60%;
}
&-4_5 {
width: 80%;
}
&-1_6 {
width: (100% / 6);
}
&-2_6 {
@extend .columns--column-1_3;
}
&-3_6 {
@extend .columns--column-1_2;
}
&-4_6 {
@extend .columns--column-2_3;
}
&-5_6 {
width: (100% / 6) * 5;
}
&-1_8 {
width: (100% / 8);
}
&-2_8 {
@extend .columns--column-1_4;
}
&-3_8 {
width: (100% / 8) * 3;
}
&-4_8 {
@extend .columns--column-1_2;
}
&-5_8 {
width: (100% / 8) * 5;
}
&-6_8 {
@extend .columns--column-3_4;
}
&-7_8 {
width: (100% / 8) * 7;
}
&-1_10 {
width: (100% / 10);
}
&-2_10 {
@extend .columns--column-1_5;
}
&-3_10 {
width: (100% / 10) * 3;
}
&-4_10 {
@extend .columns--column-2_5;
}
&-5_10 {
@extend .columns--column-1_2;
}
&-6_10 {
@extend .columns--column-3_5;
}
&-7_10 {
width: (100% / 10) * 7;
}
&-8_10 {
@extend .columns--column-4_5;
}
&-9_10 {
width: (100% / 10) * 9;
}
}
}
Циклы
.columns {
&--column {
for $colsTotal in (2 3 4 5 6 8 10) {
for $col in (1...$colsTotal) {
&-{$col}_{$colsTotal} {
width: $col * (100% / $colsTotal);
}
}
}
}
}
Параметризация
$columnsAvailable ?= (2 3 4 5 6 8 10 12 20);
$columnsGap ?= 20px;
.columns {
&--column {
padding-left: $columnsGap;
for $colsTotal in $columnsAvailable {
for $col in (1...$colsTotal) {
&-{$col}_{$colsTotal} {
width: $col * (100% / $colsTotal);
}
}
}
}
}
поддержка проекта — проще
создание новых блоков — медленнее
Yeoman
- механизм запуска генерации
- логирование
- взаимодействие с пользователем
- процессинг файлов
Подключаем jQuery
Bower
Добавление зависимостей
bower.json
{
"name": "project",
"dependencies": {
"selectbox": "1.1.0",
"combobox": "1.0.1",
"scrollable": "2.0.8"
}
}
CLI
$ bower install jquery --save
Что переиспользовать?
Зависимости
dev
- styl файлы
- верстка
- хелперы
- демо данные
prod
- библиотеки
- контролы
- виджеты
Источники зависимостей
- bower-registry
- git-репозиторий
- ссылка на файл или архив
- svn-репозиторий
Что тестировать?
Зависимости
prod
- библиотеки
- контролы
- виджеты
Unit-тесты в браузере
- создать spec файл
- подключить тесты/фреймворки
- открыть все целевые браузеры
karma.conf.js
module.exports = function(config) {
config.set({
basePath: '',
frameworks: ['jasmine'],
files: [
'src/dx.*.js',
'test/dx.*.unit.spec.js'
],
browsers: ['PhantomJS', 'Chrome']
});
};
Karma-runner
- запуск браузеров
- любой тестовый фреймворк
- file watchers
- препроцессинг любой сложности
- быстрая обратная связь
Пользовательские события
—
это тоже API
ng-scenario
- легко настроить
- совместим с Karma
- строгое API
- расширяемое API
Пишем кастомный скроллбар
Тестируем скроллбар
it('should scroll when bar dragged', function() {
mouseDown('.scrollbar-vertical .scrollbar--bar', {
clientY: 20,
bubbles: true
});
mouseMove('body', {
clientY: 76,
bubbles: true
});
mouseUp('body', {
clientY: 1000,
bubbles: true
});
expect(element('.foo').scrollTop()).toBe(100);
});
Это ещё не всё!
- линтовка
- конкатенация, минификация
- спрайты, оптимизация картинок
- запуск дев-сервера
- релиз новой версии
- rhr.me/pres/automation
npm scripts
$ npm install
$ npm test
$ npm run build
$ npm run release