SlideShare a Scribd company logo
basis.js
production ready framework
1
Обо мне
@smelukov
Работаю в Avito
Делаю большое SPA
Преподаю JS
Учу создавать веб-приложения
Люблю JS и жену
Но больше жену
Популяризирую basis.js
Верю, что basis.js захватит мир
Сергей Мелюков
2
Когда я рассказываю про basis.js
‣ Зачем?! Есть же [X]
‣ basis.js - сложный, а [X] - простой
3
Возможно, я не точно доносил
смысл того, что такое basis.js и это
повлекло поспешные выводы
4
Действительно ли можно просто
взять любой фреймворк и сразу
начать делать веб-приложения?
5
Нет!
Любой фреймворк требует
изучения и опыта использования
6
Поговорим о том, какие
возможности дает basis.js из
коробки
7
План
‣ Компоненты
‣ Источники данных
‣ Локализация
‣ Трекинг событий
‣ Инструменты разработки
‣ Заключение
8
‣ Компоненты
‣ Источники данных
‣ Локализация
‣ Трекинг событий
‣ Инструменты разработки
‣ Заключение
9
basis.js - это компонентный
подход
10
OK
имя
фамилия
отчество
Отмена
11


new Node({

template: ...,

binding: {

firstName: ...,

lastName: ...,

}

});
12


new Node({

template: ...,

binding: {

firstName: ...,

lastName: ...

}

});
13
basis.js - это шаблоны без
логики
14
<li *ngFor="let item of items; let i = index; trackBy: trackByFn">...</li>

<li template="ngFor let item of items; let i = index; trackBy: trackByFn">...</li>
if (todos.length) {

main = (

<section className="main">

<input

className="toggle-all"

type="checkbox"

onChange={this.toggleAll}

checked={activeTodoCount === 0}

/>

<ul className="todo-list">

{todoItems}

</ul>

</section>

);

}

15
Логика в JS, шаблон в XHTML
16
<b:style src="./person.css"/>



<div class="person">

<div>Имя: {firstName}</div>

<div>Фамилия: {lastName}</div>

</div>
17
basis.js - это изоляция стилей и
модульный CSS
18
<b:style src="./person.css"/>

<b:isolate/>



<div class="person">

<div class="photo"> ... </div>

<div class="info"> ... </div>

</div>
<style> ... </style>



<div class="i1__person">

<div class="i1__photo"> ...</div>

<div class="i1__info"> ...</div>

</div>
19
‣ Компоненты
‣ Источники данных
‣ Локализация
‣ Трекинг событий
‣ Инструменты разработки
‣ Заключение
20
basis.js - это гибкое
взаимодействие с источниками
данных
21
Источником данных может быть
объект, коллекция объектов или
другой компонент
22


new Node({

template: ...,

binding: { ... },
dataSource: ... 

});
23
childNodes
Component
items
Dataset
(коллекция)
‣ model
‣ model
‣ model
‣ model
‣ model
‣ model
component
component
component
component
component
component
24
Контролировать источник данных
можно при помощи состояний
25
‣ processing - в состоянии синхронизации
‣ deprecated - данные устарели
‣ ready - готов к работе
‣ error - ошибка
26
Примеры использования?
Показываем спиннер, пока
загружаются данные
Обновляем устаревшие данные
basis.js - это автоматические
источники данных (индексы,
фильтры, etc…)
30
31
Выбранные друзья
items
Доступные друзья
items
‣ model
‣ model
‣ model???
32
Исключим выбранных друзей из
всех друзей и получим доступных
друзей
33
allFriends = new Dataset();
favoriteFriends = new Dataset();



availableFriends = new Subtract({

minuend: allFriends,

subtrahend: favoriteFriends

});
34
allFriends = new Dataset();
favoriteFriends = new Dataset();



availableFriends = new Subtract({

minuend: allFriends,

subtrahend: favoriteFriends

});
35
allFriends = new Dataset();
favoriteFriends = new Dataset();



availableFriends = new Subtract({

minuend: allFriends,

subtrahend: favoriteFriends

});
36
Почему не for?
37
Придется реализовать механизм
отслеживания изменений
38
Такой механизм уже встроен в
наборы basis.js!
39
allFriends = new Dataset();
favoriteFriends = new Dataset();



