codefest 2014. Макишвили В., Дулин М. — bevis & bt

60

Post on 20-Oct-2014

570 views

Category:

Internet


4 download

DESCRIPTION

 

TRANSCRIPT

Page 1: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt
Page 2: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

BEViS& bt

Page 3: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Smarty, Django и т.п.

контроллер шаблоныпредставления

HTML

< / >

HTTP Server

3

Page 4: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

BEViS

index.page.js

index.bt.js

HTML

< / >

HTTP Server

4

Page 5: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

BEViS controllerpages.declare('index', function () {

return [

{ block: 'header' },

{ block: 'authorization' }

];

});

01.

02.

03.

04.

05.

06.

5

Page 6: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt
Page 7: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

И.И.Шишкин, К.А.Савицкий«Утро в сосновом бору»

1889

Page 8: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt
Page 9: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Простой JSON[

{ block: 'header' },

{ block: 'authorization' }

]

01.

02.

03.

04.

Сложный HTML<div class="header">

<a class="header__logo" href="/">

<img src="logo.png">

</a>

<h1 class="header__title">Демо-страница</h1>

<h2 class="header__slogan">Слоган</h2>

<a class="header__rss" href="/?rss">

<img src="rss.png">

</a>

</div>

<form class="authorization" action="/?task=login">

<label class="authorization__label">Логин</label>

<input class="authorization__login" value="">

<label class="authorization__label">Пароль</label>

<input class="authorization__password"

value="" type="password">

<button class="authorization__submit">

Войти

</button>

</form>

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

9

Page 10: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Одного имени

достаточно

Page 11: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Имя блока{

друг: 'Марат'

}

01.

02.

03.

11

Page 12: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Необязательные параметры{

суп: 'солянка',

сметанаНужна: 'да'

}

01.

02.

03.

04.

12

Page 13: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Создавать страницы - просто!{

block: 'header',

showSearch: true

}

01.

02.

03.

04.

13

Page 14: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Блок - это1. HTML-cтруктура

2. CSS-представление

3. JS-поведение

14

Page 15: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

HTML

Page 16: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Императивные шаблоны<p>Уважаемый {{ person }}</p>

<p>Ваш заказ от {{ date:"F j, Y" }} принят на обработку.</p>

<p>Пожалуйста, убедитесь, что всё выбрано верно:</p>

<ul>

{% for item in item_list %}

<li>{{ item }}</li>

{% endfor %}

</ul>

{% if ordered_warranty %}

<p>Гарантия - 12 месяцев.</p>

{% else %}

<p>Со всеми неполадками обращайтесь в наш сервиcный центр.</p>

{% endif %}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

13.

14.

15.

16

Page 17: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Smarty

контроллер императивныешаблоны

HTML

< / >

HTTP Server

17

Page 18: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Smarty

index.php index.tpl.php

HTML

< / >

HTTP Server

18

Page 19: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Декларативные

шаблоны

Page 20: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Что это?h1 {

color: red;

}

01.

02.

03.

20

Page 21: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Исходный JSONpages.declare('index', function () {

return {

block: 'header'

}

});

Финальный HTML<div class="header">

</div>

01.

02.

03.

04.

05.

01.

02.

21

Page 22: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Абстрактный декларативный шаблонheader {

tag: div;

}

01.

02.

03.

22

Page 23: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Абстрактный декларативный шаблонheader {

tag: div;

}

Реальный декларативный шаблонbt.match('header', function (ctx) {

ctx.setTag('div');

});

01.

02.

03.

01.

02.

03.

23

Page 24: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Делаем шаблон умнееbt.match('header', function (ctx) {

ctx.setTag('div');

ctx.setContent({ // Генерим внутри шапки новый JSON

elem: 'title', // создаём элемент title в содержимом

titleText: 'CodeFest 2014' // параметром передаём в него текст

});

});

01.

02.

03.

04.

05.

06.

07.

24

Page 25: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Делаем шаблон умнееbt.match('header', function (ctx) {

ctx.setTag('div');

ctx.setContent({

elem: 'title',

titleText: 'CodeFest 2014'

});

});

