ããæç¹ã§ãç§ã¯ç·æ¥ã«Webã³ã³ããŒãã³ãã«ç²Ÿéãããããã䜿çšããŠäŸ¿å©ã«éçºããæ¹æ³ãèŠã€ããªããã°ãªããŸããã§ããã 次ã®ãããªäžé£ã®èšäºãæžãäºå®ã§ã
äœããã®åœ¢ã§Webã³ã³ããŒãã³ãã®ç¥èãæŽçããèŠçŽ ãæããããä»ã®äººã®ããã«ãã®æè¡ã®ç°¡åãªçŽ¹ä»ãããŸãã ç§ã¯ãã®æè¡ã®å°é家ã§ã¯ãããŸããã®ã§ããã£ãŒãããã¯ãåãã§åãå
¥ããŸãã
lit-elementã¯ããã€ãã£ãWebã³ã³ããŒãã³ãã®ã©ãããŒïŒåºæ¬ãã³ãã¬ãŒãïŒã§ãã ä»æ§ã«ãªãå€ãã®äŸ¿å©ãªã¡ãœãããå®è£ ããŠããŸãã ãã€ãã£ãå®è£ ã«è¿ããããlit-elementã¯ä»ã®ã¢ãããŒããšæ¯èŒããŠããŸããŸãªãã³ãããŒã¯ã§éåžžã«è¯ãçµæã瀺ããŠããŸãïŒ2019幎2æ6æ¥çŸåšïŒã
lit-elementãWebã³ã³ããŒãã³ãã®åºæ¬ã¯ã©ã¹ãšããŠäœ¿çšããããšã§åŸãããããŒãã¹ïŒ
- ãã®æè¡ã¯ãã§ã«ç¬¬2ã®ããŒãžã§ã³ãå®è£ ããŠããããå°å ç ã§ç æ°ã«ãªã£ããããšããããŸãããããã¯ç»å Žããã°ããã®åšå ·ã«ç¹æã®ãã®ã§ãã
- ã¢ã»ã³ããªã¯ãããªããŒãšãŠã§ãããã¯ãã¿ã€ãã¹ã¯ãªãããããŒã«ã¢ãããªã©ã®äž¡æ¹ã§å®è¡ã§ããŸããããã«ãããåé¡ãªãææ°ã®ãããžã§ã¯ãã«ç §æèŠçŽ ãåã蟌ãããšãã§ããŸãã
- litèŠçŽ ã«ã¯ãå€ã®å ¥åãéå§ãå€æã«é¢ããŠããããã£ãæäœããéåžžã«äŸ¿å©ãªã·ã¹ãã ããããŸãã
- lit-elementã¯ãreactãšã»ãŒåãããžãã¯ãå®è£ ããŠããŸãã ã³ã³ããŒãã³ããšãã®ã¬ã³ããªã³ã°ãæ§ç¯ããããã®åäžã®ãã³ãã¬ãŒããæäŸããéçºè ããšã³ã·ã¹ãã ãšè¿œå ã®ã©ã€ãã©ãªãéžæããããšãå¶éããŸããã
lit-elementã§ç°¡åãªWebã³ã³ããŒãã³ããäœæããŸãããã ããã¥ã¡ã³ããèŠãŠã¿ãŸãããã 次ã®ãã®ãå¿ èŠã§ãã
- lit-elementãå«ãnpmããã±ãŒãžãã¢ã»ã³ããªã«è¿œå ããŸã
npm install --save lit-element
- ã³ã³ããŒãã³ããäœæããŸãã
ããšãã°ã my-component
ã¿ã°ã§åæåãããWebã³ã³ããŒãã³ããäœæããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãjsãã¡ã€ã«my-component.js
ãäœæãããã®åºæ¬ãã³ãã¬ãŒããå®çŸ©ããŸãã
// lit-element import { } from ''; // class MyComponent { } // customElements.define();
ãŸããåºæ¬ãã³ãã¬ãŒããã€ã³ããŒãããŸãã
import { LitElement, html } from 'lit-element'; // LitElement - () - // html - lit-html, , // html
次ã«ã LitElement
ã䜿çšããŠWebã³ã³ããŒãã³ãèªäœãäœæããŸã
// , // LitElement HTMLElement class MyComponent extends LitElement { // LitElement // constructor connectedCallback // // , // shadowDOM {mode: 'open'} render() { return html`<p>Hello World!</p>` } }
æåŸã«ããã©ãŠã¶ã«Webã³ã³ããŒãã³ããç»é²ããŸã
customElements.define('my-component', MyComponent);
ãã®çµæã次ã®çµæãåŸãããŸãã
import { LitElement, html } from 'lit-element'; class MyComponent extends LitElement { render() { return html`<p>Hello World!</p>` } } customElements.define('my-component', MyComponent);
my-component.js
ãhtmlã«æ¥ç¶ããå¿
èŠããªãå Žåã¯ãããã ãã§ãã æãåçŽãªã³ã³ããŒãã³ããçšæãããŠããŸãã
è»èŒªãåçºæãããlit-element-build-rollupã®å®æããã¢ã»ã³ããªãååŸããããšãææ¡ããŸãã æ瀺ã«åŸã£ãŠãã ããïŒ
git clone https://github.com/PolymerLabs/lit-element-build-rollup.git cd lit-element-build-rollup npm install npm run build npm run start
ãã¹ãŠã®ã³ãã³ããå®äºãããããã©ãŠã¶ãŒã®ããŒãžhttpïŒ// localhostïŒ5000 /ã«ç§»åããŸãã
htmlãèŠããšã webcomponents-loader.jsãçµäºã¿ã°ã®åã«ããããšãããããŸãã ããã¯ãWebã³ã³ããŒãã³ãçšã®ããªãã£ã«ã®ã»ããã§ãããWebã³ã³ããŒãã³ãã®ã¯ãã¹ãã©ãŠã¶æäœã®ããã«ããã®ããªãã£ã«ãååšããããšãæãŸããã§ãã Webã³ã³ããŒãã³ããæäœããããã®ãã¹ãŠã®æšæºãå®è£ ãããã©ãŠã¶ãŒã®è¡šãèŠãŠã¿ãŸããããEDGEã¯ãŸã æšæºãå®å šã«ã¯å®è£ ããŠããªããšèšããŸãïŒãµããŒããå¿ èŠãªIE11ã«ã€ããŠã¯é»ã£ãŠããŸãïŒã

