{"id":43233,"date":"2021-08-26T13:21:51","date_gmt":"2021-08-26T11:21:51","guid":{"rendered":"https:\/\/kinsta.com\/?p=98073"},"modified":"2023-10-02T19:36:35","modified_gmt":"2023-10-02T18:36:35","slug":"web-komponenten","status":"publish","type":"post","link":"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/","title":{"rendered":"Eine vollst\u00e4ndige Einleitung zu Webkomponenten im Jahr 2026"},"content":{"rendered":"<p>Wir alle haben Projekte, an denen wir lieber nicht arbeiten w\u00fcrden. Der Code ist un\u00fcberschaubar geworden, der Umfang hat sich entwickelt, schnelle Korrekturen wurden auf andere Korrekturen angewandt und die Struktur ist unter dem Gewicht des Spaghetticodes zusammengebrochen. Coding kann eine chaotische Angelegenheit sein.<\/p>\n<p>Projekte profitieren von der Verwendung einfacher, unabh\u00e4ngiger Module, die eine einzige Verantwortung haben. Modularer Code ist gekapselt, so dass man sich weniger Gedanken \u00fcber die Implementierung machen muss. Solange du wei\u00dft, was ein Modul ausgibt, wenn es eine Reihe von Eingaben erh\u00e4lt, musst du nicht unbedingt verstehen, wie es dieses Ziel erreicht.<\/p>\n<p>Die Anwendung von modularen Konzepten auf eine einzelne <a href=\"https:\/\/kinsta.com\/de\/blog\/beste-programmiersprache-lernen-sollte\/\">Programmiersprache<\/a> ist einfach, aber die Webentwicklung erfordert eine vielf\u00e4ltige Mischung von Technologien. <a href=\"https:\/\/kinsta.com\/de\/browser-marktanteil\/\">Browser<\/a> analysieren <a href=\"https:\/\/kinsta.com\/de\/blog\/html-vs-html5\/\">HTML<\/a>, CSS und JavaScript, um den Inhalt, die Stile und die Funktionalit\u00e4t der Seite darzustellen.<\/p>\n<p>Sie lassen sich nicht immer leicht mischen, denn:<\/p>\n<ul>\n<li>Zusammenh\u00e4ngender Code kann auf drei oder mehr Dateien aufgeteilt sein, und<\/li>\n<li>Globale Stile und JavaScript-Objekte k\u00f6nnen sich auf unerwartete Weise gegenseitig beeintr\u00e4chtigen.<\/li>\n<\/ul>\n<p>Diese Probleme treten zus\u00e4tzlich zu denen auf, die durch Sprachlaufzeiten, <a href=\"https:\/\/kinsta.com\/de\/blog\/javascript-bibliotheken\/\">Frameworks<\/a>, Datenbanken und andere auf dem Server verwendete Abh\u00e4ngigkeiten entstehen.<\/p>\n<h3>Schau dir unseren <a href=\"https:\/\/www.youtube.com\/watch?v=hVxZ-te0kio\">Video-Leitfaden<\/a> zu Webkomponenten an<\/h3>\n<p><kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=hVxZ-te0kio\"><\/kinsta-video><br \/>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>Was sind Webkomponenten?<\/h2>\n<p>Eine Webkomponente ist eine M\u00f6glichkeit, einen gekapselten Codeblock mit einer einzigen Verantwortlichkeit zu erstellen, der auf jeder Seite wiederverwendet werden kann.<\/p>\n<p>Betrachte den HTML <strong><code>&lt;video&gt;<\/code><\/strong> Tag. Anhand einer <a href=\"https:\/\/kinsta.com\/de\/blog\/was-ist-eine-url\/\">URL<\/a> kann ein Betrachter Steuerelemente wie Abspielen, Pause, Zur\u00fcckgehen, Vorw\u00e4rtsgehen und Einstellen der Lautst\u00e4rke verwenden.<\/p>\n<p>Styling und Funktionalit\u00e4t sind vorgegeben, obwohl du mit verschiedenen Attributen und JavaScript API-Aufrufen Modifikationen vornehmen kannst. Eine beliebige Anzahl von <strong><code>&lt;video&gt;<\/code><\/strong>-Elementen kann innerhalb anderer Tags platziert werden, und sie werden nicht in Konflikt geraten.<\/p>\n<p>Was ist, wenn du deine eigene Funktionalit\u00e4t ben\u00f6tigst? Zum Beispiel ein Element, das die Anzahl der W\u00f6rter auf der Seite anzeigt? Es gibt (noch) kein HTML <strong><code>&lt;wordcount&gt;<\/code><\/strong> Tag.<\/p>\n<p>Frameworks wie <a href=\"https:\/\/kinsta.com\/de\/blog\/javascript-bibliotheken\/#reactjs\">React<\/a> und <a href=\"https:\/\/kinsta.com\/de\/blog\/vue-js\/\">Vue.js<\/a> erlauben es Entwicklern, Webkomponenten zu erstellen, bei denen der Inhalt, das Styling und die Funktionalit\u00e4t in einer einzigen JavaScript-Datei definiert werden k\u00f6nnen. Diese l\u00f6sen viele komplexe Programmierprobleme, aber bedenke, dass:<\/p>\n<ul>\n<li>Du musst lernen, wie man dieses Framework benutzt und deinen Code aktualisieren, wenn es sich weiterentwickelt.<\/li>\n<li>Eine Komponente, die f\u00fcr ein Framework geschrieben wurde, ist selten mit einem anderen kompatibel.<\/li>\n<li>Frameworks steigen und sinken in ihrer Popularit\u00e4t. Du wirst abh\u00e4ngig von den Launen und Priorit\u00e4ten des Entwicklungsteams und der Benutzer.<\/li>\n<li>Standard Web Components k\u00f6nnen Browserfunktionalit\u00e4t hinzuf\u00fcgen, die mit JavaScript allein nur schwer zu erreichen ist (wie z.B. das Shadow DOM).<\/li>\n<\/ul>\n<p>Gl\u00fccklicherweise finden beliebte Konzepte, die in Bibliotheken und Frameworks eingef\u00fchrt werden, ihren Weg in die Webstandards. Es hat einige Zeit gedauert, aber Web Components sind angekommen.<\/p>\n<h2>Eine kurze Geschichte der Web Components<\/h2>\n<p>Nach vielen herstellerspezifischen Fehlstarts wurde das Konzept der Standard Web Components erstmals von <a href=\"https:\/\/fronteers.nl\/congres\/2011\/sessions\/web-components-and-model-driven-views-alex-russell\">Alex Russell auf der Fronteers Conference 2011<\/a> vorgestellt. Googles <a href=\"https:\/\/github.com\/Polymer\/polymer\">Polymer-Bibliothek<\/a> (ein Polyfill, das auf den aktuellen Vorschl\u00e4gen basiert) kam zwei Jahre sp\u00e4ter, aber fr\u00fche Implementierungen erschienen erst 2016 in Chrome und Safari.<\/p>\n<p>Die Browserhersteller brauchten Zeit, um die Details auszuhandeln, aber die Web Components wurden 2018 in Firefox und 2020 in Edge hinzugef\u00fcgt (als Microsoft auf die Chromium-Engine umstieg).<\/p>\n<p>Verst\u00e4ndlicherweise waren nur wenige Entwickler bereit oder in der Lage, Web Components zu \u00fcbernehmen, aber wir haben endlich ein gutes Niveau an Browser Support mit stabilen APIs erreicht. Nicht alles ist perfekt, aber sie sind eine zunehmend brauchbare Alternative zu Framework-basierten Komponenten.<\/p>\n<p>Selbst wenn du noch nicht bereit bist, deinen Favoriten aufzugeben, sind Web Components mit jedem Framework kompatibel und die APIs werden auch in den n\u00e4chsten Jahren unterst\u00fctzt.<\/p>\n<p>Es gibt Repositories mit vorgefertigten Web Components, die jeder ausprobieren kann:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.webcomponents.org\/\">WebComponents.org<\/a><\/li>\n<li><a href=\"https:\/\/component.gallery\/\">The Component Gallery<\/a><\/li>\n<li><a href=\"https:\/\/genericcomponents.netlify.app\/\">generic-components<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/mdn\/web-components-examples\">web-components-examples<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/davatron5000\/awesome-standalones\">awesome-standalones<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/scottaohara\/accessible_components\">accessible_components<\/a><\/li>\n<li><a href=\"https:\/\/kickstand-ui.com\/\">Kickstand UI<\/a><\/li>\n<\/ul>\n<p>&#8230;aber es macht mehr Spa\u00df, seinen eigenen Code zu schreiben!<\/p>\n<p>Dieses Tutorial bietet eine komplette Einleitung in Web Components, die ohne ein JavaScript-Framework geschrieben wurden. Du wirst lernen, was sie sind und wie du sie f\u00fcr deine Webprojekte anpassen kannst. Du wirst einige Kenntnisse in <a href=\"https:\/\/kinsta.com\/de\/blog\/html-vs-html5\/\">HTML5<\/a>, CSS und JavaScript ben\u00f6tigen.<\/p>\n<h2>Erste Schritte mit Web Components<\/h2>\n<p>Web Components sind benutzerdefinierte HTML-Elemente wie z.B. <strong><code>&lt;hello-world&gt;&lt;\/hello-world&gt;<\/code><\/strong>. Der Name muss einen Bindestrich enthalten, um nicht mit Elementen zu kollidieren, die offiziell von der HTML-Spezifikation unterst\u00fctzt werden.<\/p>\n<p>Du musst eine ES2015-Klasse definieren, um das Element zu steuern. Es kann beliebig benannt werden, aber HelloWorld ist g\u00e4ngige Praxis. Es muss das <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/HTMLElement\">HTMLElement Interface<\/a> erweitern, welches die Standardeigenschaften und -methoden jedes HTML-Elements repr\u00e4sentiert.<\/p>\n<p><strong>Hinweis<\/strong>: <a href=\"https:\/\/kinsta.com\/de\/blog\/sechs-sichersten-browser\/#3-firefox\">Firefox<\/a> erlaubt es dir, bestimmte HTML-Elemente wie HTMLParagraphElement, HTMLImageElement oder HTMLButtonElement zu erweitern. Dies wird in anderen Browsern nicht unterst\u00fctzt und erlaubt es dir nicht, ein Schatten-DOM zu erstellen.<\/p>\n<p>Um etwas N\u00fctzliches zu tun, ben\u00f6tigt die Klasse eine Methode namens <strong>connectedCallback()<\/strong>, die aufgerufen wird, wenn das Element zu einem Dokument hinzugef\u00fcgt wird:<\/p>\n<pre><code class=\"language-html\">class HelloWorld extends HTMLElement {\n\n  \/\/ Komponente verbinden\n  connectedCallback() {\n    this.textContent = 'Hello World!';\n  }\n\n}\n<\/code><\/pre>\n<p>In diesem Beispiel wird der Text des Elements auf &#8222;Hello World&#8220; gesetzt.<\/p>\n<p>Die Klasse muss bei der <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/CustomElementRegistry\">CustomElementRegistry<\/a> registriert werden, um sie als Handler f\u00fcr ein bestimmtes Element zu definieren:<\/p>\n<pre><code class=\"language-html\">customElements.define( 'hello-world', HelloWorld );\n<\/code><\/pre>\n<p>Der Browser assoziiert nun das <code><b>&lt;hello-world&gt;<\/b><\/code> Element mit deiner <strong>HelloWorld <\/strong>Klasse, wenn dein JavaScript geladen wird (z.B.<code><b>&lt;script type=\"module\" src=\".\/helloworld.js\"&gt;&lt;\/script&gt;<\/b><\/code>).<\/p>\n<p>Du hast jetzt ein eigenes Element!<\/p>\n<p><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" title=\"&lt;hello-world&gt; component\" src=\"https:\/\/codepen.io\/craigbuckler\/embed\/preview\/WNpaxPN?default-tabs=js%2Cresult&#038;height=300&#038;host=https%3A%2F%2Fcodepen.io&#038;slug-hash=WNpaxPN#?secret=fW1rP1uP2U\" data-secret=\"fW1rP1uP2U\" scrolling=\"no\" frameborder=\"0\" height=\"300\"><\/iframe><\/p>\n<p><a href=\"https:\/\/codepen.io\/craigbuckler\/pen\/WNpaxPN\">CodePen demonstration<\/a><\/p>\n<p>Diese Komponente kann in CSS wie jedes andere Element gestaltet werden:<\/p>\n<pre><code class=\"language-css\">hello-world {\n  font-weight: bold;\n  color: red;\n}\n<\/code><\/pre>\n<h3>Hinzuf\u00fcgen von Attributen<\/h3>\n<p>Diese Komponente ist nicht vorteilhaft, da immer der gleiche Text ausgegeben wird. Wie jedes andere Element auch, k\u00f6nnen wir HTML-Attribute hinzuf\u00fcgen:<\/p>\n<pre><code class=\"language-html\">&lt;hello-world name=\"Craig\"&gt;&lt;\/hello-world&gt;<\/code><\/pre>\n<p>Damit k\u00f6nnte der Text \u00fcberschrieben werden, so dass &#8222;Hello Craig!&#8220; angezeigt wird. Um dies zu erreichen, kannst du der <strong>HelloWorld<\/strong> Klasse eine <strong>constructor()<\/strong> Funktion hinzuf\u00fcgen, die ausgef\u00fchrt wird, wenn jedes Objekt erstellt wird. Das muss sie:<\/p>\n<ol>\n<li>rufe die <strong>super()<\/strong>-Methode auf, um das \u00fcbergeordnete HTMLElement zu initialisieren, und<\/li>\n<li>andere Initialisierungen vorzunehmen. In diesem Fall definieren wir eine <strong>name<\/strong>-Eigenschaft, die auf den Standardwert &#8222;World&#8220; gesetzt wird:<\/li>\n<\/ol>\n<pre><code class=\"language-js\">class HelloWorld extends HTMLElement {\n\n  constructor() {\n    super();\n    this.name = 'World';\n  }\n\n  \/\/ more code...\n<\/code><\/pre>\n<p>Deine Komponente interessiert sich nur f\u00fcr das Attribut <strong>name<\/strong>. Eine statische <strong>observedAttributes()<\/strong> Eigenschaft sollte ein Array von zu beobachtenden Eigenschaften zur\u00fcckgeben:<\/p>\n<pre><code class=\"language-js\">\/\/ component attributes\nstatic get observedAttributes() {\n  return ['name'];\n}\n<\/code><\/pre>\n<p>Eine <strong>attributeChangedCallback()<\/strong> Methode wird aufgerufen, wenn ein Attribut im HTML definiert oder mit JavaScript ge\u00e4ndert wird. Ihr werden der Name der Eigenschaft, der alte und der neue Wert \u00fcbergeben:<\/p>\n<pre><code class=\"language-js\">\/\/ attribute change\nattributeChangedCallback(property, oldValue, newValue) {\n\n  if (oldValue === newValue) return;\n  this[ property ] = newValue;\n\n}\n<\/code><\/pre>\n<p>In diesem Beispiel w\u00fcrde nur die Eigenschaft <strong>name<\/strong> aktualisiert werden, aber du k\u00f6nntest bei Bedarf weitere Eigenschaften hinzuf\u00fcgen.<\/p>\n<p>Zum Schluss musst du noch die Nachricht in der Methode <strong>connectedCallback()<\/strong> anpassen:<\/p>\n<pre><code class=\"language-js\">\/\/ connect component\nconnectedCallback() {\n\n  this.textContent = `Hello ${ this.name }!`;\n\n}\n<\/code><\/pre>\n<p><a href=\"https:\/\/codepen.io\/craigbuckler\/pen\/BaWqLOK\">CodePen demonstration<\/a><\/p>\n<h3>Lebenszyklus-Methoden<\/h3>\n<p>Der Browser ruft automatisch sechs Methoden w\u00e4hrend des Lebenszyklus des Web Component Status auf. Die vollst\u00e4ndige Liste findest du hier, obwohl du die ersten vier bereits in den Beispielen oben gesehen hast:<\/p>\n<h4>constructor()<\/h4>\n<p>Es wird aufgerufen, wenn die Komponente zum ersten Mal initialisiert wird. Es muss <strong>super()<\/strong> aufrufen und kann alle Voreinstellungen setzen oder andere Vorverarbeitungsprozesse durchf\u00fchren.<\/p>\n<h4>static observedAttributes()<\/h4>\n<p>Gibt ein Array von Attributen zur\u00fcck, die der Browser beobachten wird.<\/p>\n<h4>attributeChangedCallback(propertyName,<b> oldValue, newValue)<\/b><\/h4>\n<p>Wird immer dann aufgerufen, wenn ein beobachtetes Attribut ge\u00e4ndert wird. Diejenigen, die in HTML definiert sind, werden sofort \u00fcbergeben, aber JavaScript kann sie modifizieren:<\/p>\n<pre><code class=\"language-js\">document.querySelector('hello-world').setAttribute('name', 'Everyone');\n<\/code><\/pre>\n<p>Die Methode muss eventuell ein Re-Rendering ausl\u00f6sen, wenn dies geschieht.<\/p>\n<h4>connectedCallback()<\/h4>\n<p>Diese Funktion wird aufgerufen, wenn die Webkomponente an ein Document Object Model angeh\u00e4ngt wird. Es sollte jedes erforderliche Rendering ausf\u00fchren.<\/p>\n<h4>disconnectedCallback()<\/h4>\n<p>Es wird aufgerufen, wenn die Webkomponente von einem Document Object Model entfernt wird. Dies kann n\u00fctzlich sein, wenn du aufr\u00e4umen musst, wie z.B. das Entfernen von gespeicherten Zust\u00e4nden oder das Abbrechen von <a href=\"https:\/\/kinsta.com\/de\/blog\/admin-ajax-php\/\">Ajax Anfragen<\/a>.<\/p>\n<h4>adoptedCallback()<\/h4>\n<p>Diese Funktion wird aufgerufen, wenn eine Webkomponente von einem Dokument in ein anderes verschoben wird. Vielleicht findest du eine Verwendung daf\u00fcr, obwohl ich mich schwer getan habe, an irgendwelche F\u00e4lle zu denken!<\/p>\n<h2>Wie Webkomponenten mit anderen Elementen interagieren<\/h2>\n<p>Web Components bieten einige einzigartige Funktionen, die du in JavaScript Frameworks nicht finden wirst.<\/p>\n<h3>Das Schatten-DOM<\/h3>\n<p>Obwohl die Webkomponente, die wir oben gebaut haben, funktioniert, ist sie nicht immun gegen Eingriffe von au\u00dfen, und CSS oder JavaScript k\u00f6nnten sie ver\u00e4ndern. Ebenso k\u00f6nnten die Stile, die du f\u00fcr deine Komponente definierst, nach au\u00dfen dringen und andere beeinflussen.<\/p>\n<p>Das Shadow DOM l\u00f6st dieses Kapselungsproblem, indem es ein separates DOM an die Webkomponente mit anh\u00e4ngt:<\/p>\n<pre><code class=\"language-js\">const shadow = this.attachShadow({ mode: 'closed' });\n<\/code><\/pre>\n<p>Der Modus kann entweder sein:<\/p>\n<ol>\n<li><b>&#8222;open&#8220;<\/b> \u2014 JavaScript in der \u00e4u\u00dferen Seite kann auf das Shadow DOM zugreifen (mit <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/Element\/shadowRoot\">Element.shadowRoot<\/a>), oder<\/li>\n<li><b>&#8222;closed&#8220;<\/b> \u2014 auf das Shadow DOM kann nur innerhalb der Webkomponente zugegriffen werden.<\/li>\n<\/ol>\n<p>Das Shadow DOM kann wie jedes andere DOM-Element manipuliert werden:<\/p>\n<pre><code class=\"language-js\">connectedCallback() {\n\n  const shadow = this.attachShadow({ mode: 'closed' });\n\n  shadow.innerHTML = `\n    &lt;style&gt;\n      p {\n        text-align: center;\n        font-weight: normal;\n        padding: 1em;\n        margin: 0 0 2em 0;\n        background-color: #eee;\n        border: 1px solid #666;\n      }\n    &lt;\/style&gt;\n\n    &lt;p&gt;Hello ${ this.name }!&lt;\/p&gt;`;\n\n}\n<\/code><\/pre>\n<p>Die Komponente rendert nun den &#8222;Hello&#8220;-Text innerhalb eines <strong><code>&lt;p&gt;<\/code><\/strong>-Elements und stylt ihn. Es kann nicht durch JavaScript oder CSS au\u00dferhalb der Komponente ver\u00e4ndert werden, obwohl einige Stile wie die <a href=\"https:\/\/kinsta.com\/de\/blog\/html-fonts\/\">Schriftart<\/a> und Farbe von der Seite geerbt werden, da sie nicht explizit definiert wurden.<\/p>\n<p><a href=\"https:\/\/codepen.io\/craigbuckler\/pen\/rNyqyJJ\">CodePen demonstration<\/a><\/p>\n<p>Die Stile, die auf diese Webkomponente skaliert sind, k\u00f6nnen keine anderen Abs\u00e4tze auf der Seite oder sogar andere <strong><code>&lt;hello-world&gt;<\/code><\/strong> Komponenten beeinflussen.<\/p>\n<p>Beachte, dass der CSS <code>:host<\/code> Selektor das \u00e4u\u00dfere <code><b>&lt;hello-world&gt;<\/b><\/code> -Element innerhalb der Webkomponente stylen kann:<\/p>\n<pre><code class=\"language-css\">:host {\n  transform: rotate(180deg);\n}\n<\/code><\/pre>\n<p>Du kannst auch Stile festlegen, die angewendet werden, wenn das Element eine bestimmte Klasse verwendet, z.B. <code><b>&lt;hello-world class=\"rotate90\"&gt;<\/b><\/code>:<\/p>\n<pre><code class=\"language-css\">:host(.rotate90) {\n  transform: rotate(90deg);\n}\n<\/code><\/pre>\n<h3>HTML Templates<\/h3>\n<p>HTML innerhalb eines Skripts zu definieren, kann f\u00fcr komplexere Web Components unpraktisch werden. Ein Template erlaubt es dir, einen Teil von HTML in deiner Seite zu definieren, den deine Webkomponente verwenden kann. Dies hat mehrere Vorteile:<\/p>\n<ol>\n<li>Du kannst den HTML-Code anpassen, ohne Strings in deinem JavaScript umschreiben zu m\u00fcssen.<\/li>\n<li>Komponenten k\u00f6nnen angepasst werden, ohne dass du f\u00fcr jeden Typ separate JavaScript-Klassen erstellen musst.<\/li>\n<li>Es ist einfacher, HTML in HTML zu definieren &#8211; und es kann auf dem Server oder Client ge\u00e4ndert werden, bevor die Komponente gerendert wird.<\/li>\n<\/ol>\n<p>Templates werden in einem <strong><code>&lt;template&gt;<\/code><\/strong>-Tag definiert, und es ist praktisch, eine ID zuzuweisen, damit du es innerhalb der Komponentenklasse referenzieren kannst. In diesem Beispiel drei Abs\u00e4tze, um die &#8222;Hello&#8220;-Nachricht anzuzeigen:<\/p>\n<pre><code class=\"language-html\">&lt;template id=\"hello-world\"&gt;\n\n  &lt;style&gt;\n    p {\n      text-align: center;\n      font-weight: normal;\n      padding: 0.5em;\n      margin: 1px 0;\n      background-color: #eee;\n      border: 1px solid #666;\n    }\n  &lt;\/style&gt;\n\n  &lt;p class=\"hw-text\"&gt;&lt;\/p&gt;\n  &lt;p class=\"hw-text\"&gt;&lt;\/p&gt;\n  &lt;p class=\"hw-text\"&gt;&lt;\/p&gt;\n\n&lt;\/template&gt;\n<\/code><\/pre>\n<p>Die Web Component Klasse kann auf dieses Template zugreifen, seinen Inhalt abrufen und die Elemente <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-seite-klont\/\">klonen<\/a>, um sicherzustellen, dass du \u00fcberall, wo es verwendet wird, ein einzigartiges DOM-Fragment erstellst:<\/p>\n<pre><code class=\"language-js\">const template = document.getElementById('hello-world').content.cloneNode(true);<\/code><\/pre>\n<p>Das DOM kann ver\u00e4ndert und direkt zum Shadow DOM hinzugef\u00fcgt werden:<\/p>\n<pre><code class=\"language-js\">connectedCallback() {\n\n  const\n\n    shadow = this.attachShadow({ mode: 'closed' }),\n    template = document.getElementById('hello-world').content.cloneNode(true),\n    hwMsg = `Hello ${ this.name }`;\n\n  Array.from( template.querySelectorAll('.hw-text') )\n    .forEach( n =&gt; n.textContent = hwMsg );\n\n  shadow.append( template );\n\n}\n<\/code><\/pre>\n<p><a href=\"https:\/\/codepen.io\/craigbuckler\/pen\/QWpZvdQ\">CodePen demonstration<\/a><\/p>\n<h3>Template Slots<\/h3>\n<p>Slots erlauben es dir, ein Template anzupassen. Angenommen, du m\u00f6chtest deine <strong><code>&lt;hello-world&gt;<\/code><\/strong> Webkomponente verwenden, aber die Nachricht innerhalb einer <strong>&lt;h1&gt;<\/strong> \u00dcberschrift im Shadow DOM platzieren. Du k\u00f6nntest diesen Code schreiben:<\/p>\n<pre><code class=\"language-html\">&lt;hello-world name=\"Craig\"&gt;\n\n  &lt;h1 slot=\"msgtext\"&gt;Hello Default!&lt;\/h1&gt;\n\n&lt;\/hello-world&gt;\n<\/code><\/pre>\n<p>(Beachte das <strong>slot<\/strong>-Attribut.)<\/p>\n<p>Optional k\u00f6nntest du weitere Elemente hinzuf\u00fcgen, wie zum Beispiel einen weiteren Absatz:<\/p>\n<pre><code class=\"language-html\">&lt;hello-world name=\"Craig\"&gt;\n\n  &lt;h1 slot=\"msgtext\"&gt;Hello Default!&lt;\/h1&gt;\n  &lt;p&gt;This text will become part of the component.&lt;\/p&gt;\n\n&lt;\/hello-world&gt;\n<\/code><\/pre>\n<p>Die Slots k\u00f6nnen nun innerhalb deines Templates implementiert werden:<\/p>\n<pre><code class=\"language-html\">&lt;template id=\"hello-world\"&gt;\n\n  &lt;slot name=\"msgtext\" class=\"hw-text\"&gt;&lt;\/slot&gt;\n\n  &lt;slot&gt;&lt;\/slot&gt;\n\n&lt;\/template&gt;\n<\/code><\/pre>\n<p>Ein Element-Slot-Attribut, das auf &#8222;msgtext&#8220; gesetzt ist (das <code><b>&lt;h1&gt;<\/b><\/code>), wird an der Stelle eingef\u00fcgt, an der es einen <code><b>&lt;slot&gt;<\/b><\/code> namens &#8222;msgtext&#8220; gibt. Dem <code><b>&lt;p&gt;<\/b><\/code> wird kein Slotname zugewiesen, aber es wird im n\u00e4chsten verf\u00fcgbaren unbenannten <strong><code>&lt;slot&gt;<\/code><\/strong> verwendet. Im Endeffekt wird das Template zu:<\/p>\n<pre><code class=\"language-html\">&lt;template id=\"hello-world\"&gt;\n\n  &lt;slot name=\"msgtext\" class=\"hw-text\"&gt;\n    &lt;h1 slot=\"msgtext\"&gt;Hello Default!&lt;\/h1&gt;\n  &lt;\/slot&gt;\n\n  &lt;slot&gt;\n    &lt;p&gt;This text will become part of the component.&lt;\/p&gt;\n  &lt;\/slot&gt;\n\n&lt;\/template&gt;\n<\/code><\/pre>\n<p>Ganz so einfach ist es in der Realit\u00e4t nicht. Ein <strong><code>&lt;slot&gt;<\/code><\/strong> Element im Shadow DOM zeigt auf die eingef\u00fcgten Elemente. Du kannst nur auf sie zugreifen, indem du einen <strong><code>&lt;slot&gt;<\/code><\/strong> lokalisierst und dann die <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/HTMLSlotElement\/assignedNodes\">Methode .assignedNodes()<\/a> benutzt, um ein Array der inneren Kinder zur\u00fcckzugeben. Die aktualisierte <strong>connectedCallback()<\/strong> Methode:<\/p>\n<pre><code class=\"language-js\">connectedCallback() {\n\n  const\n    shadow = this.attachShadow({ mode: 'closed' }),\n    hwMsg = `Hello ${ this.name }`;\n\n  \/\/ append shadow DOM\n  shadow.append(\n    document.getElementById('hello-world').content.cloneNode(true)\n  );\n\n  \/\/ Finde alle Slots mit einer hw-text Klasse\n  Array.from( shadow.querySelectorAll('slot.hw-text') )\n\n    \/\/ ersten zugewiesenenNode im Slot aktualisieren\n    .forEach( n =&gt; n.assignedNodes()[0].textContent = hwMsg );\n\n}\n<\/code><\/pre>\n<p><a href=\"https:\/\/codepen.io\/craigbuckler\/pen\/gOmBBvm\">CodePen demonstration<\/a><\/p>\n<p>Dar\u00fcber hinaus kannst du die eingef\u00fcgten Elemente nicht direkt stylen, obwohl du bestimmte Slots innerhalb deiner Webkomponente anvisieren kannst:<\/p>\n<pre><code class=\"language-html\">&lt;template id=\"hello-world\"&gt;\n\n  &lt;style&gt;\n    slot[name=\"msgtext\"] { color: green; }\n  &lt;\/style&gt;\n\n  &lt;slot name=\"msgtext\" class=\"hw-text\"&gt;&lt;\/slot&gt;\n  &lt;slot&gt;&lt;\/slot&gt;\n\n&lt;\/template&gt;\n<\/code><\/pre>\n<p><a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-template-hierarchie\/\">Template<\/a>-Slots sind ein wenig ungew\u00f6hnlich, aber ein Vorteil ist, dass dein Inhalt angezeigt wird, wenn JavaScript nicht ausgef\u00fchrt werden kann. Dieser Code zeigt eine Standard\u00fcberschrift und einen Absatz, die nur ersetzt werden, wenn die Web Component Klasse erfolgreich ausgef\u00fchrt wird:<\/p>\n<pre><code class=\"language-html\">&lt;hello-world name=\"Craig\"&gt;\n\n  &lt;h1 slot=\"msgtext\"&gt;Hello Default!&lt;\/h1&gt;\n  &lt;p&gt;This text will become part of the component.&lt;\/p&gt;\n\n&lt;\/hello-world&gt;\n<\/code><\/pre>\n<p>Du k\u00f6nntest also eine Form der progressiven Erweiterung implementieren &#8211; selbst wenn es nur eine &#8222;<em>Du brauchst JavaScript<\/em>&#8222;-Meldung ist!<\/p>\n<h3>Das deklarative Shadow DOM<\/h3>\n<p>Die obigen Beispiele konstruieren ein Shadow DOM mit JavaScript. Das bleibt die einzige Option, aber ein experimentelles deklaratives Shadow DOM wird f\u00fcr <a href=\"https:\/\/kinsta.com\/de\/blog\/besten-chrome-erweiterungen\/\">Chrome<\/a> entwickelt. Dies erm\u00f6glicht Server-Side Rendering und vermeidet jegliche Layout-Verschiebungen oder das Aufblitzen von unstylisiertem Inhalt.<\/p>\n<p>Der folgende Code wird vom HTML-Parser erkannt und erzeugt ein identisches Shadow DOM wie das, das du im letzten Abschnitt erstellt hast (du m\u00fcsstest die Meldung bei Bedarf aktualisieren):<\/p>\n<pre><code class=\"language-html\">&lt;hello-world name=\"Craig\"&gt;\n\n  &lt;template shadowroot=\"closed\"&gt;\n    &lt;slot name=\"msgtext\" class=\"hw-text\"&gt;&lt;\/slot&gt;\n    &lt;slot&gt;&lt;\/slot&gt;\n  &lt;\/template&gt;\n\n  &lt;h1 slot=\"msgtext\"&gt;Hallo Standard!&lt;\/h1&gt;\n  &lt;p&gt;Dieser Text wird Teil der Komponente.&lt;\/p&gt;\n\n&lt;\/hello-world&gt;\n<\/code><\/pre>\n<p>Das Feature ist nicht in allen Browsern verf\u00fcgbar und es gibt keine Garantie, dass es Firefox oder Safari erreichen wird. Du kannst mehr \u00fcber das <a href=\"https:\/\/web.dev\/declarative-shadow-dom\/\">deklarative Shadow DOM herausfinden<\/a>, und ein Polyfill ist einfach, aber sei dir bewusst, dass sich die Implementierung \u00e4ndern k\u00f6nnte.<\/p>\n<h3>Shadow DOM Ereignisse<\/h3>\n<p>Deine Webkomponente kann Ereignisse an jedes Element im Shadow DOM anh\u00e4ngen, genau wie du es im Seiten-DOM tun w\u00fcrdest, z.B. um auf Klick-Ereignisse auf allen inneren Kindern zu h\u00f6ren:<\/p>\n<pre><code class=\"language-js\">shadow.addEventListener('click', e =&gt; {\n\n  \/\/ etwas tun\n\n});\n<\/code><\/pre>\n<p>Solange du die <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/Event\/stopPropagation\">Propagation nicht stoppst<\/a>, wird das Ereignis in das Seiten-DOM sprudeln, aber das Ereignis wird zur\u00fcckgesendet. Daher scheint es von deinem benutzerdefinierten Element zu kommen und nicht von Elementen innerhalb des Elements.<\/p>\n<h2>Verwendung von Web Components in anderen Frameworks<\/h2>\n<p>Jede Webkomponente, die du erstellst, wird in allen <a href=\"https:\/\/kinsta.com\/de\/blog\/javascript-bibliotheken\/#the-most-popular-javascript-frameworks\">JavaScript Frameworks<\/a> funktionieren. Keines von ihnen kennt oder k\u00fcmmert sich um HTML-Elemente &#8211; deine <strong><code>&lt;hello-world&gt;<\/code><\/strong> Komponente wird identisch mit einem <strong><code>&lt;div&gt;<\/code><\/strong> behandelt und im DOM platziert, wo die Klasse aktiviert wird.<\/p>\n<p><a href=\"https:\/\/custom-elements-everywhere.com\/\">custom-elements-everywhere.com<\/a> bietet eine Liste von Frameworks und Web Component Notes. Die meisten sind vollst\u00e4ndig kompatibel, obwohl React.js einige Herausforderungen hat. Es ist m\u00f6glich, <strong><code>&lt;hello-world&gt;<\/code><\/strong> in JSX zu verwenden:<\/p>\n<pre><code class=\"language-js\">import React from 'react';\nimport ReactDOM from 'react-dom';\nimport from '.\/hello-world.js';\n\nfunction MeineSeite() {\n\n  return (\n    &lt;&gt;\n      &lt;hello-world name=\"Craig\"&gt;&lt;\/hello-world&gt; \n    &lt;\/&gt;\n  );\n\n}\n\nReactDOM.render(&lt;MyPage \/&gt;, document.getElementById('root'));\n<\/code><\/pre>\n<p>&#8230;aber:<\/p>\n<ul>\n<li>React kann nur primitive Datentypen an HTML-Attribute \u00fcbergeben (keine Arrays oder Objekte).<\/li>\n<li>React kann nicht auf Web Component Events lauschen, daher musst du manuell deine eigenen Handler anh\u00e4ngen.<\/li>\n<\/ul>\n<h2>Web Component Kritikpunkte und Probleme<\/h2>\n<p>Web Components haben sich deutlich verbessert, aber einige Aspekte k\u00f6nnen knifflig zu handhaben sein.<\/p>\n<h3>Styling-Schwierigkeiten<\/h3>\n<p>Das Styling von Web Components birgt einige Herausforderungen, besonders wenn du scoped Styles \u00fcberschreiben willst. Es gibt viele L\u00f6sungen:<\/p>\n<ol>\n<li><strong>Vermeide die Verwendung des Shadow DOMs<\/strong>. Du k\u00f6nntest Inhalte direkt an dein benutzerdefiniertes Element anh\u00e4ngen, obwohl jedes andere JavaScript es versehentlich oder b\u00f6swillig ver\u00e4ndern k\u00f6nnte.<\/li>\n<li><strong>Verwende<\/strong> die <strong><code>:host<\/code><\/strong> <strong>Klassen<\/strong>. Wie wir oben gesehen haben, kann <a href=\"https:\/\/kinsta.com\/de\/blog\/critical-rendering-path\/#optimize-css\">scoped CSS<\/a> bestimmte Stile anwenden, wenn eine Klasse auf das benutzerdefinierte Element angewendet wird.<\/li>\n<li><strong>Schau dir die benutzerdefinierten CSS-Eigenschaften (Variablen) an<\/strong>. Benutzerdefinierte Eigenschaften kaskadieren in Web Components. Wenn dein Element also <strong><code>var(--my-color)<\/code><\/strong> verwendet, kannst du <strong><code>--my-color<\/code><\/strong> in einem \u00e4u\u00dferen Container (wie <strong><code>:root<\/code><\/strong>) setzen und es wird verwendet.<\/li>\n<li><strong>Nutze die Vorteile von shadow parts<\/strong>. Der neue <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/CSS\/::part\">::part() Selektor<\/a> kann eine innere Komponente stylen, die ein part-Attribut hat, d.h. <strong><code>&lt;h1 part=\"heading\"&gt;<\/code><\/strong> innerhalb einer <strong><code>&lt;hello-world&gt;<\/code><\/strong> Komponente kann mit dem Selektor <code><strong>hello-world::part(heading)<\/strong><\/code> gestylt werden.<\/li>\n<li><strong>\u00dcbergib eine Zeichenkette mit Stilen<\/strong>. Du kannst sie als Attribut \u00fcbergeben, um sie innerhalb eines <strong><code>&lt;style&gt;<\/code><\/strong> Blocks anzuwenden.<\/li>\n<\/ol>\n<p>Keine ist ideal und du musst sorgf\u00e4ltig planen, wie andere Benutzer deine Webkomponente anpassen k\u00f6nnen.<\/p>\n<h3>Ignorierte Eingaben<\/h3>\n<p>Alle <code><b>&lt;input&gt;<\/b><\/code>, <code><b>&lt;textarea&gt;<\/b><\/code>, oder <code><b>&lt;select&gt;<\/b><\/code> -Felder in deinem Schatten-DOM werden nicht automatisch mit dem enthaltenen Formular verbunden. Fr\u00fche Web Component-Anh\u00e4nger f\u00fcgten versteckte Felder zum Seiten-DOM hinzu oder nutzten die <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/FormData\">FormData-Schnittstelle<\/a>, um Werte zu aktualisieren. Beides ist nicht besonders praktisch und bricht die Web Component-Kapselung.<\/p>\n<p>Das neue ElementInternals Interface erlaubt es einer Webkomponente, sich in Formulare <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-hooks\/\">einzuklinken<\/a>, so dass eigene Werte und G\u00fcltigkeiten definiert werden k\u00f6nnen. Es ist in Chrome implementiert, aber ein <a href=\"https:\/\/www.npmjs.com\/package\/element-internals-polyfill\">Polyfill ist f\u00fcr andere Browser verf\u00fcgbar<\/a>.<\/p>\n<p>Um dies zu demonstrieren, wirst du eine einfache <code><b>&lt;input-age name=\"your-age\"&gt;&lt;\/input-age&gt;<\/b><\/code>Komponente erstellen. Die Klasse muss einen statischen <strong>formAssociated<\/strong> Wert haben, der auf true gesetzt ist und optional kann eine <strong>formAssociatedCallback()<\/strong> Methode aufgerufen werden, wenn das \u00e4u\u00dfere Formular assoziiert wird:<\/p>\n<pre><code class=\"language-js\">\/\/ &lt;input-age&gt; web component\nclass InputAge extends HTMLElement {\n\n  static formAssociated = true;\n\n  formAssociatedCallback(form) {\n    console.log('form associated:', form.id);\n  }\n<\/code><\/pre>\n<p>Der Konstruktor muss nun die <strong>attachInternals()<\/strong>-Methode ausf\u00fchren, die es der Komponente erm\u00f6glicht, mit dem Formular und anderem <a href=\"https:\/\/kinsta.com\/de\/blog\/was-ist-javascript\/\">JavaScript-Code<\/a> zu kommunizieren, der den Wert oder die Validierung \u00fcberpr\u00fcfen m\u00f6chte:<\/p>\n<pre><code class=\"language-js\">  constructor() {\n\n    super();\n    this.internals = this.attachInternals();\n    this.setValue('');\n\n  }\n\n  \/\/ set form value\n\n  setValue(v) {\n\n    this.value = v;\n\n    this.internals.setFormValue(v);\n\n  }\n<\/code><\/pre>\n<p>Die Methode <strong>setFormValue()<\/strong> von ElementInternal setzt den Wert des Elements f\u00fcr das \u00fcbergeordnete Formular, das hier mit einem leeren String initialisiert wird (es kann auch ein FormData Objekt mit mehreren Name\/Wert-Paaren \u00fcbergeben werden). Andere Eigenschaften und Methoden beinhalten:<\/p>\n<ul>\n<li><b>form<\/b>: das \u00fcbergeordnete Formular<\/li>\n<li><b>labels<\/b>: ein Array von Elementen, die die Komponente beschriften<\/li>\n<li><a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/Constraint_validation\">Constraint Validation API<\/a> Optionen wie willValidate, checkValidity, und validationMessage<\/li>\n<\/ul>\n<p>Die Methode <strong>connectedCallback()<\/strong> erstellt wie zuvor ein Shadow <a href=\"https:\/\/kinsta.com\/de\/blog\/critical-rendering-path\/#the-dom\">DOM<\/a>, muss aber auch das Feld auf \u00c4nderungen \u00fcberwachen, damit <strong>setFormValue()<\/strong> ausgef\u00fchrt werden kann:<\/p>\n<pre><code class=\"language-js\">  connectedCallback() {\n\n    const shadow = this.attachShadow({ mode: 'closed' });\n\n    shadow.innerHTML = `\n      &lt;style&gt;input { width: 4em; }&lt;\/style&gt;\n      &lt;input type=\"number\" placeholder=\"age\" min=\"18\" max=\"120\" \/&gt;`;\n\n    \/\/ monitor input values\n    shadow.querySelector('input').addEventListener('input', e =&gt; {\n      this.setValue(e.target.value);\n    });\n\n  }\n<\/code><\/pre>\n<p>Du kannst nun mit dieser Webkomponente ein HTML-Formular erstellen, das sich \u00e4hnlich wie andere Formularfelder verh\u00e4lt:<\/p>\n<pre><code class=\"language-html\">&lt;form id=\"myform\"&gt;\n\n  &lt;input type=\"text\" name=\"your-name\" placeholder=\"name\" \/&gt;\n\n  &lt;input-age name=\"your-age\"&gt;&lt;\/input-age&gt;\n\n  &lt;button&gt;submit&lt;\/button&gt;\n\n&lt;\/form&gt;\n<\/code><\/pre>\n<p>Es funktioniert, aber es f\u00fchlt sich zugegebenerma\u00dfen ein wenig umst\u00e4ndlich an.<\/p>\n<p>Schau es dir in der <a href=\"https:\/\/codepen.io\/craigbuckler\/pen\/JjWmxwo\">CodePen Demonstration<\/a> an<\/p>\n<p>Weitere Informationen findest du in <a href=\"https:\/\/web.dev\/more-capable-form-controls\/\">diesem Artikel \u00fcber leistungsf\u00e4higere Formularsteuerelemente<\/a>.<\/p>\n\n<h2>Zusammenfassung<\/h2>\n<p>Web Components haben es schwer, Zustimmung und Akzeptanz zu erlangen, w\u00e4hrend JavaScript-Frameworks an Statur und F\u00e4higkeiten gewonnen haben. Wenn du von React, <a href=\"https:\/\/kinsta.com\/de\/blog\/javascript-bibliotheken\/#vuejs\">Vue.js<\/a> oder <a href=\"https:\/\/kinsta.com\/de\/blog\/php-vs-angular\/#what-is-angular\">Angular<\/a> kommst, k\u00f6nnen Web Components komplex und klobig wirken, besonders wenn du Features wie Datenbindung und Zustandsverwaltung vermisst.<\/p>\n<p>Es gibt noch einige Probleme zu l\u00f6sen, aber die Zukunft f\u00fcr Web Components ist rosig. Sie sind Framework-unabh\u00e4ngig, leichtgewichtig, schnell und k\u00f6nnen Funktionen implementieren, die in JavaScript allein unm\u00f6glich w\u00e4ren.<\/p>\n<p>Vor einem Jahrzehnt h\u00e4tten nur wenige eine Webseite ohne <a href=\"https:\/\/kinsta.com\/de\/blog\/was-ist-jquery\/\">jQuery<\/a> in Angriff genommen, aber die Browserhersteller haben die exzellenten Teile \u00fcbernommen und native Alternativen (wie querySelector) hinzugef\u00fcgt. Das Gleiche wird f\u00fcr JavaScript-Frameworks passieren, und Web Components ist dieser erste zaghafte Schritt.<\/p>\n<p><em>Hast du noch Fragen zur Verwendung von Web Components? Lass uns in den Kommentaren dar\u00fcber reden!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wir alle haben Projekte, an denen wir lieber nicht arbeiten w\u00fcrden. Der Code ist un\u00fcberschaubar geworden, der Umfang hat sich entwickelt, schnelle Korrekturen wurden auf andere &#8230;<\/p>\n","protected":false},"author":188,"featured_media":43236,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[215,465],"topic":[991],"class_list":["post-43233","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-html","tag-javascript","topic-web-entwicklungs-tools"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Eine vollst\u00e4ndige Einleitung zu Webkomponenten im Jahr 2026<\/title>\n<meta name=\"description\" content=\"Web Components sind ein Standardweg, um wiederverwendbare und modulare HTML-Elemente zu erstellen, ohne ein JavaScript-Framework zu verwenden.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Eine vollst\u00e4ndige Einleitung zu Webkomponenten im Jahr 2026\" \/>\n<meta property=\"og:description\" content=\"Web Components sind ein Standardweg, um wiederverwendbare und modulare HTML-Elemente zu erstellen, ohne ein JavaScript-Framework zu verwenden.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-08-26T11:21:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-10-02T18:36:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/08\/web-components.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Craig Buckler\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Web Components sind ein Standardweg, um wiederverwendbare und modulare HTML-Elemente zu erstellen, ohne ein JavaScript-Framework zu verwenden.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/08\/web-components.png\" \/>\n<meta name=\"twitter:creator\" content=\"@craigbuckler\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Craig Buckler\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"14\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/\"},\"author\":{\"name\":\"Craig Buckler\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/715d986404b06691ab3014e06596908e\"},\"headline\":\"Eine vollst\u00e4ndige Einleitung zu Webkomponenten im Jahr 2026\",\"datePublished\":\"2021-08-26T11:21:51+00:00\",\"dateModified\":\"2023-10-02T18:36:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/\"},\"wordCount\":2886,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/08\/web-components.png\",\"keywords\":[\"html\",\"JavaScript\"],\"articleSection\":[\"Webentwicklung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/\",\"url\":\"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/\",\"name\":\"Eine vollst\u00e4ndige Einleitung zu Webkomponenten im Jahr 2026\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/08\/web-components.png\",\"datePublished\":\"2021-08-26T11:21:51+00:00\",\"dateModified\":\"2023-10-02T18:36:35+00:00\",\"description\":\"Web Components sind ein Standardweg, um wiederverwendbare und modulare HTML-Elemente zu erstellen, ohne ein JavaScript-Framework zu verwenden.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/08\/web-components.png\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/08\/web-components.png\",\"width\":1460,\"height\":730,\"caption\":\"Eine vollst\u00e4ndige Einleitung zu Webkomponenten im Jahr 2021\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Webentwicklungs-Tools\",\"item\":\"https:\/\/kinsta.com\/de\/thema\/web-entwicklungs-tools\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Eine vollst\u00e4ndige Einleitung zu Webkomponenten im Jahr 2024\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/de\/#website\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/de\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\",\"https:\/\/x.com\/Kinsta_DE\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/715d986404b06691ab3014e06596908e\",\"name\":\"Craig Buckler\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g\",\"caption\":\"Craig Buckler\"},\"description\":\"Freelance UK web developer, writer, and speaker. Has been around a long time and rants about standards and performance.\",\"sameAs\":[\"https:\/\/craigbuckler.com\/\",\"https:\/\/www.linkedin.com\/in\/craigbuckler\",\"https:\/\/x.com\/craigbuckler\",\"https:\/\/www.youtube.com\/channel\/UCQwdl5oBTWGhifS6bRGADMQ\"],\"url\":\"https:\/\/kinsta.com\/de\/blog\/author\/craigbuckler\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Eine vollst\u00e4ndige Einleitung zu Webkomponenten im Jahr 2026","description":"Web Components sind ein Standardweg, um wiederverwendbare und modulare HTML-Elemente zu erstellen, ohne ein JavaScript-Framework zu verwenden.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/","og_locale":"de_DE","og_type":"article","og_title":"Eine vollst\u00e4ndige Einleitung zu Webkomponenten im Jahr 2026","og_description":"Web Components sind ein Standardweg, um wiederverwendbare und modulare HTML-Elemente zu erstellen, ohne ein JavaScript-Framework zu verwenden.","og_url":"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","article_published_time":"2021-08-26T11:21:51+00:00","article_modified_time":"2023-10-02T18:36:35+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/08\/web-components.png","type":"image\/png"}],"author":"Craig Buckler","twitter_card":"summary_large_image","twitter_description":"Web Components sind ein Standardweg, um wiederverwendbare und modulare HTML-Elemente zu erstellen, ohne ein JavaScript-Framework zu verwenden.","twitter_image":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/08\/web-components.png","twitter_creator":"@craigbuckler","twitter_site":"@Kinsta_DE","twitter_misc":{"Verfasst von":"Craig Buckler","Gesch\u00e4tzte Lesezeit":"14\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/"},"author":{"name":"Craig Buckler","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/715d986404b06691ab3014e06596908e"},"headline":"Eine vollst\u00e4ndige Einleitung zu Webkomponenten im Jahr 2026","datePublished":"2021-08-26T11:21:51+00:00","dateModified":"2023-10-02T18:36:35+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/"},"wordCount":2886,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/08\/web-components.png","keywords":["html","JavaScript"],"articleSection":["Webentwicklung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/","url":"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/","name":"Eine vollst\u00e4ndige Einleitung zu Webkomponenten im Jahr 2026","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/08\/web-components.png","datePublished":"2021-08-26T11:21:51+00:00","dateModified":"2023-10-02T18:36:35+00:00","description":"Web Components sind ein Standardweg, um wiederverwendbare und modulare HTML-Elemente zu erstellen, ohne ein JavaScript-Framework zu verwenden.","breadcrumb":{"@id":"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/de\/blog\/web-komponenten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#primaryimage","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/08\/web-components.png","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2021\/08\/web-components.png","width":1460,"height":730,"caption":"Eine vollst\u00e4ndige Einleitung zu Webkomponenten im Jahr 2021"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/de\/blog\/web-komponenten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/de\/"},{"@type":"ListItem","position":2,"name":"Webentwicklungs-Tools","item":"https:\/\/kinsta.com\/de\/thema\/web-entwicklungs-tools\/"},{"@type":"ListItem","position":3,"name":"Eine vollst\u00e4ndige Einleitung zu Webkomponenten im Jahr 2024"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/de\/#website","url":"https:\/\/kinsta.com\/de\/","name":"Kinsta\u00ae","description":"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen","publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/de\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","https:\/\/x.com\/Kinsta_DE","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/715d986404b06691ab3014e06596908e","name":"Craig Buckler","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g","caption":"Craig Buckler"},"description":"Freelance UK web developer, writer, and speaker. Has been around a long time and rants about standards and performance.","sameAs":["https:\/\/craigbuckler.com\/","https:\/\/www.linkedin.com\/in\/craigbuckler","https:\/\/x.com\/craigbuckler","https:\/\/www.youtube.com\/channel\/UCQwdl5oBTWGhifS6bRGADMQ"],"url":"https:\/\/kinsta.com\/de\/blog\/author\/craigbuckler\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/43233","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/users\/188"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/comments?post=43233"}],"version-history":[{"count":12,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/43233\/revisions"}],"predecessor-version":[{"id":64066,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/43233\/revisions\/64066"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/43233\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/43233\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/43233\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/43233\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/43233\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/43233\/translations\/pt"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/43233\/translations\/nl"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/43233\/translations\/se"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/43233\/translations\/jp"},{"href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/43233\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media\/43236"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media?parent=43233"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/tags?post=43233"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/topic?post=43233"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}