bt.match('header__title', function (ctx) {

ctx.setTag('h1');

ctx.setContent(

ctx.getParam('titleText')

);

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

25

Page 26: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Результат<div class="header">

<h1 class="header__title">CodeFest 2014</h1>

</div>

01.

02.

03.

26

Page 27: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Простой JSON{

block: "y-header",

view: "islet-search",

showSearch: true,

showSuggest: true

}

01.

02.

03.

04.

05.

06.

07.

27

Page 28: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Простой JSON{

block: "y-header",

view: "islet-search",

showSearch: true,

showSuggest: true

}

01.

02.

03.

04.

05.

06.

07.

Сложный HTML<header class="y-header_islet-search _init _live-events" data-block="y-header" data-options="{"mixins":[{"name":"location-form"}]}">

<div class="y-header_islet-search__wrapper">

<a class="y-header_islet-search__logo _lang_ru" href="http://www.yandex.ru">

<img class="y-header_islet-search__logo-img" alt="Яндекс" src="//yandex.st/lego/_/X31pO5JJJKEifJ7sfvuf3mGeD_8.png">

</a>

<div class="y-header_islet-search__info">

<span class="y-header_islet-search__board-call">

<a class="y-button_islet-board _init" data-block="y-button" role="button" href="http://www.yandex.ru/all">

<span class="y-button_islet-board__icon">

<div class="y-header_islet__board-call-icon"></div>

</span>

</a>

</span>

</div>

<div class="y-header_islet-search__arrow">

<form class="y-header_islet-search__form _live-events" action="/">

<div class="y-header_islet-search__button">

<button class="y-button_islet _init" data-block="y-button" tabindex="2" type="submit"><span class="y-button_islet__text">Найти</span></button>

</div>

<div class="y-header_islet-search__input">

<div class="y-suggest_islet _init" data-block="y-suggest"

data-options="{"options":{"suggestDropOptions":{"view":"islet-header","suggestDropItemView":"islet-header"},"dataProviderOptions":{"queryParams":{"lang":"ru-RU","search_type":"all","fullpath":1,"v":5},"posQueryParamName":"pos","textQueryParamName":"part","disableGrouping":true}},"mixins":[{"name":"header-suggest-configurer"}]}">

<span class="y-input_islet-label-icons _init" data-block="y-input"><span class="y-input_islet-label-icons__label"><a class="y-input_islet-label-icons__label-link" href="/">Карты</a></span><span

class="y-input_islet-label-icons__icons"><span class="y-input_islet-label-icons__close-small"></span></span><span class="y-input_islet-label-icons__context"><input

class="y-input_islet-label-icons__control" id="uniq0" name="text" value="" autocomplete="off"></span></span>

<div class="y-suggest-drop_islet-header" data-block="y-suggest-drop" data-options="{"options":{"wide":true}}"></div>

</div>

</div>

</form>

</div>

</div>

<div class="y-header_islet-search__board"></div>

</header>

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

25.

26.

27.

28.

29.

30.

31.

32.

33.

28

Page 29: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

{ block: 'y-header',

view: 'islet-search', showBoard: true, serviceName: 'Карты', searchQuery: 'Новосибирск'}

Карты НайтиНовосибирск

Page 30: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Чем декларативные шаблоны лучше?1. Даже в большом проекте остаются простыми

2. Гарантируют внешнее API блока

BEViS - это как Web Components, только работает уже сегодня ;)

30

Page 31: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

CSS

Page 32: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Мы так не делаем<div class="header authorization">

</div>

01.

02.

32

Page 33: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Г.Данелия, 1977В.Кикабидзе

«Мимино»

Page 34: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

View{

block: "header",

view: "search"

}

Финальный HTML<div class="header_search">

</div>

01.

02.

03.

04.

01.

02.

34

Page 35: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Кто-то пишет так<div class="button button_theme_normal button_shadow_yes">

нажми меня

</div>

01.

02.

03.

35

Page 36: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Бивис делает иначе<div class="button_normal-shadow">

нажми меня

</div>

01.

02.

03.

36

Page 37: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Простой JSON{

block: "button",

view: "normal-shadow"

}

Простой HTML<div class="button_normal-shadow">

нажми меня

</div>

01.

02.

03.

04.

01.

02.

03.

37

Page 38: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

CSS-

препроцессор

Page 39: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Публичные селекторы.button {

skin-common();

skin-theme-normal();

}

.button_normal-shadow {

skin-common();

skin-theme-normal();

skin-shadow();

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

39

Page 40: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Публичные селекторы.button {

skin-common();

skin-theme-normal();

}

.button_normal-shadow {

skin-common();

skin-theme-normal();

skin-shadow();

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

Приватные функцииskin-common() {

/* общие стили кнопки */

}

skin-theme-normal() {

/* цвета кнопки */

}

skin-shadow() {

/* тень под кнопкой */

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

40

Page 41: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Все конфликты под контролем.button {

skin-common();

skin-theme-normal();

/* а здесь разрулил все конфликты этих миксинов */

}

.button_normal-shadow {

skin-common();

skin-theme-normal();

skin-shadow();

/* а здесь разрулил все конфликты этих миксинов */

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

41

Page 42: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

JS

Page 43: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

В маленьких проектах$(document).ready(function() {

var form = $('#my-form');

form.submit(onSubmited);

function onSubmited() {

if ($('#my-form .button').hasClass('disabled')) {

return false;

}

}

});

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

43

Page 44: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

В маленьких проектах с модулямиmodules.define(

'form',

['jquery'],

function(provide, $) {

var form = $('#my-form');

form.submit(onSubmited);

function onSubmited() {

if ($('#my-form .button').hasClass('disabled')) {

return false;

}

}

provide(form);

}

);

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

13.

14.

15.

16.

44

Page 45: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Бивис = Модуль + YBlock-классmodules.define(

'form',

['y-button', 'y-block'],

function(provide, YButton, YBlock) {

var Form = inherit(YBlock, {

__constructor: function () {

this._submitButton = YButton.find(this);

this._bindTo(this.getDomNode(), 'submit', this._onSubmitted);

},

_onSubmitted: function (e) {

if (this._submitButton.isDisabled()) {

e.preventDefault();

} else {

this.emit('submit');

}

}

});

provide(Form);

}

);

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

45

Page 46: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Бивис = Модуль + YBlock-класс1. Код можно реиспользовать

2. Мы управляем абстракциями, а не DOM-объектами

46

Page 47: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Поведение отделено от отображения<div

class="header"

data-block="header">

</div>

01.

02.

03.

04.

47

Page 48: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Состояние блока<input class="login _unfilled" type="text"/>

/* обычное состояние */

.login {

...

}

/* тревожное состояние */

.login._unfilled {

border: 1px solid red;

}

01.

02.

01.

02.

03.

04.

05.

06.

07.

08.

09.

48

Page 49: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

BlockElementViewState

Page 50: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Файлы и сборка

Page 51: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Файлыblocks/

form/

form.styl

form.js

form.bt.js

header/

header.styl

header.js

header.bt.js

01.

02.

03.

04.

05.

06.

07.

08.

09.

51

Page 52: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

ENB-сборщик

http://github.com/enb-make/enb

Page 53: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

ENB-конфигуратор

http://enb-make.info/config/

Page 54: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

BEViS-документация

http://github.com/bevis-ui/docs

Page 55: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Быстрый стартgit clone [email protected]:bevis-ui/bevis-stub.git your-project

cd your-project

make

01.

02.

03.

55

Page 56: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Todo MVC

http://github.com/bevis-ui/bevis-todo

Page 57: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

Blog Engine

http://github.com/bevis-ui/bevis-blog

Page 58: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

BEViS

• Полноценный сайт на обычном JS

• Покрыт юнит-тестами на 100%

• Написан в понятном Сode Style

Это серьёзный инструмент с добрым лицом ;)

58

Page 59: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

(: Спасибо ;)

Page 60: CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt

BEViS & bt• Презентация — bevis-ui.github.io/bevis-and-bt-speech

• TODO MVC — github.com/bevis-ui/bevis-todo

• Blog Engine — github.com/bevis-ui/bevis-blog

• Документация — github.com/bevis-ui/docs

• bt — github.com/enb-make/bt

• ENB — github.com/enb-make/enb

• ENB-конфигуратор — enb-make.info/config

Марат Дулин• [email protected]

• twitter.com/mdevils

• github.com/mdevils

Вадим Макишвили• [email protected]

• makishvili.com

60