⛩️ WarsawJS Workshop #7 — Web Components
- Google Chrome v53
Projekt 1: Mockup (Demo)
Prezentacja obrazka w na komputerze
Treść zadania nr. 1
- Zaprezentować obrazek z tekstem.
- Tekst musi być inny fontem
- Dodanie styli dla komponentu
- Stworzyć markup w
<template>
. - Zbudować custom element
- Stworzyć klasę dziedziczącą po
HTMLElement
- Podłączyć Shadow DOM-a do custom elementu
- Zapisać się na lifecycle hook
connectedCallback
- Pobrać zawartość szablonu
- Wyrenderować szablon do Shadow DOM-a
- widać obrazek, pomimo tego, że ma ustawionego atrybutu
src
nie jest wysyłany request po zasób
- widać obrazek, pomimo tego, że ma ustawionego atrybutu
- Pobrać adres do obrazka
- Wyrenderować obrazek
- Stworzyć klasę dziedziczącą po
- Dodać kolejny custom element (z innym obrazkiem)
- Rozwiązać problem braku szablonu za pomocą
cloneNode(true)
- Rozwiązać problem braku szablonu za pomocą
- Dodać możliwość ustawiania innego tekstu dla różnych elementów
- Rozwiązać problem z kodowaniem ustawiając odpowiedni meta tag.
- Zamknąć komponent w pojedynczy katalog
- Stworzyć główny plik
index.html
w aplikacji - Zaimportować komponent za pomocą HTML Imports
<link rel="import"/>
- Stworzyć główny plik
Projekt 2. GitHub Profile Card (Demo)
Prezentacja danych dowolnego użytkownika portalu GitHub
Treść zadania nr. 2
- Stworzenie markupu
- Ustawienie kodowania
- Ustawienie tytułu strony
- Stworzenie template-u w znaczniku
<template>
- Dołączenie pliku
main.js
- Wykorzystanie znacznika
github-profile-card-element
do prezentacji danych na temat dowolnego użytkownika GitHub-a.
- Ostylować komponent
- Avatar użytkownika
- Imię i nazwisko
- Bio
- Lista popularnych repozytoriów
- Zarejestrowanie komponentu
- Stworzenie klasy dziedziczącej po
HTMLElement
- Dołączenie Shadow DOM-a w konstruktorze
- W lifecycle hooku
connectedCallback
- Wyrenderować template
- Pobrać login z atrybutów
- Wysłać zapytanie po publiczne dane użytkownika, którego login został zdefiniowany w atrybucie
- Wyświetlić dane użytkownika: imię i nazwisko, avatar, bio, lokalizację
- Po wykonaniu pierwszego zapytania wykonać drugie, które pobierze listę wszystkich repozytoriów.
- UWAGA: ze względu na limit zapytań w GitHub API, zapisać sobie
odpowiedzi do katalog
mocks/
a następnie zamienić URLe na pliki statyczne - Posortować listę repozytoriów według liczby gwiazdek
- Zredukować listę repozytoriów do kilku, np. 5
- Wyrenderować repozytoria
- Stworzenie klasy dziedziczącej po
Projekt 3: Media Projector (Demo)
Prezentacja dowolnych media obiektów (np. obrazków) w stylu rotowalnym.
Treść zadania nr. 3
- Stworzenie markupu
- Dodanie 3 zdjęć jako dzieci nowo dodawanego komponentu.
- Ostylowanie komponentu
- Na środku prezentować pole na media obiekt
- Na środku nad polem prezentować guzik PLAY
- Zarejestrować akcję na kliknięcie w komponent
- Za pamięci od razu wyrejestrować handler na lifecycle hooku
disconnectedCallback
- Za pamięci od razu wyrejestrować handler na lifecycle hooku
- Stworzyć klasę
Slider
, która będzie emulowała rotowanie elementu- Wykorzystać
ES5 getter
- Wykorzystać
- Po kliknięciu w komponent zainicjować slider przekazując mu dane o
dzieciach wraz z definicją funkcji, która zostanie uruchomiona
każdorazowo gdy slider chce zaprezentować inną treść
- Stworzyć funkcję, która będzie wlewała do kontenera z ekranem żądany media obiekt
- Zmienić kursor myszy, po najechaniu na przycisk PLAY
- Nie pokazywać łapki kiedy prezentowane są media obiekty
Importowanie komponentów
Treść zadania nr. 4
- Przystosowanie komponentu do bycia importowanym
- Dwa dokumenty (
document.currentScript.ownerDocument
idocument
) - Przygotowanie pliku HTML, w którym będzie tylko definicja komponentu
- Dwa dokumenty (
- Importowanie przy pomocy HTML Import
- Dwa dokumenty (importowany i importujący)
- Dodanie
link[rel=import]
do pliku - Wstawienie komponentu na stronę
- Importowanie przy pomocy Fetch API
- Utworzenie funkcji
fetchComponent
- Parsowanie odpowiedzi przy pomocy
DOMParser
- Naprawianie zepsutych relatywnych URL-ów w skryptach i arkuszach stylów
- Dołączanie potrzebnych elementów do strony
- Utworzenie funkcji
-
Error nr. 1
Uncaught DOMException: Failed to execute 'define' on 'CustomElementRegistry': "mockup" is not a valid custom element name
⛔ Nie wolno:
customElement.define('mockup', MockupElement);
👍 Trzeba:
customElement.define('mockup-element', MockupElement);
-
Error nr. 2
Uncaught DOMException: Failed to construct 'CustomElement': The result must not have children (anonymous) @ (index):13
⛔ Nie wolno:
this.textContent = '...';
👍 Trzeba:
shadow.textContent = '...';
-
Error nr. 3
Uncaught TypeError: Cannot read property 'content' of null at HTMLElement.connectedCallback (main.js:10) at main.js:21
wewnątrz dokumentu importowanego przy pomocy
link[rel=import]
.⛔ Nie wolno:
document.querySelector('...')
👍 Trzeba:
document.currentScript.ownerDocument.querySelector('...')
- Artykuły
- https://css-tricks.com/snippets/css/complete-guide-grid/
- https://www.html5rocks.com/en/tutorials/webcomponents/imports/
- https://hacks.mozilla.org/2014/12/mozilla-and-web-components/
- https://developers.google.com/web/fundamentals/getting-started/primers/customelements
- https://github.com/GoogleChrome/howto-components
- Video
- https://www.youtube.com/watch?v=2YEE5W8HdKk
- Slajdy: http://slides.com/smalluban/webcomponents
- Dominik Lubański: Web Components. Are we there yet?
- https://www.youtube.com/watch?v=myvGmcwOnL4
- Slajdy: http://slides.com/coderitual/potential-power-of-web-components
- Michał Skowronek: Potential power of web components
- https://www.youtube.com/watch?v=2YEE5W8HdKk
- Shimy / Polyfille
- ShadyCSS - ShadowDOM style encapsulation
- ShadyDOM (mniejszy od ShadowDOM Polyfill)
- WebComponents.js
- Polymer
- https://www.polymer-project.org/
- w wersji v2 będzie wspierał v1
- X-Tag
- https://x-tag.github.io/
- wspiera v0
- Skate.js
- WebComponents.org
- Inne
The MIT License @ 2017