availableFriends = new Subtract({

minuend: allFriends,

subtrahend: favoriteFriends

});
40
А есть еще что-то, кроме Subtract?
41
42
‣ Merge - объединение коллекций
‣ Filter - фильтрация элементов коллекции
‣ Slice - срез элементов коллекции
‣ Split - деление коллекции на подмножества
‣ etc…
Для агрегации элементов коллекции
используются индексы
43
44
‣ Min - минимальное значение коллекции
‣ Max - максимальное значение коллекции
‣ Avg - среднее значение коллекции
‣ Sum - сумма элементов в коллекции
‣ etc…
Манипуляция с данными, а не с DOM
DOM - всего лишь отображение
45
‣ Компоненты
‣ Источники данных
‣ Локализация
‣ Трекинг событий
‣ Инструменты разработки
‣ Заключение
46
basis.js - это удобные
инструменты локализации
47
Словарь - это JSON-файл
48
{

"en-US": {

"hello": "Hello!"

},

"ru-RU": {

"hello": "Привет!"

}

}
49
{

"en-US": {

"hello": "Hello!"

},

"ru-RU": {

"hello": "Привет!"

}

}
<div>

{l10n:hello}

</div>
50
<div>

Привет!

</div>
51
В словарях можно использовать
биндинги и разметку
52
new Node({

template: ...
binding: {

firstName: ...,

lastName: ...

}

});
53
{

"_meta": {

"type": {

"hello": "markup"

}

},

"ru-RU": {

"hello": "Привет, <b>{firstName} {lastName}</b>"

}

}
{

"_meta": {

"type": {

"hello": "markup"

}

},

"ru-RU": {

"hello": "Привет, <b>{firstName} {lastName}</b>"

}

}
<div>

{l10n:hello}

</div>
55
<div>

Привет, <b>Иван Петров</b>

</div>
56
Грамматическое число
поддерживается на уровне словаря
57
new Node({

template: ...
binding: {

total: ...

}

});
58
{

"_meta": {

"type": {

"offer": "plural"

}

},

"ru-RU": {

"offer": [

"Всего {#} объявление",

"Всего {#} объявления",

"Всего {#} объявлений"

]

}

}
59
{

"_meta": {

"type": {

"offer": "plural"

}

},

"ru-RU": {

"offer": [

"Всего {#} объявление",

"Всего {#} объявления",

"Всего {#} объявлений"

]

}

}
<div>

{l10n:offer.{total}}

</div>
60
<div>

Всего 10 объявлений

</div>
61
‣ Компоненты
‣ Источники данных
‣ Локализация
‣ Трекинг событий
‣ Инструменты разработки
‣ Заключение
62
basis.js - это трекинг событий
63
Разметим компоненты и
шаблоны ролями
64
<div b:role>

<div> ... </div>

<button b:role="ok">OK</button>

<button b:role="cancel">Отмена</button>

</div>
new Node({

template: ...,

role: "popup"

});
65
<div role-marker="popup">

<div> ... </div>

<button role-marker="popup/ok">OK</button>

<button role-marker="popup/cancel">Отмена</button>

</div>
66
Создадим tracking-map и укажем
за чем необходимо следить
67
{

"popup/ok": {

"click": {

...

}

},
"popup/cancel": {

"click": {

...

}

}

}
map.json
68
{

"popup/ok": {

"click": [

...

]

},
"popup/cancel": {

"click": [

...

]

}

}
map.json
69
Соединяем воедино
70
tracker.loadMap(require('./map.json'));

tracker.attach(function(info) {
// Google Analytics

ga(info.data);

});
71
tracker.loadMap(require('./map.json'));

tracker.attach(function(info) {
// Google Analytics

ga(info.data);

});
72
tracker.loadMap(require('./map.json'));

