
Foto von NeONBRAND
Webkomponenten ist der gebräuchliche Name für eine Reihe von Technologien, mit denen Webentwickler wiederverwendbare Blöcke erstellen können. Der komponentenbasierte Ansatz zum Erstellen von Schnittstellen ist in Front-End-Frameworks gut etabliert, und es scheint eine gute Idee zu sein, diese Funktionalität nativ in Browser zu integrieren. Die Unterstützung dieser Technologie durch Browser hat bereits ein ausreichendes Niveau erreicht, sodass Sie ernsthaft darüber nachdenken können, diese Technologie für Ihre Arbeitsprojekte zu verwenden.
In diesem Artikel werden wir uns mit den Funktionen der Verwendung von Webkomponenten befassen, über die die Evangelisten dieser Technologien aus irgendeinem Grund nicht sprechen.
Was sind Webkomponenten?
Zunächst müssen Sie entscheiden, was genau im Konzept der Webkomponenten enthalten ist. Eine gute Beschreibung der Technologie finden Sie auf MDN. Wenn sehr kurz, dann umfassen in diesem Konzept normalerweise die folgenden Merkmale:
- Benutzerdefinierte Elemente - Die Möglichkeit, Ihre HTML-Tags mit einem bestimmten Verhalten zu registrieren
- Shadow DOM - CSS-isolierten Kontext erstellen
- Slots - Die Möglichkeit, externen HTML-Inhalt mit der internen HTML-Komponente zu kombinieren
hello-world
, :
// - html-
class HelloWorld extends HTMLElement {
constructor() {
super();
// Shadow DOM
this.attachShadow({ mode: "open" });
}
connectedCallback() {
const name = this.getAttribute("name");
// Shadow DOM
this.shadowRoot.innerHTML = `Hello, <strong>${name}</strong> :)`;
}
}
// html-
window.customElements.define("hello-world", HelloWorld);
, , <hello-world name="%username%"></hello-world>
, . !
.
, - , . , . html- Vue React , , . DOM – , html, DOM–, . , .
, , - Shadow DOM. , – ! , , ..
, -, , lit-element. -, lit-html DOM , . , API.
- Javascript. lit-element, - 6 , preact, , React, 2 , 3 . , - .
Shadow DOM
html- CSS, . Shadow DOM. CSS. , , . , - , , Shadow DOM. Shadow DOM this.attachShadow()
, Shadow DOM , <style></style>
<link rel="stylesheet">
.
, CSS, . , . Shadow DOM 30, Shadow DOM 50. , , - <my-list items="myItems">
<my-item item="item">
.
, , CSS-, , , CSS.
- customElements.define
. , , - my-button
, . , , , , , , . , , CSS-, -.
Tree-shaking
– . , React
import { Button } from "./button";
//...
render() {
return <Button>Click me!</Button>
}
Button. , . - , html-, . lit-element :
import '@polymer/paper-button/paper-button.js';
// ...
render() {
return html`<paper-button>Click me!</paper-button>`;
}
. , - , . , - .
tree-shaking , . , , , :
import { Button, Icon } from './components';
//...
render() {
return <Button>Click me!</Button>
}
Icon . - , . 2010 , jquery-.
Javascript , . , Typescript Flow. React, :
class Button extends Component<{ text: string }> {}
<Button /> // : text
<Button text="Click me" action="test" /> // : action
<Button text="Click me" /> // ,
- . , - , Typescript -. JSX.IntrinsicElements
– , Typescript .
namespace JSX {
interface IntrinsicElements {
'paper-button': {
raised: boolean;
disabled: boolean;
children: string
}
}
}
Typescript -, . , JSX . , querySelector
. :
const component = document.querySelector('paper-button') as PaperButton;
, , Typescript -, - .
, <input>
<button>
, . , , , . .
// DOM
const component = document.querySelector("users-list");
//
component.items = myData;
, :
class UsersList extends HTMLElement {
set items(items) {
//
this.__items = items;
//
this.__render();
}
}
lit-element – property:
class UsersList extends HTMLElement {
@property()
users: User[];
}
, , :
const component = document.querySelector("users-list");
component.expanded = true;
component.items = myData;
component.selectedIndex = 3;
, , . , - . , . lit-element , , , - setTimeout(() => this.__render(), 0)
. , , :
component.items = [{ id: 1, name: "test" }];
// ,
// expect(component.querySelectorAll(".item")).toHaveLength(1);
await delay(); //
expect(component.querySelectorAll(".item")).toHaveLength(1);
, - .
, - . , :
- - . Github. - open-source . , , - .
- -. , , - . CSS . iframe, - Shadow DOM, .
, - :
- UI- , tree-shaking , . UI- (, ..) , (React, Vue .) .
- - . , -
<my-app />
SPA-. Javascript, - . Angular/React/Vue - , - . - - . , .
. .