Top Banner
basis.js production ready framework 1
93

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

Jan 16, 2017

Download

Internet

AvitoTech
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: "Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)

basis.jsproduction ready framework

1

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

Обо мне

@smelukov

Работаю в Avito Делаю большое SPA

Преподаю JS Учу создавать веб-приложения

Люблю JS и жену Но больше жену

Популяризирую basis.js Верю, что basis.js захватит мир

Сергей Мелюков

2

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

Когда я рассказываю про basis.js

‣ Зачем?! Есть же [X] ‣ basis.js - сложный, а [X] - простой

3

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

Возможно, я не точно доносил смысл того, что такое basis.js и это

повлекло поспешные выводы

4

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

Действительно ли можно просто взять любой фреймворк и сразу начать делать веб-приложения?

5

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

Нет! Любой фреймворк требует

изучения и опыта использования

6

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

Поговорим о том, какие возможности дает basis.js из

коробки

7

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

План‣Компоненты ‣Источники данных ‣Локализация ‣ Трекинг событий ‣Инструменты разработки ‣Заключение

8

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

‣Компоненты ‣Источники данных ‣Локализация ‣ Трекинг событий ‣Инструменты разработки ‣Заключение

9

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

basis.js - это компонентный подход

10

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

OK

имя

фамилия

отчество

Отмена

11

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

new Node({ template: ..., binding: { firstName: ..., lastName: ..., }});

12

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

new Node({ template: ..., binding: { firstName: ..., lastName: ... }});

13

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

basis.js - это шаблоны без логики

14

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

<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

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

Логика в JS, шаблон в XHTML

16

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

<b:style src="./person.css"/><div class="person"> <div>Имя: {firstName}</div> <div>Фамилия: {lastName}</div> </div>

17

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

basis.js - это изоляция стилей и модульный CSS

18

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

<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

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

‣Компоненты ‣Источники данных ‣Локализация ‣ Трекинг событий ‣Инструменты разработки ‣Заключение

20

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

basis.js - это гибкое взаимодействие с источниками

данных

21

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

Источником данных может быть объект, коллекция объектов или

другой компонент

22

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

new Node({ template: ..., binding: { ... }, dataSource: ... });

23

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

childNodes

Component

items

Dataset (коллекция)

‣ model ‣ model ‣ model ‣ model ‣ model ‣ model

component component component component component component

24

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

Контролировать источник данных можно при помощи состояний

25

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

‣ processing - в состоянии синхронизации ‣ deprecated - данные устарели ‣ ready - готов к работе ‣ error - ошибка

26

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

Примеры использования?

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

Показываем спиннер, пока загружаются данные

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

Обновляем устаревшие данные

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

basis.js - это автоматические источники данных (индексы,

фильтры, etc…)

30

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

31

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

Выбранные друзья

items

Доступные друзья

items

‣ model ‣ model ‣ model???

32

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

Исключим выбранных друзей из всех друзей и получим доступных

друзей

33

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

allFriends = new Dataset();

favoriteFriends = new Dataset();availableFriends = new Subtract({ minuend: allFriends, subtrahend: favoriteFriends});

34

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

allFriends = new Dataset();

favoriteFriends = new Dataset();availableFriends = new Subtract({ minuend: allFriends, subtrahend: favoriteFriends});

35

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

allFriends = new Dataset();

favoriteFriends = new Dataset();availableFriends = new Subtract({ minuend: allFriends, subtrahend: favoriteFriends});

36

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

Почему не for?

37

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

Придется реализовать механизм отслеживания изменений

38

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

Такой механизм уже встроен в наборы basis.js!

39

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

allFriends = new Dataset();

favoriteFriends = new Dataset();availableFriends = new Subtract({ minuend: allFriends, subtrahend: favoriteFriends});

40

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

А есть еще что-то, кроме Subtract?

41

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

42

‣ Merge - объединение коллекций ‣ Filter - фильтрация элементов коллекции ‣ Slice - срез элементов коллекции ‣ Split - деление коллекции на подмножества ‣ etc…

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

Для агрегации элементов коллекции используются индексы

43

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

44

‣ Min - минимальное значение коллекции ‣ Max - максимальное значение коллекции ‣ Avg - среднее значение коллекции ‣ Sum - сумма элементов в коллекции ‣ etc…

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