tracker.attach(function(info) {
// Google Analytics

ga(info.data);

});
73
‣ Компоненты
‣ Источники данных
‣ Локализация
‣ Трекинг событий
‣ Инструменты разработки
‣ Заключение
74
basis.js - это удобные
инструменты разработки
75
Граф зависимостей - простое приложение
76
Граф зависимостей - сложное приложение
77
‣ выбраны услуги
‣ достаточно средств
‣ достаточно прав
78
Почему кнопка неактивна?
79
80
Более подробно в докладе
Романа Дворнова
http://bit.ly/2fr9vXO
81
‣ Прошлый опыт
‣ Компоненты
‣ Источники данных
‣ Локализация
‣ Трекинг событий
‣ Инструменты разработки
‣ Заключение
82
И все таки…
Почему мне нужно
использовать basis.js?
83
basis.js уже сейчас активно
используется в production
84
Попробуйте basis.js и сделайте
свои выводы
85
Как попробовать?
86
‣ npm i -g basisjs-tools
basis create app
basis server
87
‣ npm i -g basisjs-tools
‣ basis create app
basis server
88
‣ npm i -g basisjs-tools
‣ basis create app
‣ basis server
89
90
Отлично!
А минусы тоже есть?
91
‣ Документация
‣ Есть что улучшать
‣ Сообщество (есть gitter)
92
Спасибо за внимание!
93

More Related Content

PDF
JavaScript Базовый. Занятие 07.
PDF
CSS глазами машин
PDF
Быстро о быстром
PDF
JavaScript Базовый. Занятие 08.
PDF
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
PDF
Basis.js – «под капотом»
PDF
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
PDF
basis.js - почему я не бросил разрабатывать свой фреймворк
JavaScript Базовый. Занятие 07.
CSS глазами машин
Быстро о быстром
JavaScript Базовый. Занятие 08.
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
Basis.js – «под капотом»
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
basis.js - почему я не бросил разрабатывать свой фреймворк

What's hot (19)

PDF
DOM-шаблонизаторы – не только "быстро"
PDF
Как построить DOM
PDF
Svyatoslav Login "360 View of XSS"
PDF
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
PDF
Не бойся, это всего лишь данные... просто их много
PPT
построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...
PDF
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
PDF
Kranonit s16 (python). dmitry furzenko
PDF
Баба Яга против!
PDF
Компонентный подход: скучно, неинтересно, бесперспективно
PDF
МРТ для данных, Frontend Conf 2016
PPTX
Web осень 2013 лекция 4
PPTX
Основы MongoDB + NodeJS
PDF
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
PPT
инструкция по оптимизации сайтов на Drupal херени даниэл
PPTX
Основы JS
PDF
Олег Мохов: Модель Отображения. Браузеры
PPTX
Web осень 2013 лекция 8
DOM-шаблонизаторы – не только "быстро"
Как построить DOM
Svyatoslav Login "360 View of XSS"
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
Не бойся, это всего лишь данные... просто их много
построение внутренней ссылочной структуры сайта на Drupal 7 (seo). Костин ...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Kranonit s16 (python). dmitry furzenko
Баба Яга против!
Компонентный подход: скучно, неинтересно, бесперспективно
МРТ для данных, Frontend Conf 2016
Web осень 2013 лекция 4
Основы MongoDB + NodeJS
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
инструкция по оптимизации сайтов на Drupal херени даниэл
Основы JS
Олег Мохов: Модель Отображения. Браузеры
Web осень 2013 лекция 8
Ad

Viewers also liked (20)

