78
basis.js почему я не бросил разрабатывать свой фреймворк Роман Дворнов Ostrovok.ru

basis.js - почему я не бросил разрабатывать свой фреймворк

  • Upload
    basisjs

  • View
    1.724

  • Download
    3

Embed Size (px)

DESCRIPTION

Презентация с РИТ2013

Citation preview

Page 1: basis.js - почему я не бросил разрабатывать свой фреймворк

basis.jsпочему я не бросил разрабатывать

свой фреймворк

Роман ДворновOstrovok.ru

Page 2: basis.js - почему я не бросил разрабатывать свой фреймворк

basis.js

JavaScript-фреймворк,

ориентированный на разработку

single page application

2

Page 3: basis.js - почему я не бросил разрабатывать свой фреймворк

basis.js – нестандартный фреймворк

3

Page 4: basis.js - почему я не бросил разрабатывать свой фреймворк

basis.js

4

Сложные вещи делать просто –

для простых есть возможность

Page 5: basis.js - почему я не бросил разрабатывать свой фреймворк

5

TodoMVC

Настоящиевеб-приложения

basis.js для настоящих приложений

Page 6: basis.js - почему я не бросил разрабатывать свой фреймворк

6

Это был тёплый летний вечер в древней Греции...

Page 7: basis.js - почему я не бросил разрабатывать свой фреймворк

Проблемы веб-приложений

7

• Много кода, представлений, данных• Одни и те же данные в разных представлениях• Более одного сценария изменения данных• Асинхронность• Динамические представления• Локализация• Адаптивность• ...

Page 8: basis.js - почему я не бросил разрабатывать свой фреймворк

basis.js

8

• Модульность, namespace

• Конструирование классов• Работу с данными• Сетевое сообщение• Построение интерфейса, компоненты• Шаблоны, адаптивность, локализация

• Инструменты, сборка

Page 9: basis.js - почему я не бросил разрабатывать свой фреймворк

9

Шаблоны

Page 10: basis.js - почему я не бросил разрабатывать свой фреймворк

Другие шаблонизаторы

10

element.innerHTML = 'string';

Page 11: basis.js - почему я не бросил разрабатывать свой фреймворк

Пример шаблона в basis.js

11

<b:style src="block.css"/>

<div{element} class="block block_{disabled}"> <h2>{title}</h2> <ul> <!--{childNodesHere}--> </ul></div>

Page 12: basis.js - почему я не бросил разрабатывать свой фреймворк

Шаблон → DOM

12

шаблон декларация эталон(DOM fragment)

функция(фабрика экземпляров)

DOM fragment

bindings

Экземпляршаблона

Page 13: basis.js - почему я не бросил разрабатывать свой фреймворк

Шаблон = «HTML» + CSS

13

<b:style src="block.css"/>

<div class="block block_{disabled}"> <h2>{title}</h2> <ul{childNodeElement}/></div>

.block{ ...}

.block_disabled{ ...}

Шаблон CSS

Page 14: basis.js - почему я не бросил разрабатывать свой фреймворк

Разделение логики и представления

14

ОбъектШаблон

(DOM fragment)

binding

action

Javascript Страница

Page 15: basis.js - почему я не бросил разрабатывать свой фреймворк

В шаблонах нет логики,нет ветвлений и циклов

15

Page 16: basis.js - почему я не бросил разрабатывать свой фреймворк

Замена DOM фрагмента<div class="sidebar"> ... <ul class="list"> <li>item 1</li> <li>item 2</li> </ul> ...</div>

16

<div class="list-wrapper"> <h2>Header</h2> <ul class="list"> </ul></div>

replaceNode

insertBefore

Page 17: basis.js - почему я не бросил разрабатывать свой фреймворк

Синхронизация

17

Шаблон basis.js

var view = new basis.ui.Node({ template: basis.resource('path/to/template.tmpl')});

basis server

файловая система

Page 18: basis.js - почему я не бросил разрабатывать свой фреймворк

Live update«киллер» фича

18

Page 19: basis.js - почему я не бросил разрабатывать свой фреймворк

Темы

19

Тема = HTML + CSS

Page 20: basis.js - почему я не бросил разрабатывать свой фреймворк

Адаптивность

20

Page 21: basis.js - почему я не бросил разрабатывать свой фреймворк

Шаблоны в basis.js

21

• Простое logic-less описание

• Live update

• Динамические представления• Быстрый процесс верстки• Темы

• Адаптивность

Page 22: basis.js - почему я не бросил разрабатывать свой фреймворк

Знакомо?

app-some-module-some-list__item_state_selected

22

Page 23: basis.js - почему я не бросил разрабатывать свой фреймворк

