Vi känner alla till komponenter: det mest kraftfulla byggblocket i Angular-ekosystemet. Komponenterna är platsen där Dom renderas, tjänster injiceras, vyer renderas på nytt med ändringsdetektering. Komponenter kan ta emot värden som ingångar och utlösa händelser som utgångar. Men problemet är att detta vackra block hittills bara har fungerat inom ett Angular-ekosystem. Jag önskar att vi kunde hjälpa mänskligheten genom att använda Angular-komponenter även utanför Angular-ekosystemet.
Ja! Från och med Angular 7 har Angular tagit med sig funktionen ”Angular Element”. Nu kan en angulär komponent exporteras som en fristående webbkomponent. Vi kan använda den precis som en typisk HTML-tagg som div eller span, i en HTML-sida, CMS eller till och med i ett React- eller Vue.js-projekt.
Hur det fungerar:
Webkomponent är en webbstandard för att definiera ett nytt anpassat HTML-element i webbläsaren. Webbläsare upprätthåller ett register som kallas customElementRegistry . Med hjälp av metoden CustomElementRegistry.define() kan vi registrera en ”dom string” och en klass som definierar dess beteende.
Angulars paket @angular/elements exponerar metoden createCustomElement som omvandlar angularkomponenten och dess beroenden som en klass som är kompatibel som en webbkomponent.
För tillfället stöds webbstandarden av alla webbläsare Chrome, Firefox, Safari och Opera. Vi kan också göra den fungerande i andra webbläsare med hjälp av polyfills.
Användningsfall:
Det finns minst tre användningsfall där vi kan använda oss av exporterbara, fullt fungerande Angular-komponenter som webbkomponenter:
- Mikro front end
- Legacy code migration
- Plug & play webbkomponenter för tredjepartstjänster
Mikro front end:
Likt mikrotjänster finns det ett annat liknande begrepp som kallas för mikro-frontend. I en mikro-frontend-arkitektur är det ett litet team med full stack som ansvarar för att leverera inte bara API:erna utan även motsvarande front-end-komponenter. Till exempel kommer ”produktteamet” att skapa produkt-API:er och alla produktrelaterade vyer som används på olika kategorisidor, produktdetaljeringssidor, kundvagnssidor och kassasidor. I ett sådant fall kommer alla team att tillhandahålla olika webbkomponenter och ett front-end-team kommer bara att limma ihop dessa komponenter på olika sidor.
Migration:
Projekt som är skrivna i Angular 1.x har alltid varit en utmaning att migrera till Angular. Det finns ingen enkel magisk trollformel som ng uppdatering. Detsamma gäller för ett fall där någon vill migrera sitt projekt till Angular från React eller Vue. Webbkomponenter är den bästa lösningen här. De kan gradvis konvertera sina befintliga komponenter/controllers till Angular-webbkomponenter och ersätta dem från det befintliga systemet. När alla komponenter/kontrollanter är konverterade kan de bara ersätta det gamla systemet med det senaste angular.
Tjänster från tredje part:
Tjänsteleverantörer kan tillhandahålla plug & play-webbkomponenter som kan klistras in på kundens webbplats utan att det behövs någon ytterligare teknik.
Det verkar alltså lovande om vi faktiskt kan leverera en angularkomponent som en webbkomponent. Så låt oss göra våra händer smutsiga med själva kodningen.
Exempelprojekt:
Här är en exempelkod vi skriver en my-todo-list webbkomponent. Du kan kolla hela koden här i Github.
Steg 1: Skriv komponenten och tjänsten
- En TodoList-komponent för att visa en lista med todo’s.
- En TodoService för att hämta todo’s från platshållaren JSON API.
- Toddolist-komponenten kommer att ta ”name” som input.
- TodoList-komponenten utlöser händelsen onTodoComplete när en todo markeras som klar.
Så, som detta, kan vi använda en angulär komponent i något annat projekt. Du kan själv prova att klona koden från Github.
Ref:
- https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements
- https://developer.mozilla.org/en-US/docs/Web/API/CustomElementRegistry
- https://angular.io/guide/elements