93
Егор Непомнящих

2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

  • Upload
    -

  • View
    125

  • Download
    2

Embed Size (px)

DESCRIPTION

Автор фреймворка jWidget рассказывает о причинах его появления и внутренней организации.

Citation preview

Page 1: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Егор Непомнящих

Page 2: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Очередной MV* фреймворк?

Зачем?

Page 3: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

TodoMVC.com

Page 4: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Так зачем?

● Когда я начал разработку своего фреймворка, об остальных ничего не было слышно

Page 5: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Так зачем?

● Когда я начал разработку своего фреймворка, об остальных ничего не было слышно

● А как оказалось в итоге, jWidget круче всех

Page 6: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Приложения на базе jWidget

Page 7: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Приложения на базе jWidgetwww.digmydata.com

Page 8: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Приложения на базе jWidgetМой entry для Ludum Dare

Page 9: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Приложения на базе jWidget

Page 10: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Отличительные черты jWidget

● ООП-подход

Page 11: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Отличительные черты jWidget

● ООП-подход● Гранулярность

Page 12: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Отличительные черты jWidget

● ООП-подход● Гранулярность● Предсказуемость

Page 13: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Отличительные черты jWidget

● ООП-подход● Гранулярность● Предсказуемость● Простота

Page 14: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Отличительные черты jWidget

● ООП-подход● Гранулярность● Предсказуемость● Простота● Скорость

Page 15: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Тест на скорость

http://plnkr.co/edit/VtZe40

Page 16: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Тест на скорость

Вот только часть решений не MV* (читеры)

Page 17: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Что такое MV*?

Page 18: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Что такое MV*?

Приложение

Page 19: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Приложение

Что такое MV*?

Сущность 1

Сущность 2

Сущность 3

Page 20: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

LibreOffice Impress

Что такое MV*?

Презентация

Слайд

Элемент слайда

Page 21: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

LibreOffice Impress

Что такое MV*?

Модель презентации

Модель слайда

Модель элемента слайда

Панель слайдов

Диалог свойств слайда

Данные Представление

Редактор слайда

Представление элемента

Просмотрщик слайдов

Page 22: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

LibreOffice Impress

Что такое MV*?

Модель презентации

Модель слайда

Модель элемента слайда

Панель слайдов

Редактор слайда

Представление элемента

Просмотрщик слайдов

Диалог свойств слайда

Данные Представление

Page 23: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

LibreOffice Impress

Что такое MV*?

Модель презентации

Модель слайда

Модель элемента слайда

Панель слайдов

Редактор слайда

Представление элемента

Просмотрщик слайдов

Диалог свойств слайда

Данные Представление

События

События

События

Page 24: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Когда стоит использовать клиентские MV*-фреймворки?

● Крупное приложение с большим количеством взаимосвязанных сущностей

● Есть сущности, имеющие большое количество представлений одновременно

● В команде достаточно матерых JavaScript-разработчиков

Page 25: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Когда не стоит использовать клиентские MV*-фреймворки?

● В команде мало хороших JavaScript-разработчиков

● Страница должна грамотно парситься поисковыми роботами и аналитическими системами

● Вам нужна хорошая скорость работы сайта (jWidget – исключение!)

Page 26: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Документация

Найдите ссылку в проекте на GitHub

https://github.com/enepomnyaschih/jwidget

Page 27: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Структура фреймворка

6 слоев

Page 28: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Структура фреймворка

1. Классы и объекты (JW.Class)

Page 29: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Классы и объекты

На базе популярной библиотекиJohn'а Resig'а “Simple JavaScript inheritance”.

http://ejohn.org/blog/simple-javascript-inheritance/

Page 30: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Классы и объекты

Система агрегации объектов.var Soldier = function() {

Soldier._super.call(this);

this.leftHand = this.own(new Hand("left"));

this.rightHand = this.own(new Hand("right"));

};

JW.extend(Soldier, JW.Class);

var soldier = new Soldier();

soldier.destroy();

// руки уничтожены тоже

Page 31: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Структура фреймворка

1. Классы и объекты (JW.Class)

2. События (JW.Event)

Page 32: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

События

Нет никаких Observable. Есть Event.this.titleChangeEvent = this.own(new JW.Event());

this.titleChangeEvent.trigger(

new JW.ValueEventParams(this, title));

this.own(obj.titleChangeEvent.bind(

this._onTitleChange, this))

Подписка.

Page 33: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Структура фреймворка

1. Классы и объекты (JW.Class)

2. События (JW.Event)

