
рдирд┐рдпреЛрдирдмреНрд░реИрдВрдб рджреНрд╡рд╛рд░рд╛ рдлреЛрдЯреЛ
рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдмреНрд▓реЙрдХ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рддрдХрдиреАрдХреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рд╡реЗрдм рдШрдЯрдХ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирд╛рдо рд╣реИред рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдлреНрд░рдВрдЯ-рдПрдВрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рдФрд░ рдпрд╣ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рддрдХрдиреАрдХ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрддрд░ рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд╕реЛрдЪ рд╕рдХреЗрдВред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ, рдЬреЛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрди рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдЪрд╛рд░рдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рд╡реЗрдм рдШрдЯрдХ рдХреНрдпрд╛ рд╣реИрдВ
рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рддрдХрдиреАрдХ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд░реНрдгрди рдПрдордбреАрдПрди рдкрд░ рд╣реИред рдпрджрд┐ рдмрд╣реБрдд рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рддреЛ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рдХрд╕реНрдЯрдо рддрддреНрд╡ - рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ HTML рдЯреИрдЧ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
- рд╢реИрдбреЛ рдбреЛрдо - рд╕реАрдПрд╕рдПрд╕ рдкреГрдердХ рд╕рдВрджрд░реНрдн рдмрдирд╛рдПрдБ
- рд╕реНрд▓реЙрдЯреНрд╕ - рдЖрдВрддрд░рд┐рдХ HTML рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░реА HTML рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
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 - , - . - - . , .
. .