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

Similar to Basis.js - Production Ready Framework (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
Ad

Basis.js - Production Ready Framework