Komponentit ovat meille kaikille tuttuja: Angular-ekosysteemin tehokkain rakennuspalikka. Komponentit ovat paikka, jossa Dom renderöidään, palvelut injektoidaan, näkymät renderöidään uudelleen muutosten tunnistuksella. Komponentit voivat ottaa arvoja syötteinä ja käynnistää tapahtumia tuotoksina. Mutta ongelmana on, että tämä kaunis palikka toimii toistaiseksi vain Angular-ekosysteemin sisällä. Toivoisin, että voisimme auttaa ihmiskuntaa käyttämällä angular-komponentteja myös angular-ekosysteemin ulkopuolella.
Kyllä! Angular 7:stä alkaen Angular tuo ominaisuuden ”Angular Element”. Nyt angular-komponentti voidaan viedä itsenäisenä web-komponenttina. Voimme käyttää sitä aivan kuten tyypillistä HTML-tagia, kuten div tai span, millä tahansa HTML-sivulla, CMS:ssä tai jopa React- tai Vue.js-projektin sisällä.
Miten se toimii:
Web-komponentti on web-standardi, jolla voidaan määritellä uusi mukautettu HTML-elementti selaimeen. Selaimet ylläpitävät rekisteriä nimeltä customElementRegistry . Käyttämällä metodia CustomElementRegistry.define() voimme rekisteröidä ”dom-merkkijonon” ja luokan, joka määrittelee sen käyttäytymisen.
Angularin @angular/elements-paketti paljastaa metodin createCustomElement, joka muuntaa angular-komponentin ja sen riippuvuudet web-komponenttina yhteensopivana luokkana.
Web-standardia tukevat tällä hetkellä kaikki Chrome-, Firefox-, Safari- ja Opera-selaimet. Voimme tehdä siitä toimivan myös muissa selaimissa käyttämällä polyfillejä.
Käyttökohteet:
On ainakin 3 käyttökohtaa, joissa voimme hyödyntää vietäviä täysin toimivia angular-komponentteja web-komponentteina:
- Micro front end
- Legacy code migration
- Plug & play web components for third-party services
Micro front end:
Micro-service:
Micro-palvelun tavoin, on olemassa toinenkin samankaltainen konsepti, jota kutsutaan nimellä micro-frontend. Mikro-frontend-arkkitehtuurissa pieni full-stack-tiimi on vastuussa API:iden lisäksi myös niitä vastaavien front-end-komponenttien toimittamisesta. Esimerkiksi ”tuotetiimi” luo tuote-API:t ja kaikki tuotteisiin liittyvät näkymät, joita käytetään eri kategoriasivuilla, tuotetietosivulla ja ostoskorin & kassasivulla. Tällaisessa tapauksessa kaikki tiimit toimittavat erilaisia web-komponentteja ja yksi front end -tiimi vain liimaa nämä komponentit yhteen eri sivuilla.
Migraatio:
Projekteissa, jotka on kirjoitettu Angular 1.x:ssä, Migraatio Angulariin on aina ollut haaste. Ei ole olemassa helppoa taikaloitsun kaltaista ng-päivitystä. Sama pätee tapaukseen, jossa joku haluaa siirtää projektinsa Angulariin Reactista tai Vue:sta. Verkkokomponentit sopivat tähän parhaiten. He voivat asteittain muuntaa olemassa olevat komponenttinsa/valvojansa Angularin web-komponenteiksi ja korvata ne olemassa olevasta järjestelmästä. Kun kaikki komponentit/ohjaimet on muunnettu, he voivat vain korvata vanhan järjestelmän uusimmalla angularilla.
Kolmannen osapuolen palvelut:
Palveluntarjoajat voivat tarjota plug & play web-komponentteja, jotka voidaan liimata asiakkaan verkkosivustoon ilman, että tarvitaan mitään lisäsuunnittelua.
Näyttää siis siltä, että se on lupaavaa, jos voimme oikeasti toimittaa angular-komponentin web-komponenttina. Joten likaamme kätemme varsinaisella koodauksella.
Esimerkkiprojekti:
Tässä on esimerkkikoodi, jolla kirjoitamme my-todo-list web-komponentin. Tiedoksesi voit tarkistaa koko koodin täältä Githubista.
Vaihe 1: Kirjoita komponentti ja palvelu
- TodoList-komponentti, joka näyttää listan todoista.
- TodoService, joka noutaa todot JSON API:sta.
- TodoList-komponentti ottaa syötteenä ”name”.
- Todo-lista-komponentti laukaisee onTodoComplete-tapahtuman, kun jokin todo merkitään tehdyksi.