3. Свойства (JW.Property)

Page 34: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Свойства

Интерфейс проще некуда:● Метод get()● Метод set(value)● Событие changeEvent

Page 35: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Свойства

Автоматическое дублирование.

source target1 target2

var source = new JW.Property("apple");

var target1 = new JW.Property();

target1.bindTo(source);

var target2 = new JW.Property();

target2.bindTo(target1);

source.set("banana");

// target2.get() === "banana"

Page 36: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Свойства

Функтор формирует свойство по формуле.

target '{value} {unit}'JW.Functor

target == '1000 MW' value == 1000, unit == 'MW'

target == '1500 МВ' value == 1500, unit == 'МВ'

Page 37: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Свойства

Функтор формирует свойство по формуле.

target '{value} {unit}'

var target = new JW.Functor( [ value, unit ], function(value, unit) { return value + " " + unit; }, this).target;

JW.Functor

Page 38: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Свойства

Switcher переключает on/off.

Hash (#doc_id) view selected? JW.Functor JW.Switcher

http://myapp.com/#5077-MB

Page 39: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Свойства

Switcher переключает on/off.

Hash (#doc_id) view selected? JW.Functor JW.Switcher

this.own(new JW.Switcher([view], {

init: function(view) { view.selected.set(true); },

done: function(view) { view.selected.set(false); },

scope: this

}));

Page 40: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Свойства

Можно осуществлять Data binding.var el = $("#document");

this.own(new JW.UI.ClassUpdater(

el, "my-selected", selected));

this.own(new JW.UI.TextUpdater(el, name));

this.own(new JW.UI.ValueUpdater(el, name));

this.own(new JW.UI.ValueListener(el, name));

И двусторонний Data binding.

Page 41: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Свойства

Можно налету менять локализацию.

var printText = this.own(locale.getFunctor("print")).target;

this.own(new JW.UI.TextUpdater(el, printText));

Page 42: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Структура фреймворка

1. Классы и объекты (JW.Class)

2. События (JW.Event)

3. Свойства (JW.Property)

4. Коллекции (JW.AbstractCollection)

Page 43: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

Три коллекции:● Массив

(JW.AbstractArray)● Словарь

(JW.AbstractMap)● Множество

(JW.AbstractSet)

Page 44: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

Три коллекции:● Массив

(JW.AbstractArray)● Словарь

(JW.AbstractMap)● Множество

(JW.AbstractSet)

Две реализации:● JW.Array

JW.MapJW.Set

● JW.ObservableArrayJW.ObservableMapJW.ObservableSet

Page 45: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

И самое главное...

Page 46: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

И самое главное...

СИНХРОНИЗАТОРЫ

Page 47: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

Конвертер элементов (Mapper)

target[i] function(source[i])

var target = dataCollection.map(function(data) { return new View(this, data);}, this);

Page 48: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

Конвертер элементов (Mapper)

target[i] function(source[i])

var target = dataCollection.map(function(data) { return new View(this, data);}, this);

Page 49: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

Конвертер элементов (Mapper)

target[i] function(source[i])

var mapper = dataCollection.createMapper({ createItem: function(data) { return new View(this, data); }, destroyItem: JW.destroy, scope: this});var viewCollection = mapper.target;

Page 50: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

Конвертер элементов (Mapper)

target[i] function(source[i])

var mapper = dataCollection.createMapper({ createItem: function(data) { return new View(this, data); }, destroyItem: JW.destroy, scope: this});var viewCollection = mapper.target;

Page 51: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

Конвертер элементов (Mapper)

target[i] function(source[i])

var source = new JW.ObservableArray([5]);var target = source.createMapper({ createItem: function(item) { return 2 * item; }});console.log(target.get(0)); // 10

source.add(7);console.log(target.get(1)); // 14

Page 52: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

Другие синхронизаторы

1. Конвертер элементов (Mapper)

target[i] function(source[i])

2. Фильтровщик (Filterer)

target[ ] function(source[ ]) ? source[ ] :

Page 53: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

Другие синхронизаторы

1. Конвертер элементов (Mapper)

target[i] function(source[i])

2. Фильтровщик (Filterer)

target[ ] function(source[ ]) ? source[ ] :

3. Конвертер в множество (Lister)

JW.Set target[ ] source[ ]

Page 54: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

Другие синхронизаторы

4. Конвертер в массив (Orderer)

JW.Array target (в порядке доб.) source

Page 55: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

Другие синхронизаторы

4. Конвертер в массив (Orderer)

JW.Array target (в порядке доб.) source

5. Сортировщик (SorterComparing)

JW.Array target (sorted by f(x, y)) source

Page 56: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

Другие синхронизаторы

4. Конвертер в массив (Orderer)

JW.Array target (в порядке доб.) source

5. Сортировщик (SorterComparing)

JW.Array target (sorted by f(x, y)) source

6. Объединитель массивов (Merger)

target source1 … sourceN

Page 57: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

Другие синхронизаторы

7. Обратитель массива (Reverser)

target[i] source[length - i – 1]

Page 58: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

Другие синхронизаторы

7. Обратитель массива (Reverser)

target[i] source[length - i – 1]

8. Индексатор (Indexer)

target[function(source[ ])] source[ ]

Page 59: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Коллекции

Можно делать цепочки синхронизаторов.

JW.Set JW.Array

JW.Set source list

JW.Map index

Sorter

Filterer

Indexer

Page 60: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Структура фреймворка

1. Классы и объекты (JW.Class)

2. События (JW.Event)

3. Свойства (JW.Property)

4. Коллекции (JW.AbstractCollection)

True

Page 61: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Структура фреймворка

1. Классы и объекты (JW.Class)

2. События (JW.Event)

3. Свойства (JW.Property)

4. Коллекции (JW.AbstractCollection)

5. Компоненты (JW.UI.Component)

Page 62: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Структура фреймворка

1. Классы и объекты (JW.Class)

2. События (JW.Event)

3. Свойства (JW.Property)

4. Коллекции (JW.AbstractCollection)

5. Компоненты (JW.UI.Component) ReactJS

Page 63: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

И все-таки...

Page 64: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Компонентыvar Greeter = function() { Greeter._super.call(this); this.name = this.own(new JW.Property("wanderer"));};JW.extend(Greeter, JW.UI.Component, { renderNameField: function(el) { this.own(new JW.UI.ValueUpdater(el, this.name)); this.own(new JW.UI.ValueListener(el, this.name)); }, renderGreeting: function(el) { var text = this.own(new JW.Functor([this.name], function(name) { return "Hello, " + name + "!"; }, this)).target; // build greeting message this.own(new JW.UI.TextUpdater(el, text)); }});JW.UI.template(Greeter, { main: '<div class="greeter">' + '<p>Your name: <input jwid="name-field"></p>' + '<div jwid="greeting"></div>' + '</div>'});new Greeter().renderTo("body");

Page 65: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Компоненты<div jwclass="greeter"> <p>Your name: <input jwid="name-field"></p> <div jwid="greeting"></div></div>

<div class="greeter"> <p>Your name: <input class="greeter-name-field"></p> <div class="greeter-greeting"></div></div>

Page 66: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Компоненты

Шаблонный движок JW.UI ну

ОООООЧЕНЬ

Быстрый.

Быстрее даже,

чем чистый HTML.

Page 67: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Компоненты

Шаблонный движок JW.UI ну

ОООООЧЕНЬ

Быстрый.

Быстрее даже,

чем чистый HTML.

Page 68: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Компоненты

Как это возможно?● Каждый HTML-шаблон рендерится только

один раз● После этого каждый новый компонент

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

● Шаблон рендеритсянапрямую браузером, безвсякого препроцессинга

● Никаких селекторов

Page 69: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Компоненты

renderDocument: function(el) {

return this.own(new DocumentView(this.document));

}

<div jwclass="my-component">

<div jwid="document"></div>

</div>

DocumentView

Page 70: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Компоненты

renderDocument: function(el) {

return this.own(new JW.Mapper([ this.document ], {

createValue: function(document) {

return new DocumentView(this.document);

}

destroyValue: JW.destroy,

scope: this

})).target;

}

<div jwclass="my-component">

<div jwid="document"></div>

</div>

DocumentView

Page 71: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Компоненты

renderDocuments: function(el) {

return this.documents.$map(function(document) {

return this.own(new DocumentView(document));

}, this);

}

<div jwclass="my-component">

<div jwid="documents">

</div>

</div>

DocumentView

DocumentView

DocumentView

DocumentView

Page 72: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

КомпонентыrenderDocuments: function(el) {

return this.own(this.documents.createMapper({

createItem: function(document) {

return new DocumentView(document);

},

destroyItem: JW.destroy,

scope: this

})).target;

}

<div jwclass="my-component">

<div jwid="documents">

</div>

</div>

DocumentView

DocumentView

DocumentView

DocumentView

Page 73: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Компоненты

renderDocument: function(el) {

return false;

}

<div jwclass="my-component">

<div jwid="document"></div>

</div>

Page 74: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Компоненты

renderDocument: function(el) {

this.own(new JW.UI.TextUpdater(el, this.text));

}

<div jwclass="my-component">

<div jwid="document"></div>

</div>

Page 75: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Компоненты

JW.UI.Component vs ReactJS (TBD)

● Совместим с jQuery

● Можно создавать поверх существующего DOM

● Прозрачнее

● Дает полный контроль над компонентамии DOM

● Ниже порог входа(проще на старте)

● Код проще

● Большое сообщество разработчиков

Page 76: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Структура фреймворка

1. Классы и объекты (JW.Class)

2. События (JW.Event)

3. Свойства (JW.Property)

4. Коллекции (JW.AbstractCollection)

5. Компоненты (JW.UI.Component)

6. Система сборки (jWidget SDK)

Page 77: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Система сборки

Standalone проект

jWidget SDK

https://github.com/enepomnyaschih/jwsdk

Page 78: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Система сборки

Standalone проект

jWidget SDK

https://github.com/enepomnyaschih/jwsdk

Является прямой альтернативой GruntJS,

и посему планируется заменить

jWidget SDK плагином к GruntJS

Page 79: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

И все же...

Page 80: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Система сборки

1. Формируем пакеты

{

"requires": [

"thirdparty/jwquery.js|auto",

"thirdparty/jwlib.js|auto",

"thirdparty/jwui.js|auto"

],

"resources": [

"mt/mt.js",

"mt/data/data.js",

"mt/data/tweet.js",

...

]

}

Page 81: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Система сборки

2. Создаем страницы

{

"package": "mt",

"template": "base",

"title": "Mini-Twitter"

}

Page 82: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Система сборки

3. Собираем

илиjwsdk debug jwsdk-config

jwsdk release jwsdk-config

Page 83: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Система сборки

Супер-фича: конвертирование шаблонов в JS

{

"resources": [

"mt/app/app.js",

"mt/app/app.jw.html : mt.App",

...

]

}

<div jwclass="mt-app">

<div jwid="profile"></div>

<div jwid="tweets"></div>

</div>

JW.UI.template(mt.App,{main:'<div jwclass="mt-app"><div jwid="profile"></div><div jwid="tweets"></div></div>'});

Page 84: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Система сборки

Также поддерживаются другие форматы:● html● json● txt● less● sass● scss● styl● jsx (TBD)

Page 85: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Система сборки

Выполняются оптимизации:● Объединение и минимизация JS

Page 86: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Система сборки

Выполняются оптимизации:● Объединение и минимизация JS● Параметр timestamp для браузерного

кэширования

Page 87: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Система сборки

Выполняются оптимизации:● Объединение и минимизация JS● Параметр timestamp для браузерного

кэширования● Конвертирование малых изображений и

шрифтов в base64 Data URI

Page 88: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Система сборки

Выполняются оптимизации:● Объединение и минимизация JS● Параметр timestamp для браузерного

кэширования● Конвертирование малых изображений и

шрифтов в base64 Data URI● Поддержка динамической загрузки пакетов

по требованию

Page 89: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Совместимость jWidget с другими библиотеками и фреймворками

● Весь функционал размещен в отдельном пространстве имен JW

Page 90: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Совместимость jWidget с другими библиотеками и фреймворками

● Весь функционал размещен в отдельном пространстве имен JW

● UI-слой работает на базе jQuery

Page 91: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Совместимость jWidget с другими библиотеками и фреймворками

● Весь функционал размещен в отдельном пространстве имен JW

● UI-слой работает на базе jQuery● Разрабатываются адаптеры между моделью

jWidget и UI-слоями других фреймворков (например, ReactJS и ExtJS)

Page 92: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Ссылки

Twitter: @jwidgetproject

Почта: [email protected]

GitHub (там ссылка на документацию): https://github.com/enepomnyaschih/jwidget

Статья на хабрахабре (там еще ссылки): http://habrahabr.ru/post/219995/

Page 93: 2014-08-02 01 Егор Непомнящих. jWidget - очередной MV*-фреймворк

Вопросы?

FAQ● jWidget – почему так называется?

Потому что гладиолус● Много ли пользователей у jWidget?

Пока нет● Почему ООП-подход так важен?

Легко переносится на Dart и пр. платформы● Есть ли готовая библиотека визуальных

компонентов?Нет. Но легко совмещается с jQuery UI