Манипуляция с данными, а не с DOM DOM - всего лишь отображение

45

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

‣Компоненты ‣Источники данных ‣Локализация ‣ Трекинг событий ‣Инструменты разработки ‣Заключение

46

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

basis.js - это удобные инструменты локализации

47

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

Словарь - это JSON-файл

48

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

{ "en-US": { "hello": "Hello!" }, "ru-RU": { "hello": "Привет!" }}

49

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

{ "en-US": { "hello": "Hello!" }, "ru-RU": { "hello": "Привет!" } }

<div> {l10n:hello}</div>

50

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

<div> Привет!</div>

51

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

В словарях можно использовать биндинги и разметку

52

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

new Node({ template: ... binding: { firstName: ..., lastName: ... }});

53

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

{ "_meta": { "type": { "hello": "markup" } }, "ru-RU": { "hello": "Привет, <b>{firstName} {lastName}</b>" }}

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

{ "_meta": { "type": { "hello": "markup" } }, "ru-RU": { "hello": "Привет, <b>{firstName} {lastName}</b>" }}

<div> {l10n:hello}</div>

55

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

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

56

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

Грамматическое число поддерживается на уровне словаря

57

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

new Node({ template: ... binding: { total: ... }});

58

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

{ "_meta": { "type": { "offer": "plural" } }, "ru-RU": { "offer": [ "Всего {#} объявление", "Всего {#} объявления", "Всего {#} объявлений" ] }}

59

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

{ "_meta": { "type": { "offer": "plural" } }, "ru-RU": { "offer": [ "Всего {#} объявление", "Всего {#} объявления", "Всего {#} объявлений" ] }}

<div> {l10n:offer.{total}} </div>

60

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

<div> Всего 10 объявлений</div>

61

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

‣Компоненты ‣Источники данных ‣Локализация ‣ Трекинг событий ‣Инструменты разработки ‣Заключение

62

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

basis.js - это трекинг событий

63

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

Разметим компоненты и шаблоны ролями

64

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

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

new Node({ template: ..., role: "popup"});

65

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

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

66

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

Создадим tracking-map и укажем за чем необходимо следить

67

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

{ "popup/ok": { "click": { ... } }, "popup/cancel": { "click": { ... } }}

map.json

68

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

{ "popup/ok": { "click": [ ... ] }, "popup/cancel": { "click": [ ... ] }}

map.json

69

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

Соединяем воедино

70

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

tracker.loadMap(require('./map.json'));tracker.attach(function(info) { // Google Analytics ga(info.data);});

71

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

tracker.loadMap(require('./map.json'));tracker.attach(function(info) { // Google Analytics ga(info.data);});

72

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

tracker.loadMap(require('./map.json'));tracker.attach(function(info) { // Google Analytics ga(info.data);});

73

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

‣Компоненты ‣Источники данных ‣Локализация ‣ Трекинг событий ‣Инструменты разработки ‣Заключение

74

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

basis.js - это удобные инструменты разработки

75

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

Граф зависимостей - простое приложение

76

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

Граф зависимостей - сложное приложение

77

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

‣ выбраны услуги ‣достаточно средств ‣достаточно прав

78

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

Почему кнопка неактивна?

79

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

80

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

Более подробно в докладе Романа Дворнова http://bit.ly/2fr9vXO

81

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

‣ Прошлый опыт ‣ Компоненты ‣ Источники данных ‣ Локализация ‣ Трекинг событий ‣ Инструменты разработки ‣ Заключение

82

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

И все таки… Почему мне нужно

использовать basis.js?

83

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

basis.js уже сейчас активно используется в production

84

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

Попробуйте basis.js и сделайте свои выводы

85

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

Как попробовать?

86

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

‣ npm i -g basisjs-tools basis create app basis server

87

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

‣ npm i -g basisjs-tools ‣ basis create app

basis server

88

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

‣ npm i -g basisjs-tools ‣ basis create app ‣ basis server

89

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

90

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

Отлично! А минусы тоже есть?

91

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

‣ Документация ‣ Есть что улучшать ‣ Сообщество (есть gitter)

92

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

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

93