More Related Content Similar to Владимир Варанкин "БЭМ и JavaScript: Зачем мы написали JS-фреймворк?" Similar to Владимир Варанкин "БЭМ и JavaScript: Зачем мы написали JS-фреймворк?" (20) Владимир Варанкин "БЭМ и JavaScript: Зачем мы написали JS-фреймворк?"1. БЭМ
и
JavaScript:
Зачем
мы
написали
js-‐фреймворк?
Владимир
Варанкин
Разработчик
интерфейсов
Я.Субботник,
Москва,
8
сентября
2012
года
2. Фреймворк
(англ.
framework,
Каркас)
—
структура
программной
системы;
программное
обеспечение,
облегчающее
разработку
и
объединение
разных
компонентов
большого
программного
проекта
2
8. Решаемые
задачи
• Нормализация
API
браузера
• Готовые
наборы
виджетов
• Rich
UI
интерфейсы
8
9. Решаемые
задачи
• Нормализация
API
браузера
• Готовые
наборы
виджетов
• Rich
UI
интерфейсы
• Библиотеки
написания
сложных
веб-‐приложений
9
15. БЭМ
— блоки
— элементы
— модификаторы
— уровни
переопределения
15
19. i-‐bem.js
— блок,
помогающий
делать
другие
блоки
— реализация
блока
i-‐bem
в
технологии
JavaScript
19
20. i-‐bem.js
— блок,
помогающий
делать
другие
блоки
— реализация
блока
i-‐bem
в
технологии
JavaScript
— jQuery
для
нормализации
API
браузера
20
31. <div !
class="myblock i-bem"!
onclick="return {!
myblock: { params: {} }}">!
!
<span class="myblock__item"></span>!
</div>!
!
!
31
32. <div !
class="myblock i-bem"!
onclick="return {!
myblock: { params: {} }}">!
!
<span class="myblock__item"></span>!
</div>!
!
!
32
35. BEM.DOM.decl('myblock', {!
!
method : function() {!
!
// экземпляр5
this!
!
// ссылка на класс!
this.__self!
!
// статический метод класса!
this.__self.staticMethod()!
!
// super-call!
this.__base()!
!
}!
!
})! 35
36. BEM.DOM.decl('myblock', {!
!
method : function() {!
!
// экземпляр5
this!
!
// ссылка на класс!
this.__self!
!
// статический метод класса!
this.__self.staticMethod()!
!
// super-call!
this.__base()!
!
}!
!
})! 36
37. BEM.DOM.decl('myblock', {!
!
method : function() {!
!
// экземпляр5
this!
!
// ссылка на класс!
this.__self!
!
// статический метод класса!
this.__self.staticMethod()!
!
// super-call!
this.__base()!
!
}!
!
})! 37
38. BEM.DOM.decl('myblock', { /* ... */ }, {!
!
staticMethod : function() {!
!
// класс !
this !
!
// super-call!
this.__base()!
!
}!
!
})!
38
40. // поиск внутри контекста5
this.findBlockInside([elem], block)!
!
// поиск снаружи контекста5
this.findBlockOutside([elem], block)!
!
// поиск на BEM-узле текущего блока5
this.findBlockOn([elem], block)!
!
40
41. // поиск внутри контекста5
this.findBlocksInside([elem], block)!
!
// поиск снаружи контекста5
this.findBlocksOutside([elem], block)!
!
// поиск на BEM-узле текущего блока5
this.findBlocksOn([elem], block)!
!
41
45. // значение модификатора блока5
this.getMod(modName)!
!
// значение модификатора элемента5
this.getMod(elem, modName)!
!
!
45
46. // проверка модификатора5
this.hasMod([elem], modName, modVal)!
!
// установка модификатора 5
this.setMod([elem], modName, modVal)!
!
// удаление модификатора5
this.delMod([elem], modName)!
!
// переключение значений модификатора5
this.toggleMod([elem], modName, !
modVal1, modVal2, [condition])!
46
48. onSetMod : {!
!
'mod1' : {!
!
// установка модификатора mod1 в val15
'val1' : function(mod, val, oldVal) { !
!
}!
!
},!
!
// установка модификатора `mod2` в любое значение5
'mod2' : function(mod, val, oldVal) {!
!
}!
!
}!
! 48
49. onElemSetMod : {!
!
/* структура, аналогичная блоку */!
!
'elem' : {!
!
'mod1' : {!
!
// дополнительный параметр `elem` 5
'val1' : function(elem, mod, val, oldVal) {!
!
}!
!
...!
!
}!
49
51. // DOM-события5
this!
.bindTo([elem], event, fn)!
.unbindFrom([elem], event)!
!
!
// BEM-события5
this!
.on(event, [data], fn, [ctx])!
.un(event, [data], fn, [ctx])!
.trigger(event, [data])!
!
51
53. <div !
class="myblock myblock_js_inited i-bem"!
onclick="return {!
myblock: { params: {} }}">!
!
<span class="myblock__item"></span>!
</div>!
!
!
53
54. onSetMod : {!
!
'js' : {!
!
'inited' : function() { !
!
/* «конструктор блока» */!
!
}!
!
}!
!
}!
!
54
55. Не
рассказал
про
• блоки
без
DOM-‐представления
• ленивая
инициализация
блока
(live)
• работа
со
статическими
свойствами
• каналы
(Pub/Sub)
…и
много
еще
чего
интересного
55
59. За
картинки
спасибо:
1. hrp://dan7e87.deviantart.com/art/Iron-‐Man-‐Suit-‐Design-‐W-‐I-‐P-‐194579401
2. hrp://theheroicage.com/invincible-‐iron-‐man-‐armor-‐and-‐glory/
3. hrp://so…-‐h.deviantart.com/art/zombie-‐concept11-‐216439938
4. hrp://spagnolo.deviantart.com/art/Supers-‐Color-‐synthesis-‐2-‐189705274
5. hrp://ˆger1313.deviantart.com/art/Push-‐258184965
6. hrp://www.mymodernmet.com/profiles/blogs/11-‐cleverly-‐designed-‐w‹
7. hrp://prolificpen.deviantart.com/art/Speedpaint-‐Swords-‐317004863
8. hrp://agoners.wordpress.com/2008/12/04/the-‐curious-‐orange/
9. hrp://hmmgabby.deviantart.com/art/summer-‐2010-‐165667847