PDF
"Favicon на стероидах" Александр Амосов (Avito)
PDF
"DeepLink’и в Avito" Артём Разинов (Avito)
PDF
"Погружение в Robolectric" Дмитрий Костырев (Avito)
PDF
"Распознавание категории объявления по изображениям" Артур Кузин (МФТИ)
PDF
"Построение рекомендательной системы на Python" Василий Лексин (Avito)
PPTX
"Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (...
PDF
Golang в avito
PDF
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
PDF
Андрей Юткин. Media Picker — to infinity and beyond
PDF
Как сделать ваш JavaScript быстрее
PDF
Remote (dev)tools своими руками
PDF
"Опыт миграции между дата-центрами" Сергей Бурладян и Михаил Тюрин (Avito)
PDF
"Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av...
PDF
"Икскод, джейсон, два скетча" Олег Фролов (Avito)
PDF
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)
PDF
"Деплой кода процедур" Мурат Кабилов (Avito)
PDF
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
PDF
"Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)
PDF
"Ускорение сборки большого проекта на Objective-C + Swift" Иван Бондарь (Avito)
PDF
"Kotlin и rx в android" Дмитрий Воронин (Avito)
"Favicon на стероидах" Александр Амосов (Avito)
"DeepLink’и в Avito" Артём Разинов (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Распознавание категории объявления по изображениям" Артур Кузин (МФТИ)
"Построение рекомендательной системы на Python" Василий Лексин (Avito)
"Контекстная реклама в Avito: что под капотом?" Вадим Аюев и Андрей Остапец (...
Golang в avito
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
Андрей Юткин. Media Picker — to infinity and beyond
Как сделать ваш JavaScript быстрее
Remote (dev)tools своими руками
"Опыт миграции между дата-центрами" Сергей Бурладян и Михаил Тюрин (Avito)
"Marshroute: удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Av...
"Икскод, джейсон, два скетча" Олег Фролов (Avito)
"О некоторых особенностях Objective-C++" Влад Михайленко (Maps.Me)
"Деплой кода процедур" Мурат Кабилов (Avito)
"Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)
"Опыт использования Sphinx в Ozon.ru" Игорь Чакрыгин (OZON.RU)
"Ускорение сборки большого проекта на Objective-C + Swift" Иван Бондарь (Avito)
"Kotlin и rx в android" Дмитрий Воронин (Avito)
Ad

Similar to "Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito) (20)

PDF
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
PDF
FrontTalks: Роман Дворнов (Ostrovok.ru), «Basis.js: почему я не бросил разраб...
PDF
C# Web. Занятие 16.
PDF
D2D Pizza JS Илья Беда "Куда мы все катимся?"
PDF
Владимир Гриненко "i-bem.js: JavaScript в БЭМ-терминах"
PPT
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир Дупелев
PDF
Фреймворки: недалёкое прошлое и ближайшее будущее
PDF
Backbone.js
PDF
Фреймворки: Недалёкое Прошлое и Ближайшее Будущее
PDF
JavaScript в терминах БЭМ / Владимир Варанкин (Яндекс)
PPT
Арсений Заречнев и Федор Шумов - Одностраничные приложения
PDF
Инструментируй это
PPT
JavaScript-библиотека
PDF
Обзор ES2015(ES6)
PDF
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
PDF
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
PDF
Изоморфный JavaScript — будущее уже здесь
PDF
2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк
PDF
Шаблонизация
PPTX
AngularJS
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
FrontTalks: Роман Дворнов (Ostrovok.ru), «Basis.js: почему я не бросил разраб...
C# Web. Занятие 16.
D2D Pizza JS Илья Беда "Куда мы все катимся?"
Владимир Гриненко "i-bem.js: JavaScript в БЭМ-терминах"
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир Дупелев
Фреймворки: недалёкое прошлое и ближайшее будущее
Backbone.js
Фреймворки: Недалёкое Прошлое и Ближайшее Будущее
JavaScript в терминах БЭМ / Владимир Варанкин (Яндекс)
Арсений Заречнев и Федор Шумов - Одностраничные приложения
Инструментируй это
JavaScript-библиотека
Обзор ES2015(ES6)
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
Изоморфный JavaScript — будущее уже здесь
2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк
Шаблонизация
AngularJS

More from AvitoTech (20)

PDF
Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
PPTX
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
PDF
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
PPTX
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
PDF
Yandex Tank - Арсений Фомченко
PDF
Migro - Юрий Богомолов
PDF
TableKit - Максим Соколов
PDF
Jsonwire Grid - Михаил Подцерковский (Avito)
PDF
SimplePEG - Алексей Охрименко
PDF
Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
PDF
"Анонимизация фото с помощью Vision", Хомутников Тимофей, Avito
PDF
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
PDF
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
PDF
ASO for iOS 11
PDF
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
PDF
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
PDF
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
PDF
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
PDF
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
PDF
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов
Сегментация изображений на острие науки (Евгений Нижибицкий, Rambler&Co)
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Распознавание лиц с помощью глубоких нейронных сетей (Сергей Миляев, VisionLabs)
AvitoNet: сервис компьютерного зрения в Avito (Артур Кузин, Avito)
Yandex Tank - Арсений Фомченко
Migro - Юрий Богомолов
TableKit - Максим Соколов
Jsonwire Grid - Михаил Подцерковский (Avito)
SimplePEG - Алексей Охрименко
Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
"Анонимизация фото с помощью Vision", Хомутников Тимофей, Avito
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Ramb...
ASO for iOS 11
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов

"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)