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

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

  • Upload
    basisjs

  • View
    977

  • Download
    1

Embed Size (px)

DESCRIPTION

Опенсорсный JavaScript-фреймворк с нестандартными подходами, ориентированный на разработку одностраничных приложений. Обновление шаблонов и стилей без перезагрузки страницы, развитые механизмы работы с данными, высокая производительность, инструменты разработчика и многое другое. Доклад с конференции WSD, Санкт-Петербург, 8 июня 2013 Видео: http://www.youtube.com/watch?v=cVbbkwkhNQg

Citation preview

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

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

фреймворк

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

FrontTalks, июль 2013

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

Немного о себе

• Работаю в Ostrovok.ru

• До этого руководил веб-разработкой в ПС Единый кошелек

• Автор и мейтейнер фреймворка basis.js, которому уже 7 лет

2

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

basis.js

фреймворк,

для разработки

одностраничных

приложений

3

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

4

TodoMVC

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

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

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

basis.js

5

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

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

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

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

6

Шаблоны

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

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

7

element.innerHTML = 'string';

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

Шаблон basis.js

8

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

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

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

Шаблон → DOM

9

Шаблон декларация

эталон(DOM fragment)

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

DOM fragment bindings

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

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

10

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

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

.block{ ...}

.block_disabled{ ...}

Шаблон CSS

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

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

11

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

(DOM fragment)

binding

action

Javascript Страница

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

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

12

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

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

13

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

replaceNode

insertBefore

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

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

14

Шаблон basis.js

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

basis server

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

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

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

15

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

Тема = HTML + CSS

16

// опеределение шаблона для темыbasis.template.theme('mobile').define({ 'some.view': resource('path/to/view.tmpl')});

// переключение темыif (window.innerWidth > 480) basis.template.setTheme('base');else basis.template.setTheme('mobile');

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

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

17

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

Шаблоны в basis.js

18

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

• Live update

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

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

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

Интерфейс19

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

childNodes

Унификация API

20

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

node nextSiblingpreviousSibling

parentNode

firstChild lastChild

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

Паттерны

21

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

• disable/enable

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

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

22

...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>

basis.js UI tree Browser DOM tree

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

23

There is no spoon

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

basis.js <3 DOM

24

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

Данные

25

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

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

26

Model Collection

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

Классы basis.js

27

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

Property Object

Entity

Dataset

Slot

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

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

DataObjectSet

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

Особенности

28

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

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

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

• ...

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

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

29

Dataset(Collection)

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

Виды наборов

• Merge – слияние множеств: объединение, разность и другие

• Subtract – вычитание

• Subset – получение подмножества

• Split – разбиение на подмножества 1:1

• Cloud – разбиение на подмножества 1:М

• Slice – срез подмножества

30

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

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

31

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

32

contacts

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

33

???

selectedcontacts

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

34

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

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

35

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 36: Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)

В итоге

36

• Описана некоторая логическая схема связи данных и компонент

• Код работающий с contacts и selectedContacts остался прежним

• О согласованности наборов и данных заботится фреймворк

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

Модульность

37

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

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

core event data DOM UI

entity dataset

net routerl10n

components

38

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

Ресурсы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() }});

39

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

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

40

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

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

40

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

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

Режимы

41

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

Dev Production

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

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

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

Режимы

42

<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 44: Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)

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

43

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

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

44

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

45

1900 msknockout.js

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

basis.js

45

1900 ms

23 ms

knockout.js

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

basis.js

45

1900 ms

23 ms

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

knockout.js

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

Все дело в DOM46

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

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

47

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

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

48

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

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

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

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

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

49

backbone.js knockout.js basis.data

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

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

136 ms 160 ms 2 ms

3.3 MB 10.9 MB 0.3 MB

86 ms 220 ms 1 ms

1.3 MB 13.5 MB 0.1 MB

Время

Память

Время

Память

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

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

50

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 54: Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)

Архив с тестами

goo.gl/nLPJf

51

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

basis.js

52

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

• ...

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

Инструменты

53

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

basisjs-tools

• Консольный инструмент для разработки

• Работает под управлением node.js

• Установка:npm install -g basisjs-tools

54

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

Команды basisjs-tools

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

• server – dev-сервер

• build – сборщик

55

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

Сборщик

56

• Не требует деклараций, списков файлов, карты зависимостей и т.п.

• Рекурсивно парсит и анализирует файлы, строя граф файлов приложения

• Использует AST для анализа

• Может применять различные оптимизации

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

basis build

57

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

Google Chrome plugin

58

(расширение для Developer Tools)

goo.gl/OYhFK

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

59

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

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

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

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

60

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

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

60

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

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

60

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

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

60

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

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

60

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

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

60

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

61

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

ostrohack

62

github.com/sharifulin/ostrohack

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

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

Вопросы?

66

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

basis.jsbasisjs.com

github.com/basisjs