Во что превращается шаблон

23

<b:style src="item.css"/>

<li class="app-some-module-some-list__item app-some-module-some-list__item_state_{selected} app-some-module-some-list__item_state_{disabled}"> {title}</li>

Page 24: basis.js - почему я не бросил разрабатывать свой фреймворк

<b:isolate> – отменяет БЭМ

24

<b:style src="item.css"/><b:isolate/>

<li class="item {selected} {disabled}"> {title}</li>

Page 25: basis.js - почему я не бросил разрабатывать свой фреймворк

DOM25

Page 26: basis.js - почему я не бросил разрабатывать свой фреймворк

childNodes

Унификация API

26

методыappendChild, insertBefore, removeChild, replaceChild, ...

nextSiblingpreviousSibling

parentNode

firstChild lastChild

node

Page 27: basis.js - почему я не бросил разрабатывать свой фреймворк

Паттерны

27

• selection (выделение)

• disable/enable

• сортировка• группировка• привязка данных• ...

Page 28: basis.js - почему я не бросил разрабатывать свой фреймворк

28

childNodes: [ form { childNodes: [ field { ... }, field { ... } ] }, buttonPanel { childNodes: [ button { caption: 'Save' }, button { caption: 'Cancel' } ] }]

<form class="user-form"> <div class="form-field"> <label>Name:</label> <input type="text" /> </div> <div class="form-field"> <label>Email:</label> <input type="text" /> </div></form><div class="button-panel"> <button>Save</button> <button>Cancel</button></div>

JavaScript UI tree Browser DOM tree

Page 29: basis.js - почему я не бросил разрабатывать свой фреймворк

29

There is no spoon

Page 30: basis.js - почему я не бросил разрабатывать свой фреймворк

basis.js <3 DOM

30

Page 31: basis.js - почему я не бросил разрабатывать свой фреймворк

Данные31

Page 32: basis.js - почему я не бросил разрабатывать свой фреймворк

Классы backbone.js

32

Model Collection

Page 33: basis.js - почему я не бросил разрабатывать свой фреймворк

Классы данных basis.js

33

НаборыОбъектыСкаляры

Property Object

Entity

Dataset

Slot

Автоматические наборы

Агрегатные функции

DataObjectSet

Page 34: basis.js - почему я не бросил разрабатывать свой фреймворк

Особенности

34

• Все данные имеют состояние• При изменении данных создается дельта изменений

• Механизм делегирования

• Объекты взаимодействуют через изменение данных и состояния

• ...

Page 35: basis.js - почему я не бросил разрабатывать свой фреймворк

Наборы данных

35

Dataset(Collection)

Page 36: basis.js - почему я не бросил разрабатывать свой фреймворк

Наборы: пример

36

Page 37: basis.js - почему я не бросил разрабатывать свой фреймворк

37

contacts

Page 38: basis.js - почему я не бросил разрабатывать свой фреймворк

38

???

selectedcontacts

Page 39: basis.js - почему я не бросил разрабатывать свой фреймворк

39

new basis.data.dataset.Subtract({ minuend: contacts, subtrahend: selectedContacts});

Page 40: basis.js - почему я не бросил разрабатывать свой фреймворк

40

new basis.data.dataset.Subset({ source: new basis.data.dataset.Subtract({ minuend: contacts, subtrahend: selectedContacts }), rule: function(item){ return /ч/i.test(item.data.title); }});

Page 41: basis.js - почему я не бросил разрабатывать свой фреймворк

Модульность

41

Page 42: basis.js - почему я не бросил разрабатывать свой фреймворк

Основные модули

core event data DOM UI

entity dataset

net routerl10n

components

42

Page 43: basis.js - почему я не бросил разрабатывать свой фреймворк

Ресурсы

43

basis.require('basis.ui');

module.exports = new basis.ui.Node({ template: resource('template/view.tmpl'), binding: { editor: resource('editor.js').fetch(), list: resource('list.js').fetch() }});

Page 44: basis.js - почему я не бросил разрабатывать свой фреймворк

Почему не require.js?

44

Page 45: basis.js - почему я не бросил разрабатывать свой фреймворк

Почему не require.js?

44

Относительные пути

Page 46: basis.js - почему я не бросил разрабатывать свой фреймворк

Режимы

45

• Много файлов• Ленивая подгрузка• Оптимизируем загрузку с помощью basis server

Dev Production

• Один (обычно) js файл, в котором весь код, шаблоны и словари, один CSS файл на тему

• Различные оптимизации

Page 47: basis.js - почему я не бросил разрабатывать свой фреймворк

Режимы

46

