Slide 1

Slide 1 text

5FNQMBUF*OTUBOUJBUJPO )5.-.PEVMFT4UVEZ !LPCB

Slide 2

Slide 2 text

!LPCB

Slide 3

Slide 3 text

⚠ This is a very early stage!!!

Slide 4

Slide 4 text

8IBUJT5FNQMBUF*OTUBOUJBUJPO

Slide 5

Slide 5 text

w IUUQTHJUIVCDPNXDXFCDPNQPOFOUTCMPCHIQBHFT QSPQPTBMT5FNQMBUF*OTUBOUJBUJPONE w IUUQTXXXXPSHXFCQMBU NJOVUFTIUNMJUFN w 1SPQPTFECZ"QQMF !SOJXB PO/PWFNCFSTU w 5FNQMBUF*OTUBOUJBUJPOJTBQSPQPTBMUPQSPWJEFBOBUJWF NFDIBOJTNUPJOTUBOUJBUFBUFNQMBUFFMFNFOUXJUITPNFQBSUT CBTFEPO+BWB4DSJQUWBMVFT w 5FNQMBUF OPU$PNQPOFOU 8IBUJT5FNQMBUF*OTUBOUJBUJPO

Slide 6

Slide 6 text

#BDLHSPVOE

Slide 7

Slide 7 text

w 5IFSFBSFNBOZJODPNQBUJCMFUFNQMBUFTZOUBYFTBOE TFNBOUJDT w )BSEUPDPNCJOFSFVTBCMFDPNQPOFOUTBDSPTTMJCSBSJFT w "EBQUJOH.VTUBDIFTZOUBYGPSTVCTUJUVUJPOCFDBVTFPG TJNQMJDJUZ w EJW\\OBNF^^EJW w *OUFSPQFSBCJMJUZDPOpHVSBCMF w .BLFJUFYUFOTJCMFUPJOOPWBUFBOEJUFSBUFRVJDLMZ #BDLHSPVOE

Slide 8

Slide 8 text

6TF$BTFT

Slide 9

Slide 9 text

w 4IPVMECFBCMFUPDSFBUFBTIBEPXUSFFGSPN)5.- UFNQMBUFXJUIPVUIBWJOHUPNBOVBMMZDPOTUSVDUUIF%0. USFF 6TF$BTF

{{title}}

Slide 10

Slide 10 text

