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


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

     JavaScript-фреймворк,
ориентированный на разработку
    single page application


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



                3
basis.js


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



             4
TodoMVC




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



basis.js для настоящих приложений
                5
Это был тёплый летний вечер в древней Греции...
                       6
Проблемы веб-приложений
• Много кода, представлений, данных
• Одни и те же данные в разных представлениях
• Более одного сценария изменения данных
• Асинхронность
• Динамические представления
• Локализация
• Адаптивность
• ...
                      7
basis.js
• Модульность, namespace
• Конструирование классов
• Работу с данными
• Сетевое сообщение
• Построение интерфейса, компоненты
• Шаблоны, адаптивность, локализация
• Инструменты, сборка
                  8
Шаблоны
          9
Другие шаблонизаторы


element.innerHTML = 'string';




              10
Пример шаблона в basis.js
<b:style src="block.css"/>


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


                      11
Шаблон → DOM
                                               Экземпляр
                                                шаблона

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



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




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

<b:style src="block.css"/>             .block
                                       {
<div class="block block_{disabled}">     ...
                                       }
  <h2>{title}</h2>
  <ul{childNodeElement}/>              .block_disabled
</div>                                 {
                                         ...
                                       }


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


                binding
                                  Шаблон
Объект
                               (DOM fragment)
                action




                          14
В шаблонах нет логики,
нет ветвлений и циклов
         15
Замена DOM фрагмента
<div class="sidebar">
  ...
  <ul class="list">
                                      replaceNode
    <li>item 1</li>
    <li>item 2</li>
  </ul>                               <div class="list-wrapper">
  ...                                   <h2>Header</h2>
</div>            insertBefore          <ul class="list">

                                        </ul>
                                      </div>

                                 16
Синхронизация
var view = new basis.ui.Node({
  template: basis.resource('path/to/template.tmpl')
});



      Шаблон            basis.js           basis server



                                            файловая
                                            система
                          17
Live update
«киллер» фича


      18
Темы


Тема = HTML + CSS



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




     20
Шаблоны в basis.js
• Простое logic-less описание
• Live update
• Динамические представления
• Быстрый процесс верстки
• Темы
• Адаптивность

               21
Знакомо?


app-some-module-some-list__item_state_selected




                      22
Во что превращается шаблон
<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>



                       23
<b:isolate> – отменяет БЭМ
<b:style src="item.css"/>
<b:isolate/>


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




                       24
DOM
25
Унификация API
                          parentNode


previousSibling              node                   nextSibling



           firstChild       childNodes         lastChild

   методы
   appendChild, insertBefore, removeChild, replaceChild, ...
                               26
Паттерны
• selection (выделение)
• disable/enable
• сортировка
• группировка
• привязка данных
• ...

            27
JavaScript UI tree              Browser DOM tree
childNodes: [                          <form class="user-form">
  form {                                 <div class="form-field">
     childNodes: [                         <label>Name:</label>
                                           <input type="text" />
       field { ... },
                                         </div>
       field { ... }
                                         <div class="form-field">
     ]
                                           <label>Email:</label>
  },                                       <input type="text" />
  buttonPanel {                          </div>
     childNodes: [                     </form>
       button { caption: 'Save' },     <div class="button-panel">
       button { caption: 'Cancel' }      <button>Save</button>
     ]                                   <button>Cancel</button>
  }                                    </div>
]
                                  28
There is no spoon
        29
basis.js <3 DOM


       30
Данные
31
Классы backbone.js


Model           Collection




          32
Классы данных basis.js
  Скаляры       Объекты      Наборы

  Property       Object      Dataset


DataObjectSet    Entity
                           Автоматические
                               наборы
                  Slot
  Агрегатные
   функции
                   33
Особенности
• Все данные имеют состояние
• При изменении данных создается дельта
   изменений
•  Механизм делегирования
• Объекты взаимодействуют через изменение
   данных и состояния
• ...
                        34
Наборы данных
    Dataset
    (Collection)




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



      36
contacts




37
selected
contacts



  ???

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




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




                              40
Модульность




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

core      event            data             DOM      UI




                  entity          dataset         components




  net                      l10n                    router




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


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




          44
Почему не require.js?
  Относительные пути




          44
Режимы
         Dev                         Production

• Много файлов               • Один (обычно) js файл, в
• Ленивая подгрузка           котором весь код,
                              шаблоны и словари, один
• Оптимизируем                CSS файл на тему
 загрузку с помощью
 basis server                • Различные оптимизации


                        45
Режимы
          Dev                                Production
<b:style src="block.css"/>         [[1,1,["element"],"div",[4,
<div{element} class="block         [["block_","selected"]],0,"block"],
                                   [1,0,0,"h2",[3,1,["title"]]],
block_{selected}">
                                   [1,0,0,"ul",[8,1,["childNodesHere"]]]]]
  <h2>{title}</h2>
  <ul>
    <!--{childNodesHere}-->
  </ul>
</div>




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




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




         48
Время

knockout.js        1900 ms




              49
Время

knockout.js        1900 ms
basis.js             23 ms


              49
Время

knockout.js        1900 ms
basis.js             23 ms

 Разница более чем в 80 раз!
              49
Всё дело в DOM
      50
Структуры данных




51
Другие фреймворки
•   backbone.js – постоянно копирует поля,
    отдельное событие для каждого
    изменного поля
•   knockout.js – создает слишком много
    массивов, замыканий и других структур
•   AngularJS – dirty check (глубокое
    копирование и сравнение объектов)


                     52
Простые модели
         backbone.js        knockout.js        basis.data
                   10 000 моделей c 5 полями
Время     86 ms                 160 ms           1 ms
Память    3.3 MB                10.9 MB         0.3 MB
                   1 000 моделей с 50 полями
Время     139 ms                220 ms           1 ms
Память    1.3 MB                13.5 MB         0.1 MB

                           53
Модели посложнее
         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

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

               55
Инструменты




     56
basisjs-tools

• create – кодогенерация
• server – dev-сервер
• build – сборщик


             57
basis build




     58
basis build



     59
Google Chrome plugin




         60
Google Chrome plugin




         60
Google Chrome plugin




         60
Google Chrome plugin




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




И РАССКАЗАТЬ ПРО BASIS.JS
      ЗА 30 МИНУТ
            61
Сделано на basis.js




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




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




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




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




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




         62
Ostrovok.ru


     63
basisjs.com
     64
basisjs.com/tour
       65
github.com/basisjs
        66
Спасибо за внимание!
                 Вопросы?

Роман Дворнов                      basisjs.com
rdvornov@gmail.com          github.com/basisjs
                     67

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