We zijn allemaal bekend met componenten: de krachtigste bouwsteen in het Angular ecosysteem. Componenten zijn waar de Dom wordt gerenderd, services worden geïnjecteerd, views worden ge-rerendered met change detection. Componenten kunnen waarden aannemen als inputs en gebeurtenissen triggeren als outputs. Maar het probleem is dat dit mooie blok tot nu toe alleen werkt binnen een Angular ecosysteem. Ik wou dat we de mensheid konden helpen door Angular componenten ook buiten het Angular ecosysteem te gebruiken.
Ja! Vanaf Angular 7, Angular brengt de functie “Angular Element”. Nu kan een Angular component worden geëxporteerd als een standalone web component. We kunnen het precies zo gebruiken als een typische HTML-tag zoals div of span, in elke HTML-pagina, CMS of zelfs binnen een React- of Vue.js-project.
Hoe het werkt:
Web Component is een webstandaard om een nieuw aangepast HTML-element in de browser te definiëren. Browsers houden een register bij met de naam customElementRegistry . Met behulp van de methode CustomElementRegistry.define() kunnen we een “dom string” registreren en een klasse die het gedrag ervan definieert.
Angular’s @angular/elements package stelt de methode createCustomElement bloot die angular component en zijn afhankelijkheden converteert als een klasse die compatibel is als een web component.
De web standaard wordt momenteel ondersteund door alle browsers Chrome, Firefox, Safari en Opera. We kunnen het ook werkbaar te maken in andere browsers met behulp van polyfills.
Use Cases:
Er zijn ten minste 3 use cases waarin we gebruik kunnen maken van exporteerbare volledig functionele angular componenten als web componenten:
- Micro frontend
- Legacy code migration
- Plug & play webcomponenten voor diensten van derden
Micro frontend:
Naast micro-service is er nog een soortgelijk concept genaamd micro-frontend. In een micro-frontend architectuur, is een klein full-stack team verantwoordelijk voor het leveren van niet alleen de API’s, maar ook de bijbehorende front-end componenten. Bijvoorbeeld, het “product team” zal product API’s en alle product-gerelateerde weergaven die worden gebruikt in verschillende categorie pagina’s, product detail pagina, winkelwagen & checkout pagina te creëren. In een geval als dit, alle team zal verschillende web-componenten te bieden en een front-end team zal alleen lijm die componenten samen in verschillende pagina’s.
Migratie:
Projecten geschreven in Angular 1.x, migratie naar Angular is altijd een uitdaging geweest. Er is geen gemakkelijke magische spreuk zoals ng update. Hetzelfde geldt voor een geval waarin iemand zijn project wil migreren naar Angular vanuit React of Vue. Webcomponenten passen hier het beste bij. Ze kunnen hun bestaande componenten/controllers geleidelijk omzetten naar Angular webcomponenten en deze vervangen vanuit het bestaande systeem. Zodra alle componenten / controllers zijn geconverteerd, kunnen ze gewoon vervangen het legacy-systeem met de nieuwste angular.
Third-party services:
Service providers kunnen plug & play webcomponenten te worden geplakt in de website van hun klant zonder enige verdere engineering nodig.
Dus lijkt het veelbelovend als we daadwerkelijk kunnen een angular component schip als een webcomponent. Dus laten we onze handen vuil maken met de eigenlijke coding.
Example project:
Hier is een voorbeeld code schrijven we een mijn-todo-lijst web component. FYI kunt u de hele code hier in Github.
Step 1: Schrijf de component en service
- Een TodoList component om een lijst van todo’s te tonen.
- Een TodoService om todo’s te halen uit placeholder JSON API.
- De TodoList component zal “naam” als input nemen.
- De TodoList-component activeert de gebeurtenis onTodoComplete wanneer een todo als voltooid wordt gemarkeerd.