В далекому 2016 році світ почув про вебкомпоненти, а одна ще тоді не дуже розумна команда, якій приходилось верстати дуже багато, вирішила спробувати те все в продукті, який би допоміг зменшити верстку. Про біди вебкомпонентів відомо всім, але про те, як вижити і дійти з альфи до стабільної версії знають не багато. Використання lit-element & lit-html і вирішення наболілих проблем, ось справня ціль моєї доповіді. Happy end обіцяю.
1 of 99
More Related Content
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
1. WE M EN & LI -EL T INWE M EN & LI -EL T IN
P O C OP O C O
1
2. Х О ЯХ О Я
Infopulse team/tech lead
BeerJS Zhytomyr
OdessaJS / Frontend://zt
Суддя DEV Challenge
Спікер
2
24. LI -H L. TE L TI NELI -H L. TE L TI NE
var div = document.createElement('div');
div.setAttribute('class', 'conference-is-hot');
10
25. LI -H L. TE L TI NELI -H L. TE L TI NE
var div = document.createElement('div');
div.setAttribute('class', 'conference-is-hot');
document.body.innerHTML = '<div class="conference-is-hot">Hello</div>';
10
26. LI -H L. TE L TI NELI -H L. TE L TI NE
var div = document.createElement('div');
div.setAttribute('class', 'conference-is-hot');
document.body.innerHTML = '<div class="conference-is-hot">Hello</div>';
<div ng-class="{conference-is-hot: hasHot}">{{sayHello}}</div>
10
27. LI -H L. TE L TI NELI -H L. TE L TI NE
var div = document.createElement('div');
div.setAttribute('class', 'conference-is-hot');
document.body.innerHTML = '<div class="conference-is-hot">Hello</div>';
<div ng-class="{conference-is-hot: hasHot}">{{sayHello}}</div>
<div classname="{hasHot ? 'conference-is-hot' : ''}">{this.sayHello}</div
10
28. LI -H L. TE L TI NELI -H L. TE L TI NE
var div = document.createElement('div');
div.setAttribute('class', 'conference-is-hot');
document.body.innerHTML = '<div class="conference-is-hot">Hello</div>';
<div ng-class="{conference-is-hot: hasHot}">{{sayHello}}</div>
<div classname="{hasHot ? 'conference-is-hot' : ''}">{this.sayHello}</div
const confTemplate = `
<div class="${hasHot ? 'conference-is-hot' : ''}">
${this.sayHello}
</div>
`;
10
29. LI -H LLI -H L
LIT = LITTLE
LIT = LIGHTWEIGHT
LIT = LITERALS
11
30. LI -H LLI -H L
Effecient. Native templates
Expressive. FP patterns
Extensible. Different templates, frameworks
12
32. AR .MA V RE E DI T EAR .MA V RE E DI T E
const employeeList = (employees) => html`
<ul>
${repeat(employees, (employee) => employee.id, (employee, index) => h
<li>${index}: ${employee.familyName}, ${employee.givenName}</li>
`)}
</ul>
`;
13
33. AR .MA V RE E DI T EAR .MA V RE E DI T E
const employeeList = (employees) => html`
<ul>
${repeat(employees, (employee) => employee.id, (employee, index) => h
<li>${index}: ${employee.familyName}, ${employee.givenName}</li>
`)}
</ul>
`;
html`
<ul>
${items.map((item) => html`<li>${item}</li>`)}
</ul>
`;
13
35. NO NNO N
import {html} from 'lit-html';
html`<slot>Sorry, no content available. I am just fallback content</slot>
14
36. NO NNO N
import {html} from 'lit-html';
html`<slot>Sorry, no content available. I am just fallback content</slot>
import {nothing, html} from 'lit-html';
html`
<shadow-element>${user.isAdmin
? html`<button>DELETE</button>`
: nothing
}</shadow-element>
`;
14
47. ВЕ М ЕНВЕ М ЕН
Нативні Вебкомпоненти
Elements Custom Elements
19
48. ВЕ М ЕНВЕ М ЕН
Нативні Вебкомпоненти
DOM Encapsulation Shadow DOM
Elements Custom Elements
19
49. ВЕ М ЕНВЕ М ЕН
Нативні Вебкомпоненти
Style Encapsulation Shadow DOM
Elements Custom Elements
DOM Encapsulation Shadow DOM
19
50. ВЕ М ЕНВЕ М ЕН
Нативні Вебкомпоненти
Pseudo-Elements CSS Shadow Parts
Elements Custom Elements
DOM Encapsulation Shadow DOM
Style Encapsulation Shadow DOM
19
51. ВЕ М ЕНВЕ М ЕН
Нативні Вебкомпоненти
ARIA Accessibility Object Model
Elements Custom Elements
DOM Encapsulation Shadow DOM
Style Encapsulation Shadow DOM
Pseudo-Elements CSS Shadow Parts
19
53. Justin Fagnani
Me :)
WE CO N S AR LO LE DO APWE CO N S AR LO LE DO AP
LI -EL T AR HI LE DO APLI -EL T AR HI LE DO AP
20
54. П О ІЛИ В С Е ФІКА ІЯХП О ІЛИ В С Е ФІКА ІЯХ
21
55. П О ІЛИ В С Е ФІКА ІЯХП О ІЛИ В С Е ФІКА ІЯХ
Створення DOM з шаблону
21
56. П О ІЛИ В С Е ФІКА ІЯХП О ІЛИ В С Е ФІКА ІЯХ
Ефективне оновлення DOM
Створення DOM з шаблону
21
57. П О ІЛИ В С Е ФІКА ІЯХП О ІЛИ В С Е ФІКА ІЯХ
Реактивність властивостей і данних
Створення DOM з шаблону
Ефективне оновлення DOM
21
58. П О ІЛИ В С Е ФІКА ІЯХП О ІЛИ В С Е ФІКА ІЯХ
Перевикористання та інкапсуляція стилів
Створення DOM з шаблону
Ефективне оновлення DOM
Реактивність властивостей і данних
21
59. П О ІЛИ В С Е ФІКА ІЯХП О ІЛИ В С Е ФІКА ІЯХ
Обов’язкові дії (створення Shadow Root)
Створення DOM з шаблону
Ефективне оновлення DOM
Реактивність властивостей і данних
Перевикористання та інкапсуляція стилів
21
60. П О ІЛИ В С Е ФІКА ІЯХП О ІЛИ В С Е ФІКА ІЯХ
...
Створення DOM з шаблону
Ефективне оновлення DOM
Реактивність властивостей і данних
Перевикористання та інкапсуляція стилів
Обов’язкові дії (створення Shadow Root)
21
70. В А Т ТІВ А Т ТІ
ТИПТИП
class HelloElement extends LitElement {
static get properties() {
'fontFamily': {
type: String,
},
};
}
26
71. В А Т ТІВ А Т ТІ
ІМ’ЯІМ’Я
class HelloElement extends LitElement {
static get properties() {
'fontFamily': {
type: String,
attributeName: 'font-family'
},
};
}
26
72. В А Т ТІВ А Т ТІ
РЕФЛЕКЦІЯРЕФЛЕКЦІЯ
class HelloElement extends LitElement {
static get properties() {
'fontFamily': {
type: String,
attributeName: 'font-family',
reflect: true
},
};
}
26
73. В А Т ТІВ А Т ТІ
ВЛАСНА УМОВАВЛАСНА УМОВА
class HelloElement extends LitElement {
static get properties() {
'fontFamily': {
type: String,
attributeName: 'font-family',
reflect: true,
hasChanged(value, oldValue) {
return value.type !== 'ttf'
}
},
};
}
26
74. В А Т ТІВ А Т ТІ
КОНВЕРТЕРКОНВЕРТЕР
class HelloElement extends LitElement {
static get properties() {
'fontFamily': {
type: String,
attributeName: 'font-family',
reflect: true,
hasChanged(value, oldValue) {
return value.type !== 'ttf'
},
converter: {
fromAttribute: (value, type) => { }
toAttribute: (value, type) => { }
}
},
};
}
26
75. ЖИ ЄВИЙ ЦИЖИ ЄВИЙ ЦИ
API постійно змінюється
@todo updateComplete
27
77. UP CO LUP CO L
// `async` makes the function return a Promise & lets you use `await`
async myFunc(data) {
// Set a property, triggering an update
this.myProp = data;
// Wait for the updateComplete promise to resolve
await this.updateComplete;
// ...do stuff...
return 'done';
}
29
78. ВИ С А Н З ДЕ ТО ТАВИ С А Н З ДЕ ТО ТА
TT
@customElement('hello-world')
class HelloElement extends LitElement {
@property() name;
render() {
return html`<div>Hello ${this.conference}</div>`;
}
}
30
79. MO / NO LEMO / NO LE
<script type="module" src=/slideshow/js-fest-2019autumn-webcomponents-litelement-in-production/193111150/"component.js"></script>
<script nomodule="" src="component-die-ie.js"></script>
31
80. ІН Е Р ІЯ КО Н ІВ ІІН Е Р ІЯ КО Н ІВ І
ПЕ КО Т Я У VU /REПЕ КО Т Я У VU /RE
[ТУТ МАВ БУДЕ КОД, АЛЕ ЦЕ НЕ ПОТРІБНО][ТУТ МАВ БУДЕ КОД, АЛЕ ЦЕ НЕ ПОТРІБНО]
32
81. РЕ Ь И ТА МАЙБУ ЄРЕ Ь И ТА МАЙБУ Є
В ПРОЕКТІВ ПРОЕКТІ
33
82. РЕ Ь И ТА МАЙБУ ЄРЕ Ь И ТА МАЙБУ Є
В ПРОЕКТІВ ПРОЕКТІ
Вебкомпоненти всюди
33
83. РЕ Ь И ТА МАЙБУ ЄРЕ Ь И ТА МАЙБУ Є
В ПРОЕКТІВ ПРОЕКТІ
Продано першим трьом замовникам
Вебкомпоненти всюди
33
84. РЕ Ь И ТА МАЙБУ ЄРЕ Ь И ТА МАЙБУ Є
В ПРОЕКТІВ ПРОЕКТІ
Більше ніхто не звільняється
Вебкомпоненти всюди
Продано першим трьом замовникам
33
85. РЕ Ь И ТА МАЙБУ ЄРЕ Ь И ТА МАЙБУ Є
LIT-ELEMENT & LIT-HTMLLIT-ELEMENT & LIT-HTML
34
86. РЕ Ь И ТА МАЙБУ ЄРЕ Ь И ТА МАЙБУ Є
LIT-ELEMENT & LIT-HTMLLIT-ELEMENT & LIT-HTML
Літ елемент буде зменшуватись до повного знищення
34
87. РЕ Ь И ТА МАЙБУ ЄРЕ Ь И ТА МАЙБУ Є
LIT-ELEMENT & LIT-HTMLLIT-ELEMENT & LIT-HTML
Літ хтмл буде інтегруватись в стандарт
Літ елемент буде зменшуватись до повного знищення
34
88. РЕ Ь И ТА МАЙБУ ЄРЕ Ь И ТА МАЙБУ Є
У ВЕБКОМПОНЕНТАХУ ВЕБКОМПОНЕНТАХ
35
89. РЕ Ь И ТА МАЙБУ ЄРЕ Ь И ТА МАЙБУ Є
У ВЕБКОМПОНЕНТАХУ ВЕБКОМПОНЕНТАХ
Вебкомпоненти всюди
35
90. РЕ Ь И ТА МАЙБУ ЄРЕ Ь И ТА МАЙБУ Є
У ВЕБКОМПОНЕНТАХУ ВЕБКОМПОНЕНТАХ
Стандартизація
Вебкомпоненти всюди
35
91. РЕ Ь И ТА МАЙБУ ЄРЕ Ь И ТА МАЙБУ Є
У ВЕБКОМПОНЕНТАХУ ВЕБКОМПОНЕНТАХ
Інтеграція з фреймворками
Вебкомпоненти всюди
Стандартизація
35
93. ПО Н ЯПО Н Я
lit-element.polymer-project.org
36
94. ПО Н ЯПО Н Я
lit-element.polymer-project.org
lit-html.polymer-project.org
36
95. ПО Н ЯПО Н Я
lit-element.polymer-project.org
lit-html.polymer-project.org
github.com/web-padawan/awesome-lit-html
36
96. ПО Н ЯПО Н Я
lit-element.polymer-project.org
lit-html.polymer-project.org
github.com/web-padawan/awesome-lit-html
vaadin.com/tutorials/lit-element/starting-a-lit-element-project
36
97. ПО Н ЯПО Н Я
lit-element.polymer-project.org
lit-html.polymer-project.org
github.com/web-padawan/awesome-lit-html
vaadin.com/tutorials/lit-element/starting-a-lit-element-project
www.webcomponents.org
36
98. ПО Н ЯПО Н Я
lit-element.polymer-project.org
lit-html.polymer-project.org
github.com/web-padawan/awesome-lit-html
vaadin.com/tutorials/lit-element/starting-a-lit-element-project
www.webcomponents.org
[DevFest Nantes 2019] Building a Complex Application with Web
Components and LitElement
36
99. ЯК МЕ З АЙТИЯК МЕ З АЙТИ
Twitter: sssrsav1
Telegram: @RomanSavitskyi
https://www.facebook.com/groups/beerJSZhytomyr
37