{"id":47251,"date":"2021-08-30T17:12:08","date_gmt":"2021-08-30T15:12:08","guid":{"rendered":"https:\/\/kinsta.com\/?p=98073"},"modified":"2023-07-11T09:22:17","modified_gmt":"2023-07-11T08:22:17","slug":"web-component","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/web-component\/","title":{"rendered":"Introduzione Completa ai Web Component nel 2026"},"content":{"rendered":"<p>Tutti noi abbiamo progetti a cui preferiremmo non lavorare. Il codice \u00e8 diventato ingestibile, lo scopo si \u00e8 evoluto, sono state fatte correzioni veloci su altre correzioni e la struttura \u00e8 crollata sotto il suo peso di spaghetti code. Creare codice pu\u00f2 essere un affare disordinato.<\/p>\n<p>I progetti beneficiano dell&#8217;utilizzo di moduli semplici e indipendenti con una sola responsabilit\u00e0. Il codice modulare \u00e8 incapsulato, quindi c&#8217;\u00e8 meno bisogno di preoccuparsi dell&#8217;implementazione. Finch\u00e9 si sa cosa produrr\u00e0 un modulo quando gli viene dato un insieme di input, non si ha necessariamente bisogno di capire <em>come<\/em> ha raggiunto quell&#8217;obiettivo.<\/p>\n<p>Applicare concetti modulari a un singolo <a href=\"https:\/\/kinsta.com\/it\/blog\/miglior-linguaggio-di-programmazione\/\">linguaggio di programmazione<\/a> \u00e8 semplice, ma lo sviluppo web richiede un mix diversificato di tecnologie. I <a href=\"https:\/\/kinsta.com\/it\/mercato-globale-dei-browser\/\">browser<\/a> analizzano <a href=\"https:\/\/kinsta.com\/it\/blog\/html-e-html5\/\">HTML<\/a>, CSS e JavaScript per rendere il contenuto della pagina, gli stili e le funzionalit\u00e0.<\/p>\n<p>Non sempre si combinano facilmente perch\u00e9:<\/p>\n<ul>\n<li>Il codice correlato pu\u00f2 essere suddiviso in tre o pi\u00f9 file, e<\/li>\n<li>Gli stili globali e gli oggetti JavaScript possono interferire l&#8217;uno con l&#8217;altro in modi inattesi.<\/li>\n<\/ul>\n<p>Questi problemi si aggiungono a quelli incontrati da runtime di linguaggi, <a href=\"https:\/\/kinsta.com\/it\/blog\/librerie-javascript\/\">framework<\/a>, database e altre dipendenze utilizzate sul server.<\/p>\n<h3>Guarda la nostra <a href=\"https:\/\/www.youtube.com\/watch?v=hVxZ-te0kio\">video guida<\/a> ai componenti web<\/h3>\n<kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=hVxZ-te0kio\"><\/kinsta-video>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Cosa Sono i Web Component?<\/h2>\n<p>Un Web Component \u00e8 un modo per creare un blocco di codice incapsulato e a responsabilit\u00e0 singola che pu\u00f2 essere riutilizzato in qualsiasi pagina.<\/p>\n<p>Considerate il tag HTML <code><strong>&lt;video&gt;<\/strong><\/code> . Dato un <a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-un-url\/\">URL<\/a>, un utente pu\u00f2 utilizzare controlli come play, pausa, indietro, avanti e regolare il volume.<\/p>\n<p>Lo stile e la funzionalit\u00e0 sono forniti, anche se \u00e8 possibile apportare modifiche utilizzando vari attributi e chiamate all&#8217;API JavaScript. Qualsiasi numero di elementi <code><strong>&lt;video&gt;<\/strong><\/code> pu\u00f2 essere collocato all&#8217;interno di altri tag, e non entreranno in conflitto.<\/p>\n<p>E se avete bisogno di una vostra funzionalit\u00e0 custom? Ad esempio, un elemento che mostri il numero di parole nella pagina? Non c&#8217;\u00e8 un tag HTML <code><strong>&lt;wordcount&gt;<\/strong><\/code> (per il momento).<\/p>\n<p>Framework come <a href=\"https:\/\/kinsta.com\/it\/blog\/librerie-javascript\/#reactjs\">React<\/a> e <a href=\"https:\/\/kinsta.com\/it\/blog\/vue-js\/\">Vue.js<\/a> permettono agli sviluppatori di creare componenti web dove il contenuto, lo stile e le funzionalit\u00e0 possono essere definiti in un singolo file JavaScript. Questi risolvono molti problemi di programmazione complessi, ma bisogna tenere a mente che:<\/p>\n<ul>\n<li>Dovete imparare a utilizzare quel framework e aggiornare il vostro codice man mano che evolve.<\/li>\n<li>Un componente scritto per un framework \u00e8 raramente compatibile con un altro.<\/li>\n<li>I framework aumentano e diminuiscono di popolarit\u00e0. Diventerete dipendenti dai capricci e dalle priorit\u00e0 del team di sviluppo e degli utenti.<\/li>\n<li>I Web Component standard possono aggiungere funzionalit\u00e0 al browser, che \u00e8 difficile raggiungere con il solo JavaScript (come lo Shadow DOM).<\/li>\n<\/ul>\n<p>Per fortuna, i concetti popolari introdotti nelle librerie e nei framework di solito si fanno strada negli standard web. C&#8217;\u00e8 voluto del tempo, ma i Web Component sono arrivati.<\/p>\n\n<h2>Breve Storia dei Web Component<\/h2>\n<p>Dopo molte false partenze, il concetto di Web Component standard \u00e8 stato introdotto per la prima volta da <a href=\"https:\/\/fronteers.nl\/congres\/2011\/sessions\/web-components-and-model-driven-views-alex-russell\">Alex Russell alla conferenza Fronteers nel 2011<\/a>. La <a href=\"https:\/\/github.com\/Polymer\/polymer\">libreria Polymer<\/a> di Google (un polyfill basato sulle proposte correnti) \u00e8 arrivata due anni dopo, ma in Chrome e Safari le prime implementazioni non sono apparse fino al 2016.<\/p>\n<p>I vendor dei browser si sono presi del tempo per negoziare i dettagli, ma i Web Component sono stati aggiunti a Firefox nel 2018 e Edge nel 2020 (quando Microsoft \u00e8 passata al motore Chromium).<\/p>\n<p>Comprensibilmente, pochi sviluppatori sono stati disposti o sono riusciti ad adottare i Web Component, ma abbiamo finalmente raggiunto un buon livello di supporto da parte dei browser con API stabili. Non tutto \u00e8 perfetto, ma sono un&#8217;alternativa sempre pi\u00f9 valida ai componenti basati su framework.<\/p>\n<p>Anche se non siete ancora disposti a liberarvi del vostro framework preferito, i Web Component sono compatibili con <em>ogni<\/em> framework e le API saranno supportate per gli anni a venire.<\/p>\n<p>Ecco un elenco di repository di componenti web pre-costruiti disponibili per tutti:<\/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; ma scrivere il proprio codice \u00e8 pi\u00f9 divertente!<\/p>\n<p>Questo tutorial offre un&#8217;introduzione completa ai componenti web scritti senza un framework JavaScript. Vi spiegheremo cosa sono e come adattarli ai vostri progetti web. Avrete bisogno di qualche conoscenza di <a href=\"https:\/\/kinsta.com\/it\/blog\/html-e-html5\/\">HTML5<\/a>, CSS e JavaScript.<\/p>\n<h2>Introduzione ai Web Component<\/h2>\n<p>I componenti web sono elementi HTML personalizzati come <code><b>&lt;hello-world&gt;&lt;\/hello-world&gt;<\/b><\/code>. Il nome deve contenere un trattino per non andare in conflitto con elementi supportati ufficialmente nella specifica HTML.<\/p>\n<p>Dovete definire una classe ES2015 per controllare l&#8217;elemento. Pu\u00f2 avere qualsiasi nome, ma HelloWorld \u00e8 tra i pi\u00f9 comuni. Deve estendere l&#8217;<a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/HTMLElement\">interfaccia HTMLElement<\/a>, che rappresenta le propriet\u00e0 e i metodi predefiniti di ogni elemento HTML.<\/p>\n<p><strong>Nota: <\/strong><a href=\"https:\/\/kinsta.com\/it\/blog\/browser-piu-sicuri\/#3-firefox\">Firefox<\/a> permette di estendere specifici elementi HTML come HTMLParagraphElement, HTMLImageElement o HTMLButtonElement. Questo non \u00e8 supportato in altri browser e non permette di creare uno Shadow DOM.<\/p>\n<p>Per fare qualcosa di utile, la classe richiede un metodo chiamato <strong>connectedCallback()<\/strong>, che viene invocato quando l&#8217;elemento viene aggiunto a un documento:<\/p>\n<pre><code class=\"language-html\">class HelloWorld extends HTMLElement {\n\n  \/\/ connect component\n  connectedCallback() {\n    this.textContent = 'Hello World!';\n  }\n\n}\n<\/code><\/pre>\n<p>In questo esempio, il testo dell&#8217;elemento \u00e8 impostato su &#8220;Hello World&#8221;.<\/p>\n<p>La classe deve essere registrata con il <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/CustomElementRegistry\">CustomElementRegistry<\/a> per essere definita come gestore per un elemento specifico:<\/p>\n<pre><code class=\"language-html\">customElements.define( 'hello-world', HelloWorld );<\/code><\/pre>\n<p>Ora, quando il vostro codice JavaScript viene caricato, il browser associa l&#8217;elemento <code><strong>&lt;hello-world&gt;<\/strong><\/code> alla vostra classe <strong>HelloWorld<\/strong> (ad esempio <code><strong>&lt;script type=\"module\" src=\".\/helloworld.js\"&gt;&lt;\/script&gt;<\/strong><\/code> ).<\/p>\n<p>Ora avete un elemento personalizzato!<\/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=FHr99aVpE7\" data-secret=\"FHr99aVpE7\" scrolling=\"no\" frameborder=\"0\" height=\"300\"><\/iframe><\/p>\n<p><a href=\"https:\/\/codepen.io\/craigbuckler\/pen\/WNpaxPN\">Dimostrazione CodePen<\/a><\/p>\n<p>Questo componente pu\u00f2 essere stilizzato nei CSS come qualsiasi altro elemento:<\/p>\n<pre><code class=\"language-css\">hello-world {\n  font-weight: bold;\n  color: red;\n}\n<\/code><\/pre>\n<h3>Aggiungere gli Attributi<\/h3>\n<p>Questo componente non \u00e8 molto utile perch\u00e9 viene emesso sempre lo stesso testo. Come qualsiasi altro elemento, possiamo aggiungere attributi HTML:<\/p>\n<pre><code class=\"language-html\">&lt;hello-world name=\"Craig\"&gt;&lt;\/hello-world&gt;\n<\/code><\/pre>\n<p>Questo potrebbe sovrascrivere il testo in modo che venga visualizzato &#8220;Hello Craig!&#8221;&#8221; Per farlo, si pu\u00f2 aggiungere una funzione <strong>constructor()<\/strong> alla classe <strong>HelloWorld<\/strong>, che viene eseguita quando ogni oggetto viene creato. Essa deve:<\/p>\n<ol>\n<li>invocare il metodo <strong>super()<\/strong> per inizializzare l&#8217;HTMLElement padre e<\/li>\n<li>fare altre inizializzazioni. In questo caso, definiremo una propriet\u00e0 <strong>name<\/strong>, impostata di default su &#8220;World&#8221;:<\/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>Il vostro componente si preoccupa solo dell&#8217;attributo <strong>name<\/strong>. Una propriet\u00e0 statica <strong>observedAttributes()<\/strong> dovrebbe restituire un array di propriet\u00e0 da osservare:<\/p>\n<pre><code class=\"language-js\">\/\/ component attributes\nstatic get observedAttributes() {\n  return ['name'];\n}\n<\/code><\/pre>\n<p>Il metodo <strong>attributeChangedCallback()<\/strong> viene invocato quando un attributo viene definito nell&#8217;HTML o cambiato tramite JavaScript. Viene passato il nome della propriet\u00e0, il vecchio valore e il nuovo valore:<\/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 questo esempio, solo la propriet\u00e0 <strong>name<\/strong> verrebbe aggiornata, ma potreste aggiungere altre propriet\u00e0 se necessario.<\/p>\n<p>Infine, \u00e8 necessario modificare il messaggio nel metodo <strong>connectedCallback()<\/strong>:<\/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\">Dimostrazione CodePen<\/a><\/p>\n<h3>Metodi Lifecycle<\/h3>\n<p>Il browser invoca automaticamente sei metodi durante il ciclo di vita dello stato del Componente Web. Ecco la lista completa, anche se avete gi\u00e0 visto i primi quattro negli esempi precedenti:<\/p>\n<h4>constructor()<\/h4>\n<p>Viene invocato quando il componente viene inizializzato per la prima volta. Deve invocare <strong>super()<\/strong> e pu\u00f2 impostare qualsiasi valore di default o eseguire altri processi di pre-rendering.<\/p>\n<h4>static observedAttributes()<\/h4>\n<p>Restituisce un array di attributi che il browser dovr\u00e0 osservare.<\/p>\n<h4>attributeChangedCallback(propertyName, oldValue, newValue)<\/h4>\n<p>Invocato ogni volta che viene cambiato un attributo osservato. Quelli definiti in HTML vengono passati immediatamente, ma possono essere modificati via JavaScript:<\/p>\n<pre><code class=\"language-js\">document.querySelector('hello-world').setAttribute('name', 'Everyone');\n<\/code><\/pre>\n<p>Quando questo accade, il metodo potrebbe aver bisogno di innescare un re-rendering.<\/p>\n<h4>connectedCallback()<\/h4>\n<p>Questa funzione viene invocata quando il Web Component viene aggiunto a un Document Object Model. Dovrebbe eseguire qualsiasi rendering richiesto.<\/p>\n<h4>disconnectedCallback()<\/h4>\n<p>Viene invocato quando il Web Component viene rimosso da un Document Object Model. Questo pu\u00f2 essere utile se avete bisogno di fare pulizia, come rimuovere lo stato memorizzato o interrompere le <a href=\"https:\/\/kinsta.com\/it\/blog\/admin-ajax-php\/\">richieste Ajax<\/a>.<\/p>\n<h4>adoptedCallback()<\/h4>\n<p>Questa funzione viene invocata quando un Web Component viene spostato da un documento all&#8217;altro. Si pu\u00f2 trovare un impiego per questo, anche se ho fatto fatica a pensare a qualche caso concreto!<\/p>\n<h2>Come i Web Component Interagiscono con Altri Elementi<\/h2>\n<p>I Web Component offrono alcune funzionalit\u00e0 uniche che non troverete nei framework JavaScript.<\/p>\n<h3>Lo Shadow DOM<\/h3>\n<p>Anche se il Web Component che abbiamo creato sopra funziona, non \u00e8 immune da interferenze esterne e potrebbe essere modificato da CSS o JavaScript. Allo stesso modo, gli stili che definite per il vostro componente potrebbero trapelare e influenzare gli altri.<\/p>\n<p>Lo Shadow DOM risolve questo problema di incapsulamento, attaccando un DOM separato al componente web con:<\/p>\n<pre><code class=\"language-js\">const shadow = this.attachShadow({ mode: 'closed' });\n<\/code><\/pre>\n<p>La modalit\u00e0 pu\u00f2 essere:<\/p>\n<ol>\n<li><strong>&#8220;open&#8221; <\/strong>&#8211; JavaScript nella pagina esterna pu\u00f2 accedere al DOM ombra (con <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/Element\/shadowRoot\">Element.shadowRoot<\/a>) o<\/li>\n<li><strong>&#8220;closed&#8221; <\/strong>&#8211; si pu\u00f2 accedere al DOM ombra solo all&#8217;interno del componente web.<\/li>\n<\/ol>\n<p>Lo Shadow DOM pu\u00f2 essere manipolato come qualsiasi altro elemento del DOM:<\/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>Il componente ora rende il testo &#8220;Hello&#8221; all&#8217;interno di un elemento <code><strong>&lt;p&gt;<\/strong><\/code> e lo stilizza. Non pu\u00f2 essere modificato da JavaScript o CSS al di fuori del componente, anche se alcuni stili come il <a href=\"https:\/\/kinsta.com\/it\/blog\/font-html\/\">font<\/a> e il colore sono ereditati dalla pagina perch\u00e9 non sono stati definiti esplicitamente.<\/p>\n<p><a href=\"https:\/\/codepen.io\/craigbuckler\/pen\/rNyqyJJ\">Dimostrazione CodePen<\/a><\/p>\n<p>Gli stili applicati a questo componente web non possono influenzare altri paragrafi della pagina o anche altri componenti <strong><code>&lt;hello-world&gt;<\/code><\/strong>.<\/p>\n<p>Si noti che il selettore CSS <code>:host<\/code> pu\u00f2 stilizzare l&#8217;elemento esterno <code><strong>&lt;hello-world&gt;<\/strong><\/code> dall&#8217;interno del componente web:<\/p>\n<pre><code class=\"language-css\">:host {\n  transform: rotate(180deg);\n}\n<\/code><\/pre>\n<p>Potete anche impostare stili da applicare quando l&#8217;elemento usa una classe specifica, ad esempio <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>Template HTML<\/h3>\n<p>Definire l&#8217;HTML all&#8217;interno di uno script pu\u00f2 diventare poco pratico per i componenti web pi\u00f9 complessi. Un template vi permette di definire un blocco di HTML nella vostra pagina che pu\u00f2 essere utilizzato dal vostro Web Component. Questo presenta diversi vantaggi:<\/p>\n<ol>\n<li>Potete modificare il codice HTML senza dover riscrivere le stringhe nel vostro codice JavaScript.<\/li>\n<li>I componenti possono essere personalizzati senza dover creare classi JavaScript separate per ogni tipo.<\/li>\n<li>\u00c8 pi\u00f9 facile definire l&#8217;HTML in HTML &#8211; e pu\u00f2 essere modificato sul server o sul client prima del rendering del componente.<\/li>\n<\/ol>\n<p>I modelli sono definiti in un tag <code><b>&lt;template&gt;<\/b><\/code> , ed \u00e8 pratico assegnare un ID in modo da poter fare riferimento all&#8217;interno della classe del componente. Questo esempio mostra tre paragrafi per visualizzare il messaggio &#8220;Hello&#8221;:<\/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>La classe del Web Component pu\u00f2 accedere a questo template, prelevare il suo contenuto e <a href=\"https:\/\/kinsta.com\/it\/blog\/clonare-sito-wordpress\/\">clonare<\/a> gli elementi per creare un frammento DOM unico ovunque venga usato:<\/p>\n<pre><code class=\"language-js\">const template = document.getElementById('hello-world').content.cloneNode(true);<\/code><\/pre>\n<p>Il DOM pu\u00f2 essere modificato e aggiunto direttamente allo Shadow DOM:<\/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\">Dimostrazione CodePen<\/a><\/p>\n<h3>Slot di Template<\/h3>\n<p>Gli slot permettono di personalizzare un template. Supponiamo che vogliate utilizzare il vostro componente web <code><strong>&lt;hello-world&gt;<\/strong><\/code> ma posizionare il messaggio all&#8217;interno di un&#8217;intestazione <strong>&lt;h1&gt;<\/strong> nello Shadow DOM. Potreste scrivere questo codice:<\/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>(Notate l&#8217;attributo <strong>slot<\/strong>).<\/p>\n<p>Potreste opzionalmente voler aggiungere altri elementi come un altro paragrafo:<\/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>Gli slot possono ora essere implementati all&#8217;interno del vostro template:<\/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;<\/code><\/pre>\n<p>Un attributo slot dell&#8217;elemento impostato su &#8220;msgtext&#8221; (l&#8217;<code><strong>&lt;h1&gt;<\/strong><\/code>) viene inserito nel punto in cui c&#8217;\u00e8 uno <code><strong>&lt;slot&gt;<\/strong><\/code> chiamato &#8220;msgtext.&#8221; All&#8217;elemento <code><strong>&lt;p&gt;<\/strong><\/code> non \u00e8 assegnato un nome di slot, ma viene utilizzato nel successivo <code><strong>&lt;slot&gt;<\/strong><\/code> senza nome disponibile. In effetti, il template diventa:<\/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>In realt\u00e0 non \u00e8 cos\u00ec semplice. Un elemento <code><strong>&lt;slot&gt;<\/strong><\/code> nel DOM Shadow <em>punta<\/em> agli elementi inseriti. \u00c8 possibile accedervi solo individuando uno <code><strong>&lt;slot&gt;<\/strong><\/code> e poi utilizzando il <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/HTMLSlotElement\/assignedNodes\">metodo .assignedNodes()<\/a> per restituire un array di figli interni. Il metodo <strong>connectedCallback()<\/strong> aggiornato:<\/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  \/\/ find all slots with a hw-text class\n  Array.from( shadow.querySelectorAll('slot.hw-text') )\n\n    \/\/ update first assignedNode in slot\n    .forEach( n =&gt; n.assignedNodes()[0].textContent = hwMsg );\n\n}\n<\/code><\/pre>\n<p><a href=\"https:\/\/codepen.io\/craigbuckler\/pen\/gOmBBvm\">Dimostrazione CodePen<\/a><\/p>\n<p>Inoltre, non potete dare direttamente lo stile agli elementi inseriti, anche se potete mirare a slot specifici all&#8217;interno del vostro componente web:<\/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>Gli slot dei <a href=\"https:\/\/kinsta.com\/it\/blog\/gerarchia-dei-template-wordpress\/\">template<\/a> sono un po&#8217; insoliti, ma un vantaggio \u00e8 che il vostro contenuto sar\u00e0 mostrato se JavaScript non pu\u00f2 essere eseguito. Questo codice mostra un titolo e un paragrafo di default che vengono sostituiti solo quando la classe del Web Component viene eseguita con successo:<\/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>Pertanto, si potrebbe implementare qualche forma di miglioramento progressivo &#8211; anche se \u00e8 solo un messaggio <em>&#8220;Ti serve JavaScript&#8221;<\/em>!<\/p>\n<h3>Shadow DOM Dichiarativo<\/h3>\n<p>Gli esempi precedenti costruiscono uno Shadow DOM usando JavaScript. Questa rimane l&#8217;unica opzione, ma \u00e8 in fase di sviluppo uno Shadow DOM dichiarativo sperimentale per <a href=\"https:\/\/kinsta.com\/it\/blog\/migliori-estensioni-chrome\/\">Chrome<\/a>. Questo permette il Server-Side Rendering ed evita qualsiasi spostamento di layout o flash di contenuto non stilizzato.<\/p>\n<p>Il seguente codice viene rilevato dal parser HTML, che crea un DOM Shadow identico a quello che avete creato nella precedente sezione (dovreste aggiornare il messaggio come necessario):<\/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;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>La funzionalit\u00e0 non \u00e8 disponibile in nessun browser e non c&#8217;\u00e8 garanzia che arriver\u00e0 in Firefox o Safari. Potete <a href=\"https:\/\/web.dev\/declarative-shadow-dom\/\">trovare maggiori informazioni sullo Shadow DOM dichiarativo<\/a>, e un semplice polyfill, ma sappiate che l&#8217;implementazione potrebbe cambiare.<\/p>\n<h3>Eventi dello Shadow DOM<\/h3>\n<p>Il vostro Web Component pu\u00f2 attaccare eventi a qualsiasi elemento nello Shadow DOM proprio come fareste nel DOM della pagina, ad esempio per ascoltare gli eventi di clic su tutti i figli interni:<\/p>\n<pre><code class=\"language-js\">shadow.addEventListener('click', e =&gt; {\n\n  \/\/ do something\n\n});\n<\/code><\/pre>\n<p>A meno che non fermiate la propagazione con <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/Event\/stopPropagation\">StopPropagation<\/a>, l&#8217;evento si propagher\u00e0 nel DOM della pagina, ma l&#8217;evento sar\u00e0 retargettizzato. Quindi, sembra provenire dal vostro elemento personalizzato invece che da elementi al suo interno.<\/p>\n<h2>Utilizzare i Web Component in Altri Framework<\/h2>\n<p>Qualsiasi Web Component che create funzioner\u00e0 in tutti i <a href=\"https:\/\/kinsta.com\/it\/blog\/librerie-javascript\/#the-most-popular-javascript-frameworks\">framework JavaScript<\/a>. Nessuno di questi conosce o si preoccupa degli elementi HTML &#8211; il vostro componente <code><strong>&lt;hello-world&gt;<\/strong><\/code> sar\u00e0 trattato in modo identico a una <code><strong>&lt;div&gt;<\/strong><\/code> e inserito nel DOM dove la classe si attiver\u00e0.<\/p>\n<p><a href=\"https:\/\/custom-elements-everywhere.com\/\">custom-elements-everywhere.com<\/a> fornisce un elenco di framework e note sui Web Component. La maggior parte sono completamente compatibili, anche se React.js presenta delle particolarit\u00e0. \u00c8 possibile utilizzare <code><strong>&lt;hello-world&gt;<\/strong><\/code> in JSX:<\/p>\n<pre><code class=\"language-js\">import React from 'react';\nimport ReactDOM from 'react-dom';\nimport from '.\/hello-world.js';\n\nfunction MyPage() {\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; ma:<\/p>\n<ul>\n<li>React pu\u00f2 passare solo tipi di dati primitivi agli attributi HTML (non array o oggetti)<\/li>\n<li>React non pu\u00f2 ascoltare gli eventi dei componenti web, quindi devi collegare manualmente i vostri gestori.<\/li>\n<\/ul>\n<h2>Critiche e Problemi dei Web Component<\/h2>\n<p>I Web Component sono migliorati notevolmente, ma alcuni aspetti possono essere difficili da gestire.<\/p>\n<h3>Difficolt\u00e0 di Styling<\/h3>\n<p>Lo styling dei componenti web comporta alcune difficolt\u00e0, specialmente se si vuole sovrascrivere gli stili a scopo. Ci sono molte soluzioni:<\/p>\n<ol>\n<li><strong>Evitare di utilizzare lo Shadow DOM<\/strong>. Potreste aggiungere del contenuto direttamente al vostro elemento personalizzato, anche se qualsiasi altro codice JavaScript potrebbe accidentalmente o maliziosamente cambiarlo.<\/li>\n<li><strong>Utilizzare le classi <\/strong><code><strong>:host<\/strong><\/code>. Come abbiamo visto sopra, lo <a href=\"https:\/\/kinsta.com\/it\/blog\/percorso-rendering-critico\/#optimize-css\">scoped CSS<\/a> pu\u00f2 applicare stili specifici quando viene applicata una classe all&#8217;elemento personalizzato.<\/li>\n<li><strong>Controllare le propriet\u00e0 personalizzate di CSS (variabili). Le <\/strong>propriet\u00e0 personalizzate si riversano nei componenti web. Cos\u00ec, se il vostro elemento usa <code><strong>var(--my-color)<\/strong><\/code>, potete impostare <code><strong>--my-color<\/strong><\/code> in un container esterno (come <code><strong>:root<\/strong><\/code>), e questo sar\u00e0 utilizzato.<\/li>\n<li><strong>Sfruttate le parti shadow. <\/strong>Il nuovo <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/CSS\/::part\">selettore ::part()<\/a> pu\u00f2 stilizzare un componente interno che ha un attributo part. Ad esempio, <code><strong>&lt;h1 part=\"heading\"&gt;<\/strong><\/code> dentro un componente <code><strong>&lt;hello-world&gt;<\/strong><\/code> pu\u00f2 essere stilizzato con il selettore <code><strong>hello-world::part(heading)<\/strong><\/code>.<\/li>\n<li><strong>Passare una stringa di stili. <\/strong>Potete passarli come attributo da applicare all&#8217;interno di un blocco <code><strong>&lt; style&gt;<\/strong><\/code>.<\/li>\n<\/ol>\n<p>Nessuno di questi \u00e8 ideale, e dovrete pianificare attentamente il modo in cui gli altri utenti possono personalizzare il vostro componente web.<\/p>\n<h3>Input Ignorati<\/h3>\n<p>Qualsiasi campo <code><b>&lt;input&gt;<\/b><\/code>, <code><b>&lt;textarea&gt;<\/b><\/code> o <code><b>&lt;select&gt;<\/b><\/code> nello Shadow DOM non \u00e8 automaticamente associato al modulo che lo contiene. I primi utilizzatori di Web Component aggiungevano campi nascosti al DOM della pagina oppure utilizzavano l&#8217;<a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/FormData\">interfaccia FormData<\/a> per aggiornare i valori. Nessuno dei due \u00e8 particolarmente pratico e rompe l&#8217;incapsulamento dei Web Component.<\/p>\n<p>La nuova interfaccia ElementInternals permette ad un componente web <a href=\"https:\/\/kinsta.com\/it\/blog\/hook-wordpress\/\">di agganciarsi<\/a> ai moduli in modo da poter definire valori e validit\u00e0 personalizzati. \u00c8 implementata in Chrome, ma un <a href=\"https:\/\/www.npmjs.com\/package\/element-internals-polyfill\">\u00e8 disponibile polyfill<\/a> per gli altri browser.<\/p>\n<p>Come dimostrazione, si creer\u00e0 un componente base <code><b>&lt;input-age name=\"your-age\"&gt;&lt;\/input-age&gt;<\/b><\/code> . La classe deve avere un valore statico <strong>formAssociated<\/strong> impostato a true e, opzionalmente, pu\u00f2 essere invocato un metodo <strong>formAssociatedCallback()<\/strong> quando il modulo esterno viene associato:<\/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>Il costruttore deve ora eseguire il metodo <strong>attachInternals()<\/strong>, che permette al componente di comunicare con il modulo e con altro <a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-javascript\/\">codice JavaScript<\/a> che vuole ispezionare il valore o la validazione:<\/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>Il metodo <strong>setFormValue()<\/strong> di ElementInternal imposta il valore dell&#8217;elemento per il form padre inizializzato qui con una stringa vuota (pu\u00f2 anche essere passato un oggetto FormData con pi\u00f9 coppie nome\/valore). Altre propriet\u00e0 e metodi includono:<\/p>\n<ul>\n<li><strong>form<\/strong>: il modulo padre<\/li>\n<li><strong>labels<\/strong>: un array di elementi che etichettano il componente<\/li>\n<li>Opzioni <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/Constraint_validation\">Constraint Validation API<\/a> come willValidate, checkValidity e validationMessage<\/li>\n<\/ul>\n<p>Il metodo <strong>connectedCallback()<\/strong> crea uno Shadow <a href=\"https:\/\/kinsta.com\/it\/blog\/percorso-rendering-critico\/#the-dom\">DOM<\/a> come prima, ma deve anche monitorare il campo per le modifiche, in modo che possa essere eseguito <strong>setFormValue()<\/strong>:<\/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>Ora potete creare un modulo HTML con questo componente web che agisce in modo simile agli altri campi dei moduli:<\/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>Funziona, ma \u00e8 anche vero che sembra un po&#8217; contorto.<\/p>\n<p>Verificatelo nella <a href=\"https:\/\/codepen.io\/craigbuckler\/pen\/JjWmxwo\">dimostrazione CodePen<\/a><\/p>\n<p>Per maggiori informazioni, fate riferimento a <a href=\"https:\/\/web.dev\/more-capable-form-controls\/\">questo articolo sui controlli di form con maggiori capacit\u00e0<\/a>.<\/p>\n\n<h2>Riepilogo<\/h2>\n<p>I Web Component hanno faticato a guadagnare consenso e adozione in un momento in cui i framework JavaScript sono cresciuti in statura e capacit\u00e0. Se si proviene da React, <a href=\"https:\/\/kinsta.com\/it\/blog\/librerie-javascript\/#vuejs\">Vue.js<\/a> o <a href=\"https:\/\/kinsta.com\/it\/blog\/php-vs-angular\/#what-is-angular\">Angular<\/a>, i Web Component possono sembrare complessi e ingombranti, specialmente quando mancano funzionalit\u00e0 come il data-binding e la gestione dello stato.<\/p>\n<p>Ci sono dei problemi da risolvere, ma il futuro dei Web Component \u00e8 luminoso. Sono indipendenti dal framework, sono leggeri, veloci e possono implementare funzionalit\u00e0 che sarebbero impossibili con il solo JavaScript.<\/p>\n<p>Una decina di anni fa, pochi avrebbero affrontato un sito senza <a href=\"https:\/\/kinsta.com\/it\/blog\/jquery\/\">jQuery<\/a>, ma i vendor dei browser hanno preso le parti eccellenti e aggiunto alternative native (come querySelector). Lo stesso accadr\u00e0 per i framework JavaScript, e i Web Component sono quel primo timido passo.<\/p>\n<p><em>Avete qualche domanda su come utilizzare i componenti web? Parliamone nella sezione dei commenti!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tutti noi abbiamo progetti a cui preferiremmo non lavorare. Il codice \u00e8 diventato ingestibile, lo scopo si \u00e8 evoluto, sono state fatte correzioni veloci su altre &#8230;<\/p>\n","protected":false},"author":188,"featured_media":47254,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[7943,25648],"topic":[25883],"class_list":["post-47251","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-html","tag-javascript","topic-strumenti-di-sviluppo-web"],"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>Introduzione Completa ai Web Component nel 2026<\/title>\n<meta name=\"description\" content=\"I componenti web costituiscono un modo standard per creare elementi HTML riutilizzabili e modulari senza un framework JavaScript.\" \/>\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\/it\/blog\/web-component\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introduzione Completa ai Web Component nel 2026\" \/>\n<meta property=\"og:description\" content=\"I componenti web costituiscono un modo standard per creare elementi HTML riutilizzabili e modulari senza un framework JavaScript.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/web-component\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-08-30T15:12:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-11T08:22:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/08\/web-components-1.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=\"I componenti web costituiscono un modo standard per creare elementi HTML riutilizzabili e modulari senza un framework JavaScript.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/08\/web-components-1.png\" \/>\n<meta name=\"twitter:creator\" content=\"@craigbuckler\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Craig Buckler\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/web-component\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/web-component\/\"},\"author\":{\"name\":\"Craig Buckler\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/715d986404b06691ab3014e06596908e\"},\"headline\":\"Introduzione Completa ai Web Component nel 2026\",\"datePublished\":\"2021-08-30T15:12:08+00:00\",\"dateModified\":\"2023-07-11T08:22:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/web-component\/\"},\"wordCount\":2822,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/web-component\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/08\/web-components-1.png\",\"keywords\":[\"html\",\"JavaScript\"],\"articleSection\":[\"Sviluppo Web\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/web-component\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/web-component\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/web-component\/\",\"name\":\"Introduzione Completa ai Web Component nel 2026\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/web-component\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/web-component\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/08\/web-components-1.png\",\"datePublished\":\"2021-08-30T15:12:08+00:00\",\"dateModified\":\"2023-07-11T08:22:17+00:00\",\"description\":\"I componenti web costituiscono un modo standard per creare elementi HTML riutilizzabili e modulari senza un framework JavaScript.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/web-component\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/web-component\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/web-component\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/08\/web-components-1.png\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/08\/web-components-1.png\",\"width\":1460,\"height\":730,\"caption\":\"Un'introduzione completa ai componenti web in [anno]\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/web-component\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Strumenti di Sviluppo Web\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/strumenti-di-sviluppo-web\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Introduzione Completa ai Web Component nel 2024\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/it\/#website\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"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\/it\/#\/schema\/person\/715d986404b06691ab3014e06596908e\",\"name\":\"Craig Buckler\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/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\/it\/blog\/author\/craigbuckler\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Introduzione Completa ai Web Component nel 2026","description":"I componenti web costituiscono un modo standard per creare elementi HTML riutilizzabili e modulari senza un framework JavaScript.","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\/it\/blog\/web-component\/","og_locale":"it_IT","og_type":"article","og_title":"Introduzione Completa ai Web Component nel 2026","og_description":"I componenti web costituiscono un modo standard per creare elementi HTML riutilizzabili e modulari senza un framework JavaScript.","og_url":"https:\/\/kinsta.com\/it\/blog\/web-component\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2021-08-30T15:12:08+00:00","article_modified_time":"2023-07-11T08:22:17+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/08\/web-components-1.png","type":"image\/png"}],"author":"Craig Buckler","twitter_card":"summary_large_image","twitter_description":"I componenti web costituiscono un modo standard per creare elementi HTML riutilizzabili e modulari senza un framework JavaScript.","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/08\/web-components-1.png","twitter_creator":"@craigbuckler","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Craig Buckler","Tempo di lettura stimato":"15 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/web-component\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/web-component\/"},"author":{"name":"Craig Buckler","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/715d986404b06691ab3014e06596908e"},"headline":"Introduzione Completa ai Web Component nel 2026","datePublished":"2021-08-30T15:12:08+00:00","dateModified":"2023-07-11T08:22:17+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/web-component\/"},"wordCount":2822,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/web-component\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/08\/web-components-1.png","keywords":["html","JavaScript"],"articleSection":["Sviluppo Web"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/it\/blog\/web-component\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/web-component\/","url":"https:\/\/kinsta.com\/it\/blog\/web-component\/","name":"Introduzione Completa ai Web Component nel 2026","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/web-component\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/web-component\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/08\/web-components-1.png","datePublished":"2021-08-30T15:12:08+00:00","dateModified":"2023-07-11T08:22:17+00:00","description":"I componenti web costituiscono un modo standard per creare elementi HTML riutilizzabili e modulari senza un framework JavaScript.","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/web-component\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/web-component\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/web-component\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/08\/web-components-1.png","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/08\/web-components-1.png","width":1460,"height":730,"caption":"Un'introduzione completa ai componenti web in [anno]"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/web-component\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"Strumenti di Sviluppo Web","item":"https:\/\/kinsta.com\/it\/argomenti\/strumenti-di-sviluppo-web\/"},{"@type":"ListItem","position":3,"name":"Introduzione Completa ai Web Component nel 2024"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/it\/#website","url":"https:\/\/kinsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","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\/it\/#\/schema\/person\/715d986404b06691ab3014e06596908e","name":"Craig Buckler","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/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\/it\/blog\/author\/craigbuckler\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/47251","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/users\/188"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=47251"}],"version-history":[{"count":14,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/47251\/revisions"}],"predecessor-version":[{"id":71151,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/47251\/revisions\/71151"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47251\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47251\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47251\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47251\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47251\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47251\/translations\/pt"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47251\/translations\/nl"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47251\/translations\/se"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47251\/translations\/jp"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47251\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/47254"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=47251"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=47251"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=47251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}