<b:style src="block.css"/><div{element} class="block block_{selected}"> <h2>{title}</h2> <ul> <!--{childNodesHere}--> </ul></div>

[[1,1,["element"],"div",[4,[["block_","selected"]],0,"block"],[1,0,0,"h2",[3,1,["title"]]],[1,0,0,"ul",[8,1,["childNodesHere"]]]]]

Dev Production

Page 48: basis.js - почему я не бросил разрабатывать свой фреймворк

Производительность

47

Page 49: basis.js - почему я не бросил разрабатывать свой фреймворк

История одного view

48

Page 50: basis.js - почему я не бросил разрабатывать свой фреймворк

Время

49

1900 msknockout.js

Page 51: basis.js - почему я не бросил разрабатывать свой фреймворк

Время

49

1900 ms

23 ms

knockout.js

basis.js

Page 52: basis.js - почему я не бросил разрабатывать свой фреймворк

Время

49

1900 ms

23 ms

Разница более чем в 80 раз!

knockout.js

basis.js

Page 53: basis.js - почему я не бросил разрабатывать свой фреймворк

Всё дело в DOM50

Page 54: basis.js - почему я не бросил разрабатывать свой фреймворк

Структуры данных

51

Page 55: basis.js - почему я не бросил разрабатывать свой фреймворк

Другие фреймворки

52

• backbone.js – постоянно копирует поля, отдельное событие для каждого изменного поля

• knockout.js – создает слишком много массивов, замыканий и других структур

• AngularJS – dirty check (глубокое копирование и сравнение объектов)

Page 56: basis.js - почему я не бросил разрабатывать свой фреймворк

Простые модели

53

backbone.js knockout.js basis.data

10 000 моделей c 5 полями

1 000 моделей с 50 полями

86 ms 160 ms 1 ms

3.3 MB 10.9 MB 0.3 MB

139 ms 220 ms 1 ms

1.3 MB 13.5 MB 0.1 MB

Время

Память

Время

Память

Page 57: basis.js - почему я не бросил разрабатывать свой фреймворк

Модели посложнее

54

backbone.js basis.entityсоздание 10 000 моделей

5 типизированных полей, индекс, коллекция

обновление

189 ms 58 ms

3.1 MB 1.1 MB

235 ms 15 ms

+0.3 MB +0 MB

Время

Память

Время

Память

Page 58: basis.js - почему я не бросил разрабатывать свой фреймворк

basis.js

55

• Простые структуры• Дельта изменений• Агрегация событий• Данные не упорядочены• Избегаем bind, замыканий

• ...

Page 59: basis.js - почему я не бросил разрабатывать свой фреймворк

Инструменты

56

Page 60: basis.js - почему я не бросил разрабатывать свой фреймворк

basisjs-tools

57

• create – кодогенерация

• server – dev-сервер

• build – сборщик

Page 61: basis.js - почему я не бросил разрабатывать свой фреймворк

basis build

58

Page 62: basis.js - почему я не бросил разрабатывать свой фреймворк

basis build

59

Page 63: basis.js - почему я не бросил разрабатывать свой фреймворк

Google Chrome plugin

60

Page 64: basis.js - почему я не бросил разрабатывать свой фреймворк

Google Chrome plugin

60

Page 65: basis.js - почему я не бросил разрабатывать свой фреймворк

Google Chrome plugin

60

Page 66: basis.js - почему я не бросил разрабатывать свой фреймворк

Google Chrome plugin

60

Page 67: basis.js - почему я не бросил разрабатывать свой фреймворк

61

НЕЛЬЗЯ ТАК ПРОСТО ВЗЯТЬ

И РАССКАЗАТЬ ПРО BASIS.JSЗА 30 МИНУТ

Page 68: basis.js - почему я не бросил разрабатывать свой фреймворк

Сделано на basis.js

62

Page 69: basis.js - почему я не бросил разрабатывать свой фреймворк

Сделано на basis.js

62

Page 70: basis.js - почему я не бросил разрабатывать свой фреймворк

Сделано на basis.js

62

Page 71: basis.js - почему я не бросил разрабатывать свой фреймворк

Сделано на basis.js

62

Page 72: basis.js - почему я не бросил разрабатывать свой фреймворк

Сделано на basis.js

62

Page 73: basis.js - почему я не бросил разрабатывать свой фреймворк

Сделано на basis.js

62

Page 74: basis.js - почему я не бросил разрабатывать свой фреймворк

Ostrovok.ru

63

Page 78: basis.js - почему я не бросил разрабатывать свой фреймворк

Спасибо за внимание!Вопросы?

67

Роман Дворнов[email protected]

basisjs.comgithub.com/basisjs