w 4IPVMECFBCMFUPTUBNQPVUUIFDPOUFOU`TWBMVFXJUIB WBMVFTUPSFEJOB+40CKFDUFBTJMZ 6TF$BTF
{{id}} {{name}}
template.createInstance({id: 100, name: ‘foo’});

Slide 11

Slide 11 text

w 4IPVMECFBCMFUPVQEBUFJUTTIBEPXUSFFXIFOUIF DPSSFTQPOEJOH+4WBMVFTBSFVQEBUFE 6TF$BTF
{{id}} {{name}}
const templateInstance = template.createInstance({ id: 100, name: ‘foo’ }); templateInstance.update({id: 100, name: ‘bar’});

Slide 12

Slide 12 text

w 4IPVMECFBCMFUPDBMMBGVODUJPOXJUI+4WBMVFTCFGPSFJU HFUTJOTFSUFEJOUPUIFUFNQMBUFJOTUBODF 6TF$BTF var obj = {id: 100, name: ‘foo’}
{{id}} {{capitalize name}}

Slide 13

Slide 13 text

w 4IPVMECFBCMFUPVTFBCJEJSFDUJPOBMCJOEJOHNFDIBOJTN UPQSPQBHBUFUIFWBMVFCBDLGSPNUIFTIBEPXUSFF w *U`TOPUTVQQPSUFEOBUJWFMZ CFDBVTFJU`TOPUOFDFTTBSJMZ EFTJSBCMF FH3FBDU 6TF$BTF var obj = {id: 100, name: ‘foo’}
{{id}}

Slide 14

Slide 14 text

w 4IPVMECFBCMFUPTFUBOESFNPWFBOBUUSJCVUFCBTFEPO +4WBMVFT 6TF$BTF var obj = {id: 100, name: ‘foo’}
{{id}}

Slide 15

Slide 15 text

w 4IPVMECFBCMFUPTFUBEFGBVMUWBMVF 6TF$BTF
{{id}}

Slide 16

Slide 16 text

w 4IPVMECFBCMFUPUPHHMF%0.OPEFTCBTFEPO+4WBMVFT 6TF$BTF
{{id}}

Your name is {{name}}

Slide 17

Slide 17 text

w 4IPVMECFBCMFUPVTFBTJOHMFUFNQMBUFUPJOTUBOUJBUFBO BSSBZPGFMFNFOU 6TF$BTF
  • {{id}}:{{name}}

Slide 18

Slide 18 text

1SPQPTBMT

Slide 19

Slide 19 text

#BTJDT [NoInterfaceObject] Interface TemplateInstance : DocumentFragment { void update(any state); }; partial interface HTMLTemplateElement { TemplateInstance createInstance(optional any state); } const template = document.getElementById(‘my-template’); const state = {count: 1}; const instance = template.createInstance(state); shadowRoot.appendChild(instance); state = {count: state.count + 1}; instance.update(state);

Slide 20

Slide 20 text

w "OFYQSFTTJPOJOFBDINVTUBDIFDSFBUFTB5FNQMBUF 1BSUTPCKFDU 5FNQMBUF1BSUT // name = ‘foo’;
{{capitalize name}}
// templatePart.expression = “capitalize name”; // … // templatePart.value = “Foo”; // or // templatePart.replace([dom1, dom2]); // or // templatePart.replaceHTML(‘Foo’);

Slide 21

Slide 21 text

5FNQMBUF1BSUT interface TemplatePart { readonly attribute DOMString expression; attribute DOMString? value; stringilyer; } interface AttributeTemplatePart : TemplatePart { readonly attribute Element element; readonly attribute DOMString attributeName; readonly attribute DOMString attributeValue; attribute boolean booleanValue; } interface NodeTemplatePart : TemplatePart { readonly attribute ContainerNode parentNode; readonly attribute Node? previousSibling; readonly attribute Node? nextSibling; [NewObject] readonly NodeList replacementNode; void replace((Node or DOMString)… nodes); void replaceHTML(DOMString html); }

Slide 22

Slide 22 text

5FNQMBUF1BSUT InnerTemplatePart : NodeTemplatePart { HTMLTemplateElement template; Attribute DOMString directive; }

Slide 23

Slide 23 text

w &BDIUFNQMBUFUZQFJTBTTPDJBUFEXJUI 5FNQMBUF1SPDFTT$BMMCBDL 5FNQMBUF1SPDFTT$BMMCBDL interface HTMLTemplateElement { attribute DOMString type; }; callback TemplateProcessCallback = void (TemplateInstance, sequence, any state); dictionary TemplateTypeInit { TemplateProcessCallback processCallback; TemplateProcessCallback? createCallback; }

Slide 24

Slide 24 text

w :PVDBOEFpOFBGVODUJPOUPQSPDFTTUFNQMBUFQBSUTCZ UFNQMBUFQSPDFTTDBMMCBDL 5FNQMBUF1SPDFTT$BMMCBDL … document.defineTemplateType(“my-template”, { createCallback: (instance, parts, state) => { // How do I remove the event listener? listen(‘change’, () => instance.update(state)); }, // default processor is something like this. processCallback: (instance, parts, state) => { for (const part of parts) { part.value = state[part.expression]; } } });

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

5FNQMBUF1SPDFTT$BMMCBDL
  • {{name}}
document.defineTemplateType(‘loop’, { processCallback: (instance, parts, state) => { for (const part of parts) { if (part instance InnerTemplatePart) { switch (part.directive) {
 case ‘foreach’: part.replace( state[expression] .map(item => part.template.createInstance(item)) ); break; } }

Slide 27

Slide 27 text

0UIFS-JCSBSJFT

Slide 28

Slide 28 text

w )5.-UFNQMBUFT WJB+BWB4DSJQUUFNQMBUFMJUFSBMT MJUIUNM 1PMZNFS-BCT import {html, render} from ‘./node_modules/lit-html/lit-html.js’; import {repeat} from ‘./node_modules/lit-html/lib/repeat.js’; const items = [{id: 1, name: ‘foo’}, {id: 2, name: ‘bar’}]; render( html`
    ${repeat(items, (item) => item.id, (item) => html`
  • ${item.name}
  • ` }
`, document.querySelector(‘items’) );

Slide 29

Slide 29 text

w 'BTUBOEMJHIUXFJHIU6*DPNQPOFOUTGPSUIFXFC w )BOEMFCBST)5.-#BST(MJNNFS w 7."SDIJUFDUVSF w "QQFOEBOE6QEBUFPQFSBUJPO w #JOBSZUFNQMBUFT (MJNNFSKT &NCFS Handlebars Template ! Compile IR(Intermediate Representation) -> Opcodes ! VM executes opcodes Browser, Node

Slide 30

Slide 30 text

w )5.-UFNQMBUFT WJB+BWB4DSJQUUFNQMBUFMJUFSBMT (MJNNFS &NCFS https://engineering.linkedin.com/blog/2017/06/glimmer--blazing-fast-rendering-for-ember-js--part-2

Slide 31

Slide 31 text

'VUVSF

Slide 32

Slide 32 text

w *NQMFNFOUBQPMZpMMPG5FNQMBUF*OTUBOUJBUJPO w "UUSJCVUFBOE1SPQFSUZ &WFOU)BOEMFSTʜ w 5FNQMBUFUZQFSFHJTUSZUPTIBEPXSPPU w 5IJOLJOHUFNQMBUFQSPDFTTPSJTUIFIBSEFTUJTTVF w ,FFQEFGBVMUQSPDFTTPSTJNQMFBOESFTFSWFUIFTQBDF GPSUIFGVUVSF w 1SPNJTFTVQQPSU 'VUVSF WPSW

Slide 33

Slide 33 text

5IBOLT