Web Standards / Components

    Web Components i Lit

    Custom Elements, Shadow DOM, Lit od Google, Stencil.js, Declarative Shadow DOM SSR i micro-frontends z Module Federation.

    Lit ~5KB
    Google library
    Shadow DOM
    CSS isolation
    Declarative SD
    SSR support
    Micro-frontends
    Multi-framework

    6 narzędzi Web Components — porównanie

    Lit, Stencil, Shoelace, Astro, Module Federation i Single SPA — typ, rozmiar, SSR i zastosowanie.

    Narzędzie Typ Rozmiar SSR Kiedy
    Lit WC Library ~5KB Lit SSR (labs) Google ecosystem, produkcyjne WC
    Stencil.js WC Compiler (JSX) ~5KB output Tak (experimental) Ionic, design system z JSX DX
    Shoelace / Web Awesome WC UI Kit (Lit) Tree-shakeable Ograniczone Framework-agnostic UI komponenty
    Astro + WC SSG/SSR + WC Zero JS default Tak (natywny) Content sites, WC z SSR
    Module Federation Micro-frontend Runtime loading Webpack 5 / Vite Enterprise micro-frontends
    Single SPA Micro-frontend loader ~25KB Ograniczone Multi-framework org, orchestration

    Często zadawane pytania

    Co to są Web Components i jakie standardy je tworzą?

    Web Components: standard W3C. Natywne komponenty przeglądarki. Bez żadnego frameworka. Zestaw 3 standardów: Custom Elements: definiuj własne HTML tagi. class MyButton extends HTMLElement {connectedCallback() {this.innerHTML = 'button'}}. customElements.define('my-button', MyButton). Używaj: my-button w HTML. Shadow DOM: enkapsulacja DOM i CSS. const shadow = this.attachShadow({mode: 'open'}). CSS wewnątrz Shadow DOM nie wycieka na zewnątrz. Zewnętrzny CSS nie przenika do środka. HTML Templates: template id='my-template'. Zawartość nie renderowana do czasu klonowania. const template = document.querySelector('#my-template'). const clone = template.content.cloneNode(true). Lifecycle callbacks: connectedCallback() — element dodany do DOM. disconnectedCallback() — element usunięty. attributeChangedCallback(name, old, new) — atrybut zmieniony. observedAttributes — które atrybuty obserwować. adoptedCallback() — przeniesiony do innego dokumentu. Slots: slot name='header' — nazwane sloty. slot — domyślny slot. Kompozycja zawartości z zewnątrz. CSS Custom Properties (CSS Variables): :host — styl elementu. :host(:hover). ::slotted(span) — style slottowanej zawartości. CSS parts: part='button' -> ::part(button) do stylowania z zewnątrz. Interoperability: React 18 + Web Components — ograniczone. React 19 — pełne wsparcie dla Custom Events. Preact + Web Components — doskonałe.

    Lit — biblioteka do Web Components od Google?

    Lit (Google, 2021, poprzednik: LitElement/lit-html): lekka biblioteka do Web Components. Reactive properties. Templating z lit-html (tagged templates). ~5KB gzipped. TypeScript-first. Instalacja: npm install lit. Podstawowy komponent: import {LitElement, html, css} from 'lit'. import {customElement, property} from 'lit/decorators.js'. @customElement('my-card'). class MyCard extends LitElement {static styles = css .card {border: 1px solid #ccc; padding: 16px} (backtick). @property({type: String}) title = ''. @property({type: Number}) count = 0. render() {return html div class='card' h2 ${this.title} /h2 button @click=${this.increment} Count: ${this.count} /button /div (template literal notation)}}. Reactive updates: @property() -> automatyczny re-render. @state() — wewnętrzny stan (nie atrybut). Tasks: @lit/task — async data fetching. Lit Context: @lit/context — jak React Context dla Web Components. Lit Labs: lit/labs — eksperymentalne features. Shoelace (teraz Web Awesome): dojrzała biblioteka Web Components oparta na Lit. UI komponenty: sl-button, sl-input, sl-select, sl-dialog. Framework-agnostic. Używany z React, Vue, Angular, Vanilla. Open UI: inicjatywa standaryzacji UI. Stylable Select, Popover API, Anchor Positioning. Popover API: popover atrybut na elementach. button popovertarget='my-popover'. Natywne popovery bez JavaScript. Dostępne w wszystkich major browsers 2024.

    Web Components vs React/Vue — kiedy wybrać Web Components?

    Kiedy Web Components: design system dla wielu frameworków. Organizacja z wieloma tech stacks (React + Vue + Angular). Long-term stability (standard, nie biblioteka). Mikrofrontendy z różnymi frameworkami. Browser native — zero dependencies. Widget embeddowany na zewnętrznych stronach. Kiedy React/Vue zamiast: complex state management. Ecosystem i biblioteki. Team doświadczenie. SEO (Web Components i SSR — trudniejsze). Szybki development. React + Web Components: React 18 — słabe event handling dla custom events. React 19 — naprawione: pełne wsparcie custom events i props. @lit-labs/react: ReactWebComponent(). Wrap Web Component jako React komponent. Preact + Web Components: Preact — doskonała kompatybilność z Web Components. Mały bundle (~3KB). Używany zamiast React w środowiskach z WC. Stencil.js: kompilator do Web Components. Pisze się jak React (JSX, props, state). Kompiluje do natywnych Custom Elements. Ionic Framework oparty na Stencil. Angular Elements: Angular komponenty -> Web Components. @angular/elements. Dobra integracja z Angular ekosystemem. Custom Event pattern (zamiast callback props): this.dispatchEvent(new CustomEvent('my-event', {detail: {value: this.value}, bubbles: true, composed: true})). composed: true — przechodzi przez Shadow DOM boundary. Web Components w React (workaround): useRef + addEventListener zamiast onMyEvent prop. React 19 eliminuje ten problem.

    Micro-frontends z Web Components i Module Federation?

    Micro-frontends: podział dużego frontend na niezależne aplikacje. Każdy team ma własny tech stack. Niezależne deploymenty. Integracja w runtime. Podejścia: iframe — najprostsze ale ograniczone. Web Components — standard, framework-agnostic. Module Federation (Webpack 5) — JavaScript modules sharing. Single SPA — orchestration framework. Web Components jako micro-frontends: każdy micro-frontend eksponuje Web Component. Host page ładuje zdalny bundle. Rejestruje custom element. Używa w HTML. Module Federation (Webpack 5): exposes — eksponuj moduły. remotes — ładuj z innych app. Shared — dziel React, lodash bez duplikacji. Dynamic import: const RemoteApp = React.lazy(() => import('remote/App')). @module-federation/enhanced: ulepszone MF. Runtime plugins. Vite: vite-plugin-federation. Single SPA: registerApplication(). mountRootParcel(). Routing między micro-frontends. Framework-agnostic loader. Native Federation: ES Modules bez Webpack. @angular-architects/native-federation. Oparty na importmaps. Problem współdzielenia stanu: Custom Events między WC. BroadcastChannel API. Shared store (Zustand singleton). URL jako shared state. Wyzwania: CSS isolation — Shadow DOM lub CSS Modules. Auth — shared token, single SSO. Performance — wiele bundle requests. Versioning — shared libraries. Design System — Web Components jako standard. Kiedy micro-frontends: duże organizacje, wiele teams. Kiedy NIE: małe projekty, jeden team.

    Declarative Shadow DOM i SSR dla Web Components?

    Problem SSR z Web Components: Shadow DOM tworzony przez JavaScript. Server nie może renderować Shadow DOM. Brak hydration mechanism. Declarative Shadow DOM (DSD): shadowrootmode='open' atrybut na template. template shadowrootmode='open' — Shadow DOM bez JS. Obsługiwany natywnie: Chrome, Edge, Safari (od 2023). Firefox: planowany. Polyfill: @webcomponents/template-shadowroot. Lit SSR (@lit-labs/ssr): renderowanie Lit Web Components na serwerze. render(html my-element, createEmptyDomImplementation()). Generuje Declarative Shadow DOM. Hydration po stronie klienta: LitElement.enableUpdatingWithoutShadow(). Albo standard LitElement hydration. Gatsby + Web Components: gatsby-plugin-lit. Prerender z Lit SSR. Astro + Web Components: Astro doskonały dla Web Components. server:true — Server Components. client:load — hydrate po stronie klienta. client:idle, client:visible — lazy hydration. Web Components w Astro: import 'my-component/define'. Używaj normalnie. Astro automatycznie bundluje. Framework-agnostic: Web Components działają w Astro z React, Vue, Svelte, Solid, Angular. Interoperability test: custom-elements-everywhere.com. Score dla każdego frameworka. React 18: 70%. React 19: 100%. Preact: 100%. Vue: 100%. Angular: 99%. Svelte: 100%. Solid: 100%. Custom Elements Manifest: schema dla dokumentacji i tooling. @custom-elements-manifest/analyzer. IDE support (VSCode extension). Storybook 8 + Web Components: Storybook wspiera natywnie WC. argTypes, args dla @property. Controls panel.

    Czytaj dalej

    Powiązane artykuły

    Kontakt

    Skontaktuj się z nami

    Porozmawiajmy o Twoim projekcie. Bezpłatna wycena w ciągu 24 godzin.

    Wyślij zapytanie

    Bezpłatna wycena w 24h
    Bez zobowiązań
    Indywidualne podejście
    Ekspresowa realizacja

    Telefon

    +48 790 814 814

    Pon-Pt: 9:00 - 18:00

    Email

    adam@fotz.pl

    Odpowiadamy w ciągu 24h

    Adres

    Plac Wolności 16

    61-739 Poznań

    Godziny pracy

    Pon - Pt9:00 - 18:00
    Sob - NdzZamknięte

    Wolisz porozmawiać?

    Zadzwoń teraz i porozmawiaj z naszym specjalistą o Twoim projekcie.

    Zadzwoń teraz