Introductie Web Components

Edwin Martin

Web components is een W3C webstandaard waarmee je, eenvoudig gezegd, je eigen HTML-tags kunt maken.

Het toevoegen van een plattegrond op je webpagina kan dan zo eenvoudig zijn als het toevoegen van deze tag:

<g-map latitude="52.3812258" longitude="4.9001255"></g-map>

Met web components kan je component-gebaseerd werken zonder dat je een JavaScript framework nodig zoals Angular, React of Vue. De tag moet wel beschikbaar gemaakt worden in de pagina met JavaScript. Hier komen we nog op terug.

Volgens Wikipedia werden web components geïntroduceerd door Alex Russell van Google tijdens de Fronteers Conferentie in 2011.

De specificatie is na een aantal langdurige wijzigingen eindelijk gereed en wordt nu door alle moderne browsers ondersteund. Oudere browsers kunnen web components gebruiken in combinatie met polyfills.

Begonnen als zo'n polyfill is het door Google ontwikkelde Polymer. Hiermee konden web components al worden gebruikt terwijl browsers nog geen ondersteuning hadden. Het is het enige bekende framework met web components als basis.

Sinds 2018 zijn van dit project nog twee delen over die ook nu handig zijn als je met web components aan de slag gaat:

  • LitElement: een basisclass voor Web Components.
  • lit-html: een templating library gebaseerd op JavaScript template literals (dus gebruik makend van ${var}…).

Technologieën

Web Components is een verzamelnaam van drie webtechnologieën: Shadow DOM, Custom Elements en HTML Templates.

Shadow DOM

Met Shadow DOM is het mogelijk om binnen je eigen tag een hele HTML-structuur op te nemen inclusief CSS en JavaScript die is afgeschermd van de rest van de pagina, zodat conflicten met de rest van de pagina worden vermeden.

In de browser inspector is het mogelijk om in de Shadow DOM te kijken:

Een screenshot van Firefox Devtools, waarin de shadow DOM van een element wordt gemarkeerd met "#shadow-root"

Custom Elements

Een Custom Element is een JavaScript class waarmee je het gedrag van het element definieert.

HTML Templates

Alle HTML die tussen <template> en </template> staat wordt door de browser niet geparsed, dus CSS, JavaScript en bijvoorbeeld afbeeldingen worden niet uitgevoerd en gedownload. Dit template kan je met JavaScript kopiëren en in je Custom Element gebruiken, waarna het wel wordt geparset. Meer over het template element vind je op