Components now! (in russian)

63

description

Interactive version azproduction.ru/talk-components-now/ru/

Transcript of Components now! (in russian)

Page 1: Components now! (in russian)
Page 2: Components now! (in russian)

ComponentsNow!

Михаил Давыдов

РИТ++, 14-15 Апреля 2014

Page 3: Components now! (in russian)

Библиотеки

Page 4: Components now! (in russian)

● jQuery — чинит DOM

● Underscore — добавляет API ECMAScript 5

● Backbone — приносит MV*

● Все они созданы для исправления Web

По историческим причинм хорошие инструменты - библиотеки.

The DOM is a Mess 2009

Библиотеки

04

Page 5: Components now! (in russian)

Библиотеки везде

Page 6: Components now! (in russian)

● Тяжелые

–jQuery 2.0.3 — 230K (не сжатый)

● Их сложно понять

–Цикломатическая сложность $.ajax — 43

● Слишком могущественные

–$.ajax, $.animate, _

Библиотеки большие

06

Page 7: Components now! (in russian)

● Сложно использовать только маленькую часть

–$.Deferred, $.ajax

–_.template

● Приходится делить вручную

● Их модульность мало помогает

Их части тесно связаны

07

Page 8: Components now! (in russian)

● Все хотят jQuery

● Библиотеки зависят от библиотек

–Backbone+jQuery+Underscore

● Ручное управление зависимостями

–Bower и Npm — спасители!

Управление зависимостями

08

Page 9: Components now! (in russian)

Веб починили*

Page 10: Components now! (in russian)
Page 11: Components now! (in russian)

● querySelector

● CSS3 Selectors*

● Web Storage (localStorage)

● Cross-Origin Resource Sharing*

* полностью с полифилами

Can I Use

Важные DOM APIs

11

Page 12: Components now! (in russian)

ECMAScript 5

Page 13: Components now! (in russian)

● CSS3 Selectors (медленный, но работает)

● Cross-Origin Resource Sharing

● HTML5 Elements

● ECMAScript 5

HTML5 Please polyfills

Полифилы чинят остальное

13

Page 14: Components now! (in russian)
Page 15: Components now! (in russian)

Mobile

Page 16: Components now! (in russian)

Мобильный рынок растет

Page 17: Components now! (in russian)

Почему мы все ещеиспользуембиблиотеки?

Page 18: Components now! (in russian)

Компоненты

Page 19: Components now! (in russian)

Простые

Page 20: Components now! (in russian)

● Легкие

–dom — 28K, 3K self (не сжатый)

● Единственная ответственность & KISS-принцип

● Очень легко понять

–Поддерживать

–Писать тесты

Компоненты простые

20

Page 21: Components now! (in russian)

Независимые

Page 22: Components now! (in russian)

● Содержат все зависимости

–Большая часть внешние

● Легко использовать повторно

– bower i name

– npm i name

● Легко использовать только часть

Компоненты независимы

22

Page 23: Components now! (in russian)

Изолированные

Page 24: Components now! (in russian)

● Не конфликтуют с другими

–Изоляция CSS

–Гибкое представление

–Нет утечек глобалов

● Имеют ограниченный доступ к другим

– require()

Компоненты изолированы

24

Page 25: Components now! (in russian)
Page 26: Components now! (in russian)

● Идея произвольного HTML элемента

● API/Framework

–Shadow DOM (Инкапсуляция)

–HTML Imports & Templates

–Template Binding

Web Components: A Tectonic Shift for Web Development

WebComponents

26

Page 27: Components now! (in russian)

HTML Templates

Shadow DOM

Custom Elements

HTML Imports

Возможно починить в других барузерах, используя Polymer.

WebComponents в 2014 году

27

Page 28: Components now! (in russian)

WebComponents API Альтернатива

Custom Elements Компонентные движки

Shadow DOM BEM Методология

HTML Templates Шаблонные движки

HTML Imports Инструменты сборки

Scoped CSS BEM или OOCSS

Template Binding Data binding

Альтернативы этим API

28

Page 29: Components now! (in russian)

● X-Tag

● jQuery UI Widgets

● Dojo Widgets

● React

● bem-tools

● basis.js

Компонентные движки

29

Page 30: Components now! (in russian)
Page 31: Components now! (in russian)

● Изоляция CSS

● Блок — Custom Element

● Элемент — Shadow DOM

● Модификатор — Нет аналога

● i-bem — Логика блока

БЕМ и WebComponents

31

Page 32: Components now! (in russian)

.tab-panel — Блок

.tab-panel__tab — Элемент

.tab-panel__tab_state_active

Page 33: Components now! (in russian)

Давайте напишемКомпонент!

Page 34: Components now! (in russian)
Page 35: Components now! (in russian)

● Компонент Простой

–KISS

● Компонент Независимый

–Все на борту

● Компонент Изолированный

–HTML, CSS, JS

Помним, что

35

Page 36: Components now! (in russian)

Package file

Page 37: Components now! (in russian)

