
Foto de NeONBRAND
Componentes web es el nombre comĂșn de un conjunto de tecnologĂas diseñadas para ayudar a los desarrolladores web a crear bloques reutilizables. El enfoque de componentes para crear interfaces estĂĄ bien establecido en los marcos de front-end, y parece una buena idea integrar esta funcionalidad de forma nativa en los navegadores. El soporte para esta tecnologĂa por parte de los navegadores ya ha alcanzado un nivel suficiente para que pueda pensar seriamente en usar esta tecnologĂa para sus proyectos de trabajo.
En este artĂculo, veremos las caracterĂsticas del uso de componentes web, de los cuales, por alguna razĂłn, los evangelistas de estas tecnologĂas no hablan.
¿Qué son los componentes web?
Primero debe decidir quĂ© se incluye exactamente en el concepto de componentes web. Una buena descripciĂłn de la tecnologĂa estĂĄ en MDN. Si es muy breve, generalmente en este concepto se incluyen las siguientes caracterĂsticas:
- Elementos personalizados : la capacidad de registrar sus etiquetas html con un comportamiento especĂfico
- Shadow DOM - Crear contexto aislado CSS
- Ranuras : la capacidad de combinar contenido html externo con el componente html interno
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 - , - . - - . , .
. .