ãã®ããªãã£ã«ã«2ã€ã®ãªãã·ã§ã³ãå®è£ ããŸããïŒ
- webcomponents-bundle.js-ãã®ããŒãžã§ã³ã«ã¯ããªãã£ã«ã®ãã¹ãŠã®å¯èœãªãªãã·ã§ã³ãå«ãŸããŠããããã¹ãŠéå§ãããŸãããåããªãã£ã«ã¯æ€åºãããå åã«åºã¥ããŠã®ã¿æ©èœããŸãã
- webcomponents-loader.jsã¯ãæ€åºãããçç¶ã«åºã¥ããŠãå¿ èŠãªããªãã£ã«ãããŒãããæå°éã®ããŒãããŒããŒã§ã
ãŸããå¥ã®polyfill- custom-elements-es5-adapter.jsã«ã泚æããŠãã ããã ä»æ§ã«ããã°ããã€ãã£ãcustomElements.defineã«è¿œå ã§ããã®ã¯ES6ã¯ã©ã¹ã®ã¿ã§ãã æé«ã®ããã©ãŒãã³ã¹ãåŸãã«ã¯ãES6ã³ãŒãããµããŒããããã©ãŠã¶ãŒã«ã®ã¿ES6ã³ãŒãã転éããä»ã®ãã¹ãŠã®ãŠãŒã¶ãŒã«ES5ã³ãŒãã転éããå¿ èŠããããŸãã ãããåžžã«å¯èœã§ãããšã¯éããªãããããã©ãŠã¶ãŒéã®äºææ§ãé«ããããã«ããã¹ãŠã®ES6ã³ãŒããES5ã«å€æããããšããå§ãããŸãã ãã ãããã®å ŽåãES5ã®Webã³ã³ããŒãã³ãã¯ãã©ãŠã¶ãŒã§åäœã§ããŸããã ãã®åé¡ã解決ããããã«ãcustom-elements-es5-adapter.jsããããŸãã
./src/my-element.js
ãã¡ã€ã«ãéããŸããã
import {html, LitElement, property} from 'lit-element'; class MyElement extends LitElement { // @property - , babel ts // // , @property({type: String}) myProp = 'stuff'; render() { return html` <p>Hello World</p> ${this.myProp} `; } } customElements.define('my-element', MyElement);
lit-htmlãã³ãã¬ãŒããšã³ãžã³ã¯ãæååãç°ãªãæ¹æ³ã§åŠçã§ããŸãã ããã€ãã®ãªãã·ã§ã³ã玹ä»ããŸãã
// : html`<div>Hi</div>` // : html`<div>${this.disabled ? 'Off' : 'On'}</div>` // : html`<x-foo .bar="${this.bar}"></x-foo>` // : html`<div class="${this.color} special"></div>` // boolean, checked === false, // HTML: html`<input type="checkbox" ?checked=${checked}>` // : html`<button @click="${this._clickHandler}"></button>`
renderïŒïŒé¢æ°ãæé©åããããã®ãã³ãïŒ
- èŠçŽ ã®ç¶æ ãå€æŽããŠã¯ãããŸãã
- å¯äœçšããã£ãŠã¯ãããŸããã
- èŠçŽ ã®ããããã£ã®ã¿ã«äŸåããå¿ èŠããããŸãã
- åãå€ãéä¿¡ããå Žåãåãçµæãè¿ãå¿ èŠããããŸãã
renderïŒïŒé¢æ°ã®å€éšã§DOMãæŽæ°ããªãã§ãã ããã
Lit-htmlã¯lit-elementã®ã¬ã³ããªã³ã°ãæ åœããŸã-ããã¯ãWebã³ã³ããŒãã³ãã®è¡šç€ºæ¹æ³ãèšè¿°ãã宣èšçãªæ¹æ³ã§ãã lit-htmlã¯ãå€æŽãå¿ èŠãªDOMã®éšåã®ã¿ãå€æŽããããšã«ãããé«éæŽæ°ãä¿èšŒããŸãã
ãã®ã³ãŒãã®ã»ãšãã©ã¯ç°¡åãªäŸã§ããã myProp
ããããã£ã«@property
ãã³ã¬ãŒã¿ãè¿œå ãããŸããã ãã®ãã³ã¬ãŒã¿ã¯ã my-element
myprop
ãšããååã®å±æ§ãå¿
èŠã§ããããšã瀺ããŠããŸãã ãã®ãããªå±æ§ãèšå®ãããŠããªãå Žåãããã©ã«ãã§æååå€stuff
èšå®ãããŸãã
<!-- myProp , - 'stuff' --> <my-element></my-element> <!-- myprop lowerCamelCase .. myProp - 'else' --> <my-element myprop="else"></my-element>
lit-elementã¯ã property
ãæäœãã2ã€ã®æ¹æ³ãæäŸãproperty
ã
- ãã³ã¬ãŒã¿ãéããŠã
- éçãªã²ãã¿ãŒ
properties
ä»ããŠã
æåã®ãªãã·ã§ã³ã§ã¯ãåããããã£ãåå¥ã«æå®ã§ããŸãã
@property({type: String}) prop1 = ''; @property({type: Number}) prop2 = 0; @property({type: Boolean}) prop3 = false; @property({type: Array}) prop4 = []; @property({type: Object}) prop5 = {};
2çªç®ã¯ãã¹ãŠã1ãæã§æå®ããããšã§ããããã®å Žåãããããã£ã«ããã©ã«ãå€ãããå Žåã¯ãã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã¡ãœããã§èšè¿°ããå¿ èŠããããŸãã
static get properties() { return { prop1: {type: String}, prop2: {type: Number}, prop3: {type: Boolean}, prop4: {type: Array}, prop5: {type: Object} }; } constructor() { this.prop1 = ''; this.prop2 = 0; this.prop3 = false; this.prop4 = []; this.prop5 = {}; }
lit-elementã§ããããã£ãæäœããããã®APIã¯éåžžã«åºç¯å²ã§ãïŒ
- å±æ§ ïŒããããã£ãç£èŠå¯èœãªå±æ§ã«ãªãããšãã§ãããã©ããã
false
å Žåãå±æ§ã¯ç£èŠããé€å€ãããã²ãã¿ãŒã¯äœæãããŸãããtrue
ãŸãã¯attribute
ååšããªãå Žåãgetterã§lowerCamelCase圢åŒã§æå®ãããããããã£ã¯ãæåå圢åŒã®å±æ§ã«å¯Ÿå¿ããŸããmy-prop
ãªã©ã®æååãæå®ãããŠããå Žåãå±æ§å ã®åãååã«å¯Ÿå¿ããŸãã - converter ïŒå€ã/ããå±æ§/ããããã£ã«å€æããæ¹æ³ã®èª¬æãå«ãŸããŠããŸãã å€ã¯ãå€ãã·ãªã¢ã«åããã³éã·ãªã¢ã«åããããã«æ©èœããé¢æ°ã«ããããšãã
fromAttribute
ããã³toAttribute
ããŒãæã€ãªããžã§ã¯ãã«ããããšãã§ããŸãããããã®ããŒã«ã¯ãå€ãå€æããããã®åå¥ã®é¢æ°ãå«ãŸããŸãã ããã©ã«ãã§ã¯ãããããã£ã«ã¯åºæ¬ã¿ã€ãBoolean
ãString
ãNumber
ãObject
ããã³Array
ãžã®å€æãå«ãŸããŠããŸãã å€æèŠåã¯ããã«ãªã¹ããããŠããŸã ã - type ïŒãã®ããããã£ã«å«ãŸããåºæ¬ã¿ã€ãã®1ã€ã瀺ããŸãã ããããã£ã«å«ãŸããã¿ã€ãã«é¢ããã³ã³ããŒã¿ãŒã®ããã³ãããšããŠäœ¿çšãããŸãã
- åæ ãã ïŒå±æ§ãããããã£ã«é¢é£ä»ãïŒ
true
ïŒãtype
ããã³converter
ããã®èŠåã«åŸã£ãŠå€æŽããå¿ èŠããããã©ããã瀺ããŸãã - hasChanged ïŒåããããã£ã¯ãããæã¡ãå€ãå€ãšæ°ããå€ã®éã«å€åããããã©ããã決å®ããé¢æ°ãå«ã¿ããããã
Boolean
è¿ããŸããtrue
å Žåãã¢ã€ãã ã®æŽæ°ãéå§ããŸãã - noAccessor ïŒãã®ããããã£ã¯
Boolean
ãåãå ¥ããããã©ã«ãã¯false
ã§ãã ã¯ã©ã¹ããã¢ã¯ã»ã¹ããããã®åããããã£ã®ã²ãã¿ãŒãšã»ãã¿ãŒã®çæãçŠæ¢ããŸãã ããã¯å€æããã£ã³ã»ã«ããŸããã
æ¶ç©ºã®äŸãäœæããŸããããæååãå«ããã©ã¡ãŒã¿ãŒãå«ãWebã³ã³ããŒãã³ããäœæããŸãããã®åèªã¯ç»é¢ã«æç»ãããå¿
èŠããããåæåã¯åã®æåããã倧ãããªããŸãã
<!-- index.html --> <ladder-of-letters letters=""></ladder-of-letters>
//ladder-of-letters.js import {html, LitElement, property} from 'lit-element'; class LadderOfLetters extends LitElement { @property({ type: Array, converter: { fromAttribute: (val) => { // console.log('in fromAttribute', val); return val.split(''); } }, hasChanged: (value, oldValue) => { if(value === undefined || oldValue === undefined) { return false; } // console.log('in hasChanged', value, oldValue.join('')); return value !== oldValue; }, reflect: true }) letters = []; changeLetter() { this.letters = ['','','','','']; } render() { // console.log('in render', this.letters); // , // return html` <div>${this.letters.map((i, idx) => html`<span style="font-size: ${idx + 2}em">${i}</span>`)}</div> // @click , // 'click' <button @click=${this.changeLetter}> ''</button> `; } } customElements.define('ladder-of-letters', LadderOfLetters);
æçµçã«ã¯æ¬¡ã®ããã«ãªããŸãã

ãã¿ã³ãæŒããããšãããããã£ãå€æŽãããæåã«ãã§ãã¯ãè¡ããããã®åŸåæç»ã®ããã«éä¿¡ãããŸããã

reflect
ã䜿çšãããšãHTMLã®å€æŽã確èªã§ããŸã

ãã®Webã³ã³ããŒãã³ãã®å€éšã®ã³ãŒãã§ãã®å±æ§ãå€æŽãããšãWebã³ã³ããŒãã³ããåæç»ãããŸãã
次ã«ãã³ã³ããŒãã³ãã®ã¹ã¿ã€ã«ãæ€èšããŸãã lit-elementã®ã¹ã¿ã€ã«èšå®ã«ã¯2ã€ã®æ¹æ³ããããŸãã
- ã¹ã¿ã€ã«ã¿ã°ãrenderã¡ãœããã«è¿œå ããŠã¹ã¿ã€ãªã³ã°
render() { return html` <style> p { color: green; } </style> <p>Hello World</p> `; }
- éçã²ãã¿ãŒ
styles
çµç±
import {html, LitElement, css} from 'lit-element'; class MyElement extends LitElement { static get styles() { return [ css` p { color: red; } ` ]; } render() { return html` <p>Hello World</p> `; } } customElements.define('my-element', MyElement);
ãã®çµæãã¹ã¿ã€ã«ãæã€ã¿ã°ã¯äœæãããã ä»æ§ã«åŸã£ãŠèŠçŽ ã®Shadow DOM
æžã蟌ãŸããŸãïŒ >= Chrome 73
ïŒã ããã«ãããå€æ°ã®èŠçŽ ã®ããã©ãŒãã³ã¹ãåäžããŸãã æ°ããã³ã³ããŒãã³ããç»é²ãããšãã圌ã¯æ¢ã«èªåã®ã¹ã¿ã€ã«ã決å®ããããããã£ãç¥ã£ãŠããã®ã§ãæ¯åç»é²ããŠåã«ãŠã³ãããå¿
èŠã¯ãããŸããã

åæã«ããã®ä»æ§ããµããŒããããŠããªãå Žåãéåžžã®style
ã¿ã°ãã³ã³ããŒãã³ãã«äœæãããŸãã

ããã«ããã®æ¹æ³ã§ãããŒãžã«è¿œå ããã³èšç®ãããã¹ã¿ã€ã«ãåé¢ã§ããããšãå¿ããªãã§ãã ããã ããšãã°ãCSSã§ã¯ãªãJSã§ã¡ãã£ã¢ã¯ãšãªã䜿çšããããšãã°ãç®çã®ã¹ã¿ã€ã«ã®ã¿ãå®è£ ããã«ã¯ïŒããã¯ã¯ã€ã«ãã§ãããããããå¿ èŠããããŸãïŒïŒ
static get styles() { const mobileStyle = css`p { color: red; }`; const desktopStyle = css`p { color: green; }`; return [ window.matchMedia("(min-width: 400px)").matches ? desktopStyle : mobileStyle ]; }
ãããã£ãŠããŠãŒã¶ãŒãç»é¢å¹ ã400pxãè¶ ããããã€ã¹ã«ãã°ãªã³ããå Žåãããã衚瀺ãããŸãã

ããã¯ããŠãŒã¶ãŒãå¹ 400ãã¯ã»ã«æªæºã®ããã€ã¹ãããµã€ãã«ã¢ã¯ã»ã¹ããå Žåã§ãã

ç§ã®æèŠïŒãŠãŒã¶ãŒãã¢ãã€ã«ããã€ã¹ã§äœæ¥ããŠãããšãã«ãç»é¢å¹ ã1920pxã®æ¬æ Œçãªã¢ãã¿ãŒã«çªç¶çŽé¢ããå Žåãå®éã«é©åãªã±ãŒã¹ã¯ãããŸããã ããã«ã³ã³ããŒãã³ãã®é 延èªã¿èŸŒã¿ãè¿œå ããŸãã ãã®çµæãé«éã³ã³ããŒãã³ãã¬ã³ããªã³ã°ã§éåžžã«æé©åãããããã³ããåŸãããŸãã å¯äžã®åé¡ã¯ããµããŒãã®é£ããã§ãã
ããã§ãlit-elementã®ã©ã€ããµã€ã¯ã«ã¡ãœããã«ç²Ÿéããããšãææ¡ããŸãã
- renderïŒïŒ ïŒ
lit-html
ã䜿çšããŠDOMèŠçŽ ã®èª¬æãå®è£ ããŸãã çæ³çã«ã¯ãrender
é¢æ°ã¯ãèŠçŽ ã®çŸåšã®ããããã£ã®ã¿ã䜿çšããçŽç²ãªé¢æ°ã§ããrender()
ã¡ãœããã¯ãupdate()
é¢æ°ã«ãã£ãŠåŒã³åºãããŸãã - shouldUpdateïŒchangedPropertiesïŒ ïŒæŽæ°ããã³ã¬ã³ããªã³ã°ãå¶åŸ¡ããå¿
èŠãããå Žåãããããã£ãå€æŽããããšãããŸãã¯
requestUpdate()
åŒã³åºããããšãã«å®è£requestUpdate()
ããŸããchangedProperties
é¢æ°ã®åŒæ°ã¯ãå€æŽãããããããã£ã®ããŒãå«ãMap
ã§ãã ããã©ã«ãã§ã¯ããã®ã¡ãœããã¯åžžã«true
ãè¿ãtrue
ããã¡ãœããã®ããžãã¯ãå€æŽããŠã³ã³ããŒãã³ãã®æŽæ°ãå¶åŸ¡ã§ããŸãã - performUpdateïŒïŒ ïŒã¹ã±ãžã¥ãŒã©ãŒãšçµ±åãããªã©ãæŽæ°æéãå¶åŸ¡ããããã«å®è£ ãããŠããŸãã
- updateïŒchangedPropertiesïŒ ïŒãã®ã¡ãœããã¯
render()
åŒã³åºãrender()
ã ãŸããããããã£ã®å€ã«åŸã£ãŠèŠçŽ ã®å±æ§ãæŽæ°ããŸãã ãã®ã¡ãœããå ã§ããããã£ãèšå®ããŠããå¥ã®æŽæ°ã¯çºçããŸããã - firstUpdatedïŒchangedPropertiesïŒ ïŒDOMèŠçŽ ã®æåã®æŽæ°åŸã«ã
updated()
åŒã³åºãã®çŽåã«åŒã³åºãããŸãã ãã®ã¡ãœããã¯ãããšãã°updated()
ã§çŽæ¥äœæ¥ããå¿ èŠãããèŠèŠåãããéçããŒããžã®ãªã³ã¯ããã£ããã£ããã®ã«åœ¹ç«ã¡ãŸãã - updatedïŒchangedPropertiesïŒ ïŒã¢ã€ãã ã®DOMãæŽæ°ããã³è¡šç€ºããããã³ã«åŒã³åºãããŸãã DOM APIãä»ããŠæŽæ°ããåŸã«ã¿ã¹ã¯ãå®è¡ããããã®å®è£ ãããšãã°ãèŠçŽ ã«çŠç¹ãåãããŸãã
- requestUpdateïŒnameãoldValueïŒ ïŒã¢ã€ãã ã®éåææŽæ°ãªã¯ãšã¹ããåŒã³åºããŸãã ããã¯ãããããã£ã®èšå®ãåå ã§ã¯ãªãäœããã®ç¶æ ã«åºã¥ããŠã¢ã€ãã ãæŽæ°ããå¿ èŠããããšãã«åŒã³åºãå¿ èŠããããŸãã
- createRenderRootïŒïŒ ïŒããã©ã«ãã§ã¯ãã¢ã€ãã ã®ã·ã£ããŠã«ãŒããäœæããŸãã Shadow DOMã䜿çšããå¿
èŠããªãå Žåãã¡ãœããã¯
this
ãè¿ãå¿ èŠããããŸãã
ã¢ã€ãã ã®æŽæ°æ¹æ³ïŒ
- ããããã£ã«ã¯æ°ããå€ãäžããããŸãã
-
hasChanged(value, oldValue)
ãfalse
å Žåãã¢ã€ãã ã¯æŽæ°ãããŸããã ãã以å€ã®å ŽåãrequestUpdate()
åŒã³åºããŠæŽæ°ãèšç»ããŸãã - requestUpdateïŒïŒ ïŒ ãã€ã¯ãã¿ã¹ã¯ã®åŸïŒã€ãã³ãã«ãŒãã®æåŸã§ã次ã®åæç»ã®åïŒã«èŠçŽ ãæŽæ°ããŸãã
- performUpdateïŒïŒ ïŒæŽæ°ãé²è¡äžã§ãããæ®ãã®æŽæ°APIãç¶ç¶ããŸãã
- shouldUpdateïŒchangedPropertiesïŒ ïŒ
true
è¿ãããå ŽåãæŽæ°ãç¶è¡ããtrue
ã - firstUpdatedïŒchangedPropertiesïŒ ïŒã¢ã€ãã ãåããŠæŽæ°ããããšãã
updated()
åŒã³åºãçŽåã«åŒã³åºãupdated()
ãŸãã - updateïŒchangedPropertiesïŒ ïŒã¢ã€ãã ãæŽæ°ããŸãã ãã®ã¡ãœããã§ããããã£ãå€æŽããŠããå¥ã®æŽæ°ã¯çºçããŸããã
- renderïŒïŒ ïŒDOMã®èŠçŽ ãã¬ã³ããªã³ã°ããããã®
lit-html
ãã³ãã¬ãŒããè¿ããŸãã ãã®ã¡ãœããã§ããããã£ãå€æŽããŠããå¥ã®æŽæ°ã¯çºçããŸããã
- renderïŒïŒ ïŒDOMã®èŠçŽ ãã¬ã³ããªã³ã°ããããã®
- updatedïŒchangedPropertiesïŒ ïŒã¢ã€ãã ãæŽæ°ããããã³ã«åŒã³åºãããŸãã
ã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ã®ãã¹ãŠã®ãã¥ã¢ã³ã¹ãç解ããã«ã¯ã ããã¥ã¡ã³ããåç §ããããšããå§ãããŸãã
ä»äºã§ã¯ãAdobe Experience ManagerïŒAEMïŒã®ãããžã§ã¯ãããããŸãããªãŒãµãªã³ã°ã§ã¯ããŠãŒã¶ãŒãã³ã³ããŒãã³ããããŒãžã«ãã©ãã°ã¢ã³ãããããã§ããŸããAEMã€ããªãã®ãŒã«ããã°ããã®ã³ã³ããŒãã³ãã«ã¯ããã®ã³ã³ããŒãã³ãã®ããžãã¯ãå®è£
ããããã«å¿
èŠãªãã¹ãŠãå«ãscript
ã¿ã°ãå«ãŸããŠããŸãã ãããå®éã«ã¯ããã®ã¢ãããŒãã¯å€ãã®ããããã³ã°ãªãœãŒã¹ãšãã®ã·ã¹ãã ã§ã®ããã³ãã®å®è£
ã«é¢ããå°é£ãåŒãèµ·ãããŸããã ããã³ããå®è£
ããããã«ãWebã³ã³ããŒãã³ãã¯ãµãŒããŒåŽã®ã¬ã³ããªã³ã°ãå€æŽããªãæ¹æ³ãšããŠéžæããïŒéåžžã«ããŸããããŸããïŒãå€ãå®è£
ãæ°ããã¢ãããŒãã§ãããåäœã§ç©ããã«åŒ·åããŸããã ç§ã®æèŠã§ã¯ããã®ã·ã¹ãã ã®Webã³ã³ããŒãã³ãã®ããŒããå®è£
ããããã®ããã€ãã®ãªãã·ã§ã³ããããŸãïŒãã³ãã«ãåéããïŒéåžžã«å€§ãããªãå¯èœæ§ããããŸãïŒãããã£ã³ã¯ã«åå²ããïŒå€ãã®å°ããªãã¡ã€ã«ãåçããŒããå¿
èŠã§ãïŒããŸãã¯ããããã«ã¹ã¯ãªãããåã蟌ãçŸåšã®ã¢ãããŒãã䜿çšããŸããµãŒããŒåŽã§ã¬ã³ããªã³ã°ãããã³ã³ããŒãã³ãïŒç§ã¯æ¬åœã«ããã«æ»ããããããŸããïŒã ç§ã®æèŠã§ã¯ãæåãš3çªç®ã®ãªãã·ã§ã³ã¯ãªãã·ã§ã³ã§ã¯ãããŸããã 第äºã«ãã¹ãã³ã·ã«ã®ããã«ãåçããŒãããŒããŒãå¿
èŠã§ãã ãããããããã¯ã¹ãå
ã®ç
§æèŠçŽ ã®å Žåãããã¯æäŸãããŸããã lit-elementéçºè
åŽã§ãã€ãããã¯ããŒãããŒããŒãäœæããããšããŸããããããã¯å®éšã§ãããå®çšŒåç°å¢ã§ã®äœ¿çšã¯æšå¥šãããŠããŸããã ãŸããlit-elementéçºè
ããã¯ãWebã³ã³ããŒãã³ãä»æ§ãªããžããªã«ãããŒãžäžã®htmlããŒã¯ã¢ããã«åºã¥ããŠWebã³ã³ããŒãã³ãã«å¿
èŠãªjsãåçã«ããŒãããæ©èœãä»æ§ã«è¿œå ããææ¡ããããŸãã ãããŠãç§ã®æèŠã§ã¯ããã®ãã€ãã£ãããŒã«ã¯ãWebã³ã³ããŒãã³ãã®åäžã®åæåãã€ã³ããäœæãããµã€ãã®ãã¹ãŠã®ããŒãžã«åçŽã«è¿œå ã§ããéåžžã«åªããã¢ã€ãã¢ã§ãã
PolymerLabsã®ã¹ã¿ãããç §æèŠçŽ ããŒã¹ã®Webã³ã³ããŒãã³ããåçã«èªã¿èŸŒãããã«ã åå²èŠçŽ ãéçºãããŸããã ããã¯å®éšçãªè§£æ±ºçã§ãã 次ã®ããã«æ©èœããŸãã
- SplitElementãäœæããã«ã¯ã2ã€ã®ã¢ãžã¥ãŒã«ã«2ã€ã®èŠçŽ å®çŸ©ãèšè¿°ããŸãã
- ãããã®1ã€ã¯ãèŠçŽ ã®èªã¿èŸŒãŸããéšåãå®çŸ©ãããã¹ã¿ããã§ããéåžžãããã¯ååãšããããã£ã§ãã ããããã£ã¯ãlit-elementãã¿ã€ã ãªãŒã«èŠ³å¯å¯èœãªå±æ§ãçæããŠ
customElements.define()
ãåŒã³åºãããšãã§ããããã«ãã¹ã¿ãã§å®çŸ©ããå¿ èŠããããŸãã - ã¹ã¿ãã«ã¯ãå®è£ ã¯ã©ã¹ãè¿ãéçéåæããŒãã¡ãœãããå¿ èŠã§ãã
- å¥ã®ã¯ã©ã¹ã¯ãå®è£ ãã§ãä»ã®ãã¹ãŠãå«ãŸããŸãã
-
SplitElement
ã³ã³ã¹ãã©ã¯ã¿ãŒã¯å®è£ ã¯ã©ã¹ãããŒãããupgrade()
ãå®è¡ãupgrade()
ã
ã¹ã¿ãã®äŸïŒ
import {SplitElement, property} from '../split-element.js'; export class MyElement extends SplitElement { // MyElement load // connectedCallback() static async load() { // // MyElement return (await import('./my-element-impl.js')).MyElementImpl; } // // - @property() message: string; } customElements.define('my-element', MyElement);
å®è£ äŸïŒ
import {MyElement} from './my-element.js'; import {html} from '../split-element.js'; // MyElementImpl render - export class MyElementImpl extends MyElement { render() { return html` <h1>I've been upgraded</h1> My message is ${this.message}. `; } }
ES6ã§ã®SplitElementã®äŸïŒ
import {LitElement, html} from 'lit-element'; export * from 'lit-element'; // LitElement SplitElement // export class SplitElement extends LitElement { static load; static _resolveLoaded; static _rejectLoaded; static _loadedPromise; static implClass; static loaded() { if (!this.hasOwnProperty('_loadedPromise')) { this._loadedPromise = new Promise((resolve, reject) => { this._resolveLoaded = resolve; this._rejectLoaded = reject; }); } return this._loadedPromise; } // - // static _upgrade(element, klass) { SplitElement._upgradingElement = element; Object.setPrototypeOf(element, klass.prototype); new klass(); SplitElement._upgradingElement = undefined; element.requestUpdate(); if (element.isConnected) { element.connectedCallback(); } } static _upgradingElement; constructor() { if (SplitElement._upgradingElement !== undefined) { return SplitElement._upgradingElement; } super(); const ctor = this.constructor; if (ctor.hasOwnProperty('implClass')) { // , ctor._upgrade(this, ctor.implClass); } else { // if (typeof ctor.load !== 'function') { throw new Error('A SplitElement must have a static `load` method'); } (async () => { ctor.implClass = await ctor.load(); ctor._upgrade(this, ctor.implClass); })(); } } // render() { return html``; } }
ããŒã«ã¢ããã§äžèšã®ã¢ã»ã³ããªã䜿çšããŠããå Žåã¯ãåçã€ã³ããŒããåŠçã§ããããã«babelãèšå®ããŠãã ãã
npm install @babel/plugin-syntax-dynamic-import
.babelrcèšå®ã§è¿œå
{ "plugins": ["@babel/plugin-syntax-dynamic-import"] }
ããã§ãé 延ããŒãã䜿çšããWebã³ã³ããŒãã³ãã®å®è£ ã®å°ããªäŸãäœæããŸãããhttps ïŒ //github.com/malay76a/elbrus-split-litelement-web-components
Webã³ã³ããŒãã³ãã®åçèªã¿èŸŒã¿ã®ã¢ãããŒããé©çšããããšããŸãããã次ã®çµè«ã«éããŸããïŒããŒã«ã¯éåžžã«æ©èœããŠãããããWebã³ã³ããŒãã³ãã®ãã¹ãŠã®å®çŸ©ã1ã€ã®ãã¡ã€ã«ã«åéããã³ã³ããŒãã³ãèªäœã®èª¬æãåå¥ã«ãã£ã³ã¯ã§æ¥ç¶ããå¿ èŠããããŸãã http2ããªããšããã®ã¢ãããŒãã¯æ©èœããŸããããªããªãã ã³ã³ããŒãã³ããèšè¿°ããå°ããªãã¡ã€ã«ã®éåžžã«å€§ããªããŒã«ã圢æãããŸãã ååèšèšã®ååã«åºã¥ããŠã ååã®ã€ã³ããŒãã¯ããã£ã§æ±ºå®ããå¿ èŠããããŸãããããã£ã¯å¥ã®ã³ã³ããŒãã³ããšããŠæ¢ã«æ¥ç¶ãããŠããŸãã ããã«ããã¯ã®1ã€ã¯ããŠãŒã¶ãŒããã©ãŠã¶ãŒã§ãŠãŒã¶ãŒèŠçŽ ã®å€ãã®å®çŸ©ãåãåããããããã©ãŠã¶ãŒã§äœããã®æ¹æ³ã§åæåãããåæç¶æ ã決å®ãããããšã§ãã ãã®ãããªãœãªã¥ãŒã·ã§ã³ã¯åé·ã§ãã ã³ã³ããŒãã³ãããŒããŒã®ç°¡åãªãœãªã¥ãŒã·ã§ã³ã®ãªãã·ã§ã³ã®1ã€ã¯ã次ã®ã¢ã«ãŽãªãºã ã§ãã
- å¿ èŠãªãŠãŒãã£ãªãã£ãããŒãããŸãã
- ããªãã£ã«ã®ããŒãã
- ã©ã€ãDOMããã«ã¹ã¿ã èŠçŽ ãçµã¿ç«ãŠãŸãã
- ã¿ã°åã«ãã€ãã³ãå«ããã¹ãŠã®DOMèŠçŽ ãéžæãããŸã
- ãªã¹ãã¯ãã£ã«ã¿ãªã³ã°ããããªã¹ãã¯æåã®èŠçŽ ã§æ§æãããŸãã
- åä¿¡ãããŠãŒã¶ãŒèŠçŽ ã®ã«ãŒããéå§ããŸãã
- Intersection Observer,
- +- 100px import.
- 3 shadowDOM,
- , shadowDOM , , import JS.
- lit-element open-wc.org . webpack rollup, - storybook, IDE.
è¿œå ã®ãªã³ã¯ïŒ
- Let's Build Web Components! Part 5: LitElement
- Web Component Essentials
- Lit-HTMLãè©Šãå€...
- LitElement To Doã¢ããª
- LitElementã¢ããªãã¥ãŒããªã¢ã«ããŒã1ïŒã¯ããã«
- LitElementãã¥ãŒããªã¢ã«ããŒã2ïŒãã³ãã¬ãŒããããããã£ãã€ãã³ã
- LitElementãã¥ãŒããªã¢ã«ããŒã3ïŒReduxã«ããç¶æ 管ç
- LitElementãã¥ãŒããªã¢ã«ããŒã4ïŒããã²ãŒã·ã§ã³ãšã³ãŒãåå²
- LitElementãã¥ãŒããªã¢ã«ããŒã5ïŒPWAãšãªãã©ã€ã³
- Lit-htmlã¯ãŒã¯ã·ã§ãã
- çŽ æŽãããlit-html