// bower.json

{

"name": "my-share",

"version": "1.0.0",

"main": ["my-share.js"]

}

Bower и формат bower.json

Package file это контракт01.

02.

03.

04.

05.

06.

37

Page 38: Components now! (in russian)

HTML

Page 39: Components now! (in russian)

<!-- my-share.html -->

<a href="{{ href }}" class="my-share">

<img src="{{ icon }}" class="my-share__icon"/>

<span class="my-share__label">{{ label }}</span>

</a>

Приватный HTML01.

02.

03.

04.

05.

39

Page 40: Components now! (in russian)

Интерфейс

Page 41: Components now! (in russian)

<a class="my-share"

data-href="{{ href }}"

data-icon="{{ icon }}"

>{{ label }}</a>

Интерфейс похож на Custom Element из WebComponents.

Интерфейс компонента01.

02.

03.

04.

41

Page 42: Components now! (in russian)

<my-share

href="{{ href }}"

icon="{{ icon }}"

>{{ label }}</my-share>

WebComponents для сравнения01.

02.

03.

04.

42

Page 43: Components now! (in russian)

.my-share {}

.my-share__icon {

vertical-align: middle;

height: 16px;

}

.my-share__label {

padding-left: 5px;

}

CSS Компонента01.

02.

03.

04.

05.

06.

07.

08.

43

Page 44: Components now! (in russian)

my-share {}

.icon {

vertical-align: middle;

height: 16px;

}

.label {

padding-left: 5px;

}

CSS WebComponent01.

02.

03.

04.

05.

06.

07.

08.

44

Page 45: Components now! (in russian)

● WebComponent — DOM API

– <style scoped>

● BEM

–Избегание каскада в CSS

–Соглашения именования .block__element

CSS изолирован

45

Page 46: Components now! (in russian)

Зависимости

Page 47: Components now! (in russian)

// bower.json

"dependencies": {

"tpl": "azproduction/lodash-template",

"domify": "component/domify",

"decl": "azproduction/decl"

}

Декларируем все зависимости.

Внешние зависимости01.

02.

03.

04.

05.

06.

47

Page 48: Components now! (in russian)

// my-share.js

var tpl = require('tpl'),

decl = require('decl'),

domify = require('domify');

var html = require('templates/my-share'),

template = tpl(html);

Связи модуля с другими01.

02.

03.

04.

05.

06.

07.

48

Page 49: Components now! (in russian)

function MyShare(el) {

this.options = this.collectOptions(el);

this.el = this.render();

this.delegateEvents();

this.replaceElement(el);

}

decl('.my-share', MyShare);

module.exports = MyShare;

Базовая логика компонента01.

02.

03.

04.

05.

06.

07.

08.

49

Page 50: Components now! (in russian)

● CommonJS/Modules

–Нет утечек глобалов

–Просит зависимости, а не берет их

–Поставляет ресурсы

● Так же можно использовать AMD

JavaScript модуля изолирован

50

Page 51: Components now! (in russian)

Сборка

Page 52: Components now! (in russian)

● Получение всех зависимостей

● Компиляция

–стили, скрипты, шаблоны

● Упаковка скриптов и шаблонов

● Конкатинация стилей

Сборка компонента

52

Page 53: Components now! (in russian)

● bem-tools

● Component

● Browserify

● LMD

Инструменты сборкикомпонентов

53

Page 54: Components now! (in russian)

<a class="my-share" ...>Tweet</a>

<link rel="stylesheet" href="my-share.css"/>

<script src="my-share.js"></script>

Компонент легко использовать01.

02.

03.

54

Page 55: Components now! (in russian)

<my-share ...>Tweet</my-share>

<link rel="import" href="my-share.html"/>

WebComponent01.

02.

55

Page 56: Components now! (in russian)

Живой пример

56

Page 57: Components now! (in russian)
Page 58: Components now! (in russian)
Page 59: Components now! (in russian)

● Web уже починили, Mobile растет

● Библиотеки слишком сложны

● WebComponents == API

● Пишите компоненты. Сегодня!

Заключение

59

Page 61: Components now! (in russian)

● Живой пример my-share

● You might not need jQuery

● BEM Методология

● Web Components

● Polymer Project

Полезные ресусы

61

Page 62: Components now! (in russian)

clck.ru/97Zm8

Page 63: Components now! (in russian)

● minecraft.gamepedia.com/Blocks

● fr.fotopedia.com/wiki/Bibliothèque#!/items/flickr-6899137527

● www.planetminecraft.com/project/minecraft-site/

● investments.academic.ru/1513/Форвардный_контракт

● frozen-lama.deviantart.com/art/Minecraft-Compound-Door-209872466

● www.postandcourier.com/article/20120620/pc1002/120629985

● isintu.com/features/responsive-design/

● nicolaijuhler.wordpress.com/

● r3c0nic.deviantart.com/art/minecraft-Blueprint-293455933

● ru-wallp.com/view/1542/

Источники изображений

63