ããã«ã¡ã¯
å€ãã®ããã³ããšã³ãéçºè ã¯ãç¹ã«React.jsã§äœ¿çšãããVDOMãã¯ãããžãŒã¯ãã©ãã¯ããã¯ã¹ã®ããã«æ©èœãããšèããŠããŸãã ãŸããnpmã®ãªãŒãã³ã¹ããŒã¹ã«ã¯ããã®ãã¯ãããžãŒãå®è£ ããã©ã€ãã©ãªããããããããŸãããç§ã«ãšã£ãŠã¯ãæªéã®è¶³ããããã«äŸµå ¥ããŸãã VDOMãããã¯èªäœã«å°ãåããèå³ããããèªåã§è§Šã£ãŠå®éšãå§ããŸããã æçµçã«ã¯ãVDOMã®å®è£ ãäœæãããããããŒã¿ã°ãªãããã¬ãŒã ã¯ãŒã¯ã«çµã¿èŸŒãã ãšããäºå®ã«çµãããŸããïŒã©ãã«ãããŠããã«ã€ããŠèª¬æããŸãïŒã ç°¡åã§ã¯ãããŸããã§ããããéåžžã«ã·ã³ãã«ã§ããããã®èšäºã§ã¯ãäœãããªãããªããã詳ãã説æããŸãã ãããŠããã®ä»çµã¿ã説æããŸãã ãã£ããã®äžã«é£ã³èŸŒããšãèå³æ·±ãäœéšãã§ããŸãã
ãã£ã¹ã¯ã©ããŒ
ç§ã¯ããã³ããšã³ãéçºè
ã§ã¯ãããŸããã ã¹ãªããã§ç§ãhitããªãã§ãã ããã
ãŸãããæ¢æã®æ çµã¿ãåããªãããã¯ã©ãããšæžããŠã¯ãããŸããã æ¢è£œã®ãã¬ãŒã ã¯ãŒã¯ãããããšã¯ç¥ã£ãŠããŸãããçŽç²ã«æè¡çãªçç±ãããç¬èªã®å®è£
ãå¿
èŠã§ãã
ãªããããå¿ èŠã§ãã
TL; DR ïŒ jsfiddleã«é¢ãããã®èšäºã® ãœãŒã¹
ããã®ã©ããã«VDOMã«ã€ããŠã®èšäºãæ¢ã«ãããŸããã ãåé¡ã®æ¬è³ªã®èª¬æã奜ãã§ã¯ãããŸããã ããã§ãæã«ãããæããããŸãã ããã§ãããªãããŠã§ãããŒãžãæã£ãŠãããšãããïŒ ç¹å®ã®HTMLèŠçŽ ïŒããããããªã倧ããïŒãã¬ã³ããªã³ã°ããŸããã å°ãã®ã³ã³ããã¹ããè¿œå ããã«ã¯-ãã®èŠçŽ ã¯ããã¥ãŒã¢ãã«ã§ãã³ãã¬ãŒããåŒã£åŒµã£ãŠæç»ãããŸãã ãŸãã誰ãããããè¡ããã¬ãŒã ã¯ãŒã¯ã䜿çšããŸãããïŒ ããã«ãããã³ãã«ããŒãlodashãã³ãã¬ãŒããAngularJS ...èŠããã«ããã³ãã¬ãŒãããã«ãããã¢ãã«ãå€æŽããããšæ³åããŠãã ããã ãããŠããããã®å€æŽãHTMLèŠçŽ å ã«æç»ããå¿ èŠããããŸãã åé¡ãçºçããŸã-ã©ããã£ãŠãããè¡ãããã©ãã«ã«å·»ã蟌ãŸããªãã®ã§ããïŒ ããã§ã¯ããã€ãã®ããã«ãããã€ãã®ãªãã·ã§ã³ããããŸãã
innerHTML
ãã³ãã¬ãŒããšã³ãžã³ã䜿çšããŠããŒã¿ã¢ãã«ãå®è¡ããHTMLãååŸããŠã element.innerHTML = ourHtmlString;
å®è¡ããã ãã§ãelement.innerHTML = ourHtmlString;
ã å®ããŠéœæ°ã§ãããäžéšã®ã¿ã¹ã¯ã§ã¯ããªãè¯ãã§ãã ããã§æãããããšã¯äœã§ããïŒ
ãããŠãç§ã¯ããªãã«çããŸãïŒãã®ãªãã·ã§ã³ã¯ã element
å
ã«ãããã¹ãŠã®åèŠçŽ ããã©ãŠã¶ã«ãã£ãŠå®¹èµŠãªã殺ãããæ°ããèŠçŽ ã«çœ®ãæãããããããäž»ã«æªãã§ãã ã ããïŒ ã¯ãããããã£ãŠãããªãã¯ããªããæã£ãŠããïŒãã¡ããããªãã®èŠçŽ å
ã§ïŒã€ãã³ããžã®ãã¹ãŠã®ãµãã¹ã¯ãªãã·ã§ã³ã倱ããŸãã æ°ããäœæããã¢ã€ãã ã«å床眲åããå¿
èŠããããŸãã ããã§ã¯ãæ£çŽã«èªããŸãããç°ãªãjsãšã³ãžã³ã§ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãã©ã®ããã«æ©èœãããã¯ããããŸãããã以åã«å€æ°ãªã©ã®ã³ãŒãã«ããã€ãã®åèŠçŽ ãä¿åããå Žåããããã®èŠçŽ ã¯ããªãŒããåé€ãããŸãããç Žå£ãããŸããã ããã«ã¡ã¯ã¡ã¢ãªãªãŒã¯ãç§ãã¡ã¯ããªããéããã ããŠãããã¯ãããšãã°ãã©ãŠã¶ãŒãDOMèŠçŽ ã®åç
§ã«ãŠã³ãã䜿çšããããšãåæãšããŠããŸãã 誰ã詳现ãç¥ã£ãŠãã-ã³ã¡ã³ãã«æžããŠãã ããã
ããã«å ããŠ-ãã®ãªãã·ã§ã³ã¯ãç¹ã«åäŸãå€ãå Žåã¯éåžžã«é ããªããŸãã ã€ãŸãããã©ãŠã¶ã¯èŠçŽ å ã«æç»ããããã¹ãŠãæ£çŽã«æ¶å»ããåã«ãŠã³ãããŠåæç»ããŸãã æ³åããŠã¿ãŠãã ãã-ããªãã¯ã°ãªã·ã£ããã«ãŒããåŒããŸãããããã«ã¯100ã®ç°ãªããã£ãŒã«ãããããŸãã ãŸããããŒã¿ã§ã¯ç幎ææ¥ã®ã¿ãå€æŽãããŠããŸãã ãããŠä»ãäžå¹žãªããã¹ãã®ããã«ãããã¹ãŠã®ãŽããã°ãªã·ã£ãæ°ããããæ¹ã§ãã£ãŠããããšããããšã§ããïŒ ã°ãªã·ã£å šäœã殺ããæ°ããŠåæç»ããŸããïŒ ãã©ãŠã¶ã§ã€ã³ã¿ãŒãã§ãŒã¹ãåæç»ããã®ã¯ãå®éã«ã¯é·ãæéããããããšããåç¥ã§ããïŒ ã°ãªã·ã£ã150ã®èŠçŽ ã§æ§æãããŠããå Žåãããã§ã圌ã¯ã©ããžè¡ã£ãŠãã ãããã1000ãè¶ ããå ŽåïŒæ€æ»ã«ããGrishaãå€æ°ã®å°ããªè©³çŽ°ã瀺ããŠããå ŽåïŒãäžéšã®ãã·ã³ã§ã¯åæç»ãæ°ç§ã«éããå¯èœæ§ããããã€ã³ã¿ãŒãã§ã€ã¹ã®å¿çæ§ãå°ãäœäžããŸãã
æ²ããããšã«ããã¹ãŠã®èŠçŽ ãinnerHTMLãä»ããŠæç»ãããããã§ã¯ãããŸããã äŸãšããŠãIE8 ã§ã¯ ã tbody
èŠçŽ ã«innerHTMLãèšå®ããããšã¯ã§ããŸãã ã Google Chromeã§ã¯ãããŒãã«ããããŒïŒ th
ïŒã®innerHTMLã«ããã¬ã³ããªã³ã°ãäžååã§ãã innerHTMLãä»ããŠããã«æ¿å
¥ãããã®ã¯ãã¹ãŠãç§ã«ã¯äžæãªçç±ã§ãã¬ãŒã³ããã¹ãã«åãæšãŠãããŸãã Pruflinkã¯ããã§ã¯ãããŸãã-å人çãªçµéšããã®æ
å ±ã ããããä»ã§ã¯ãã§ã«ä¿®åŸ©ãããŠããŸãããå ç©ç©ã¯æ®ã£ãŠããŸãã
ãããã£ãŠãinnerHTMLã¯ãè¿ éã§æ±ãããã¯ã®ãããªãã®ã§ãã äžè¬çãªã±ãŒã¹ã§ã¯ä¿¡é Œæ§ãäœããå€ãã®å¯äœçšããããŸããå®éãç§ãã¡ã¯ãã®ãããªæžãæ¹ãããããã«åŠæ ¡ã®9幎çã§ã¯ãããŸããã ãããã-èã®äžã«å®è£ ã
HTMLããŒãµãŒ
ççŽã«èšã£ãŠããã®ãªãã·ã§ã³ã¯ãæåŸã®æ²ããåé¡ã§ããinnerHTMLã®ã¿ã解決ããŸã-äœæãããèŠçŽ ã«ã¯æ¥µåºŠã®çŽ°å¿ã®æ³šæãå¿ èŠã§ãã ããããäž»ã«VDOMãå®è£ ããããã«å¿ èŠã«ãªããããèšåãã䟡å€ããããŸãã
ã©ã®ããã«æ©èœããŸããïŒ ã¯ããåäœããŸãã HTMLã解æããåããŒãã®document.createElement
ãåŒã³åºããŠãããå±æ§ãèšå®ããŸãã 次ã«element.innerHTML = ''
ãå®è¡ããåãåã£ãèŠçŽ ãinsertBefore
appendChild
/ insertBefore
åŒã³åºãappendChild
ã
ãŸã...ãŸããç§ãã¡ã¯èŠçŽ ã殺ãåé¡ã解決ããŸããã§ããã 第äºã«ãHTML解æã§ã¯ããã®äžçã§ã¯ãã¹ãŠãããã»ã©ã¹ã ãŒãºã§ã¯ãããŸããã
HTML解æã¯XMLããã¥ã¡ã³ãã®è§£ææ¹æ³ã«é¢ãããã®ã§ãããã¯ã©ã€ã¢ã³ãåŽã®ããŒãµãŒã§ã¯æãé »ç¹ã«äœ¿çšãããŸã é£ã¹ç©çš ã¹ããªãŒã ããŒãµãŒã ããã Javaã®StAXã«äŒŒãŠããŸã ã XMLã¹ããªãŒã ããŒãµãŒãé£ã¹ãããšã¯å¥åº·ã«è¯ãããšã蚌æãããŠããŸãã ãªãã§ïŒ ã¯ããé«éãã€ç°¡åã«èšè¿°ã§ããããã§ãã XMLã®å Žåã®ããã«ããã®ã¿ã¹ã¯ã«ã¯ã©ã·ãã¯ãŠããããŒãµãŒã䜿çšããªãã§ãã ããã ããã§ã¯åã«å¿
èŠãããŸããã
HTMLããŒãµãŒã®äžçã§ã¯ãã¹ãŠãåªããŠããŸããã1ã€ã ãäŸå€ããããŸãããã©ãŠã¶ãŒã«çµã¿èŸŒãŸããŠãããã®ã¯ãããŸããã MDN ã¯DOMParserã«èšåããŠããŸãã ããŸã å®éšçã§ãããããããåºåã§ããªãŒãæäŸããŸãã ãããã¯ã©ã€ã¢ã³ããµã€ãã§ã¯ãããªãŒãæ©ãåã£ãŠdocument.createElement
ãåŒã³åºãã ãã§ã¯ååã§ã¯ãããŸããã§ããã äžèšã§èšãã°ã圌ã¯å¥åŠã§ãã 圌ã«è§Šããªãããã«ããŸãããã htmlparser2ããããŸã-npmã«ãããŸã ã ã€ãã³ãã¹ããªãŒã ããŒãµãŒã§ããããã¬ãŒã ã¯ãŒã¯ã®ã€ããªãã®ãŒãšããŠãµãŒãããŒãã£ã®äŸåé¢ä¿ã䜿çšã§ããªããããç§èªèº«ã¯äœ¿çšããŸããã§ããã ãããŠãããã¯John Rezigã®ã³ãŒãã®èšäºãšäŸã§ã ïŒjQueryããåé¢ããŠãã ããïŒãæã§ãã¹ãŠã説æããç°¡åãªããŒãµãŒã®ã³ãŒããæäŸããŸãã æ£èŠè¡šçŸã§æ©èœãããããæ°ã«å
¥ããªãã ãã®zeloã¯é¢åã§ãã ããããããã¯ããªãå®è¡å¯èœã§ãã ç§ã¯é·ãéãTypeScriptçšã«åèšèšããããã®èšäºã®ã³ãŒãã®ã¿ã䜿çšããŸããïŒç§ã¯åçœããŸãïŒã ãã ããæååã®æ¯èŒãæå°éã«æããä»®æ³èŠçŽ ã®äœæããµããŒãããããã«ãåçŽãªã¹ããŒããã·ã³ã®ã¹ããªãŒã ããŒãµãŒã«çœ®ãæããŸããïŒããã«ã€ããŠã¯ãä»æ¥å
±æããŸãïŒïŒããšãã°ãJohnã¯ãã¡ã€ã«ãäœæããã®ã«å°ãäžäŸ¿ã§ããïŒã
Vdom self
ãããŠãããã©ãŒãã³ã¹ãšèŠçŽ äžã®innerHTMLã®ããããã®äž¡æ¹ã®åé¡ã解決ãããæãããªãããŒãªã¢ãããŒãã«ãã©ãçããŸããã ã€ãŸããHTMLããŒãµãŒã䜿çšãããšãHTMLãçªç¶è§£æã§ããŸããã document.createElement
ã§ã¯ãªãåèŠçŽ ãåŒã³åºãããšãã§ããŸãããã¿ã°åãšå±æ§ãæ ŒçŽãããªããžã§ã¯ããäœæããã ãã§ãã ãã®ãŸãã«ãªããžã§ã¯ãã¯ã ä»®æ³DOM-nodeãšåŒã°ãããããã®çµã¿åãã- ä»®æ³DOM-treeãŸãã¯VDOMã§ãã ããã§ã var a = {};
ããŠJSã§1000åã®ãªããžã§ã¯ããäœæããããšã«æ³šæããŠãã ããvar a = {};
-ããã¯éãã§ãã ãšãŠãéãã ãããã1000åã®å®éã®DOMããŒãã®äœæã¯é
ãã§ãã ãã®ç¶æ³ãããsobsnoãããã³çç£æ§ã®åäžã«ã€ãªãããŸãã
OKãäœæããŸããã ãããŠãç§ãã¡ã¯ãã®è¯ãããšã§äœãããŸããïŒ ãºãã³ãè±ãã§èµ°ã ãºãã³ãè±ãå¿
èŠã¯ãããŸããããå®è¡ããå¿
èŠããããŸããVDOMããªãŒã®æ§é ãæ¢ã«æç»ãããŠãããã®ãšæ¯èŒããããããäœããã®çš®é¡ã®å·®åããããäœæããŸãïŒè¿œå ããå¿
èŠããããã®ãåé€ãããã®ãå±æ§ãããããããå Žæãã³ã³ãã³ããå€æŽããå ŽæïŒæ¢åã®DOMããªãŒã«ããŒã«ããŸãã ããã¯ãããŒãžäžã«ãæ°ã«å
¥ãã®gitã§çºçããã®ãšãŸã£ããåãã§ãã 幞ããªããšã«ãããã°ã©ãã³ã°ã§diffãäœæããã¿ã¹ã¯ã¯éåžžã«ããç¥ãããŠããŸã- æãäžè¬çãªãµãã·ãŒã±ã³ã¹ãèŠã€ããããšã«ãã£ãŠãçªç¶ã°ãŒã°ã«ã§æ€çŽ¢ãããŸãã åçããã°ã©ãã³ã°ã«ãã£ãŠè§£æ±ºãããŸãã ã¢ã«ãŽãªãºã ã«ã¯2次ã®è€éãããããŸãã åªãã倧åŠã§ã¯ããã®åé¡ã®è§£æ±ºçã¯æåã®ã³ãŒã¹ã§ç 究ãããŠããŸãããããã§ã¯è«æã説æãããããæšã«é©å¿ãããæ¹æ³ã説æããŸãã
UPDïŒ ã³ã¡ã³ãã§ãç§ã¯LCSããã®ã¿ã¹ã¯ã«æé©ã§ã¯ãªããšããäž»é¡ã«ãã§ã«ããããæããŸãããLISã䜿çšããå¿ èŠããããŸãããèšäºãšã³ãŒããããã»ã©éãæžãçŽãããšã¯ã§ããŸããã ãã®ãããå·®åã®èšç®ãæ±ãéšåãããå³å¯ã«æé©åã§ããããšã«æ³šæããŠãã ããã
ãã®çµæãVDOMã¢ãããŒãã¯ãå€æŽãããŠããªãäžèŠãªèŠçŽ ãäœæããªãããªãŒèŠçŽ ãåé€ãããã¡ã¢ãªãå€§å¹ ã«ç¯çŽããã€ãã³ããµãã¹ã¯ãªãã·ã§ã³ãç¯çŽããŸãïŒèŠçŽ ãç Žæ£ãããªãå ŽåïŒããã ããHTMLèŠçŽ ãäœæãããããCPUã«æ¯èŒã匷å¶ããŸãã ãŸããããã«ãããç»é¢äžã®1000åã®èŠçŽ ã®ãã¡1ã€ã ããå€æŽããããšãã«ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãã
ããå§ããŸããã
å·ŠåŽã®textarea
ã§æ§æãããå°ããªã¢ããªã±ãŒã·ã§ã³ãäœæããŸãããã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãHTMLãæäœããã³/ãŸãã¯å€æŽããå³åŽã®ãŠã£ã³ããŠã§äœæ¥çµæã確èªããŸãã è¿œå ã®ã©ã€ãã©ãªã¯ãããŸãã-TypeScriptãšãã©ãŠã¶ã ãã§ãã 圌ããèšãããã«ãç§ãã¡ã¯ç©ºããéæ³ããããŸãã
ãåç¥ã®ããã«ãæåã¯è¡ããšã®åæã§ãã®èšäºã«å€ãã®ã³ãŒããè¿œå ãããã£ãã®ã§ããã以åã®èšäºã念é ã«çœ®ããŠããããããããšã¯æããŸããã§ããã ã³ãŒãèªäœãèªã¿ããããäœäžãããæ²ãããªããŸãã ãããã£ãŠãèš±å¯ãåŸãŠãGithubãžã®ãªã³ã¯ãæäŸããã©ã®ããã«æ©èœããã®ãã説æããŸãã VDOMã¯ãHTMLããŒãµãŒãçŽæ¥ã³ã³ãã¬ãŒã¿ãŒããããèšç®æ©ãããã³app.tsã®3ã€ã®äž»èŠã³ã³ããŒãã³ãã§æ§æãããããããã¹ãŠapp.ts
ãŸãšããŠæ©èœãããŸãã
ããŒãµãŒ
ããã§äºçŽããå¿ èŠããããŸãã ç§ãç解ããŠããããã«ãReact.jsã¯HTMLããŒãµãŒãªãã§æ©èœããŸããããã¯ããã³ãã¬ãŒãïŒjsx / tsxïŒãæ¢ã«å¯Ÿå¿ããããŒãäœæåŒã³åºãã«çµã¿èŸŒãŸããŠããããã§ãã ããã¯ããã©ãŒãã³ã¹ãæ¹åããè¯ãåãã§ããããåç¥ã®ãšãã...ç¬èªã®ãã³ãã¬ãŒãèšèªãäœæãããã®ããã®ã³ã³ãã€ã©ãäœæããããšã¯ããã®èšäºãæžãããšãã®ç§ã®èšç»ã«ã¯ãããŸããã§ããã ãããã£ãŠãç§ãã¡ã¯æã§è£žã®HTMLã解æããŸãã ãã®ãããªå®è£ ã¯ãç§ãã¡ã«ã©ãã«ã§ãå·¥èžãåã蟌ãèœåãä¿èšŒããç§ãæå³ããããšãç解ããŠããã°ãçŽç²ã«æè²åŠçãªå¥åŠããé¿ããããšãã§ããŸã:)ããã§ã¯ãè¡ããŸãããã
ã¹ã¿ãã¯
JavaScriptã«ã¯ã¹ã¿ãã¯ãæäœããããã®å¹æçãªããŒã«ãå«ãŸããŠããªããããå¿ èŠãªããŒã«ãå¿ èŠã§ãã ãããã£ãŠã åçŽãªã¹ã¿ãã¯ãäœæããŸã ã ã³ã¡ã³ãã¯ãããŸããã
ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒ
ãåç¥ã®ããã«ãJavaScriptã®èŠ³ç¹ã§ã¯ãHTMLããã¥ã¡ã³ãã¯ããŒãã§æ§æãããŠããŸãã ãã®äžéšã¯ãHTMLInputElementïŒ input
ã¿ã°ïŒãHTMLDivElementïŒ div
ã¿ã°ïŒãªã©ã®éåžžã«HTMLèŠçŽ ã§ãã ãããŠãããã€ãã¯ããŸããïŒããã¹ããã³ã¡ã³ãïŒã 䜿çšå¯èœãªãã¹ãŠã®ããŒãã¿ã€ããMDNã«ãªã¹ããããŠããŸã ã ã·ã³ãã«ãªãã®ããå§ããŸã-ããããã€ã³ã¿ãŒãã§ãŒã¹ã宣èšããŸã ãããŒãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãã HTMLãããŒãã³ãŒãããªãããã«ãããŒãµãŒã«document.createElement
ãåŒã³åºããVDOMãšåãããŒãµãŒãDOMã«äœ¿çšããŸãã ç§ã®å®è£
ã§ã¯ããã®ããã«èŠããŸãã ã芧ã®ãšãããHTMLèŠçŽ ãããã¹ãïŒã³ã³ãã³ãïŒãã³ã¡ã³ãã®3çš®é¡ã®ããŒãã«å¶éãããŠããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã¯éåžžã«ã·ã³ãã«ã§ã3çš®é¡ãã¹ãŠã®ããŒããäœæããæ©èœãæäŸããŸãããŸããHTMLèŠçŽ ã«å¯ŸããŠã¯å±æ§ã®ã€ã³ã¹ããŒã«ãæäŸããŸãã èè¡ããé ãé¢ããªãããã«ããããã«ãå®éã®HTMLããŒãã«ããã«å®è£
ããŸãã ãšãŠãç°¡åã§ãã åäŸã§ããããåŠçã§ããŸãã
ããã§ãVDOMããŒããã©ã®ããã«ä¿åããããèããŸãã ã¿ã€ãã«å ããŠãããŒãã«ã€ããŠç¥ã£ãŠããã¹ãéèŠãªããšã¯äœã§ããïŒ HTMLèŠçŽ ã®å Žåãã¿ã°ãšå±æ§ã ã³ã¡ã³ããšããã¹ãã®å Žå-ã³ã³ãã³ãã ä»ã®ãã¹ãŠã«å ããŠãåããŒãã®ãªã¹ããåæ§ã«éèŠã§ãã çŽ æŽãããã åã®ã€ã³ã¿ãŒãã§ã€ã¹ãšenum
ãèšè¿°ããåŸãã³ã³ã¹ãã©ã¯ã¿èªäœãå®è£
ããŸãïŒ ãã®ããã« ã
HTMLããŒãµãŒ
ããŒãµãŒ-ããã¯ã ç¶æ
ã®æ°ãéãããŠãããããªãã®ã§ãã 圌女㯠ã®ãã³ã æž¡ãããHTMLãæåããšã«è¿œè·¡ããçŸåšã®æåã«å¿ããŠç¶æ
ãå€æŽããŸãã ç¶æ
ããç¶æ
ã«é·ç§»ãããšãããŒãµãŒã¯ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒã¡ãœããããã«ããé©åãªã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
ããšãã°ãããŒãµãŒã®æåãèªã¿åãã誰ã«ã觊ããŸããã Op-met <
ã圌ã圌ãèŠãå Žæãèšæ¶ããç¶æ
ãã泚ææ·±ãè³ãåŸããä»ã¯HTMLã¿ã°ããããã«å€æŽããŸãã èªãã§ã Op-空çœæåãæºãããŸãã ããã§ã¯ãã¿ã°ã®ååã§ãã 圌ã¯<
ã«åºäŒã£ãå ŽæãèŠããŠãããããããçŸåšã®äœçœ®ãŸã§ããã¹ãããããŸã-ããã«ã¿ã°åããããŸãã ãããã£ãŠãã³ã³ã¹ãã©ã¯ã¿ãŒããŒãããã«ããã¿ã°åãæž¡ããŠcreateãåŒã³åºãå¿
èŠããããŸãã ããã«ãããŒãµãŒã¯ãã¹ãŠã®ç©ºçœæåãã¹ããããã >
å Žåãå
ã®ç¶æ
ã«æ»ããŸãã ãããŠãã¢ã«ãã¡ãããã®æåãèŠãå Žåãå±æ§å=
ãåŒçšç¬Šã§å²ãŸããå±æ§ã®å€ããã£ããããã³ã³ã¹ãã©ã¯ã¿ãŒããŒãããã«ããŸãã
äœæããã¿ã°ãã¹ã¿ãã¯ã«ä¿åããŸãã éå§ã¿ã°ã«å°éãããã³ã«ãã¹ã¿ãã¯ã«é 眮ããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒãä»ããŠèŠçŽ ãäœæããå Žåãã¹ã¿ãã¯ã®çŸåšã®æäžéšã芪èŠçŽ ãšããŠæå®ããŸãã ã€ãŸããªãã 倧åŠã®æåã®æ°å¹Žã§é»åãæžãããšãã誰ããå°ãªããšãäžåºŠã¯äŒŒããããªããšããããšæããŸãã
ãã¹ãŠã®ç¶æ
ãããã³é·ç§»äžã®ã¢ã¯ã·ã§ã³ã¯ã ç¶æ
ãã·ã³ã«å
¥ããŸã ãããã¯æè¡çã«ã¯å·šå€§ã§ã èŸæžãé ã®äžã®è¡ãŸã¿ãã®CïŒ ãç¶æ
ã->ãã¢ã¯ã·ã§ã³ã®èª¬æããšãã圢åŒã®ããã·ã¥ãªããžã§ã¯ãã ãã®å Žåã®ã¢ã¯ã·ã§ã³ã®èª¬æã¯ã3ã€ã®éšåã§æ§æãããŠããŸãã
- å·ã®å ¥ãå£ã§å®è¡ãããæ©èœã
- ç¶æ ã®çµäºæã«å®è¡ãããé¢æ°ã
- 次ã«èªã¿èŸŒãŸããæåããšã«åŒã³åºãããé¢æ°ã
ããã3ã€ã®é¢æ°ãIStateInfoãšåŒã°ãããã®ã«çµã¿åãããŸããã ããã§ãããŒãµãŒã®èãããããã¹ãŠã®ç¶æ
ã説æããŸããã ããŒãµãŒèªäœã¯ãããã€ãã®æçšãªãã¹ã¿ãŒæ©èœãæäŸããŸããïŒããã¯ãçŸåšã®æåã確èªãããšããnæåãæ»ããçŸåšã®æåã®æ¬¡ã®mæåããã®ãããªåèªã«è¿œå ããããã©ãããªã©ã§ãïŒã fix()
é¢æ°ã¯ç¹ã«åºå¥ãããŸãïŒããŒãµãŒã®ç¶æ
ãå€æŽãããšãæ°æåãããã«ç§»åãããšãä¿åãããäœçœ®ãšçŸåšã®äœçœ®ã®éã®ããã¹ãããããããšãã§ãããšããèãã§ãçŸåšã®ã·ã³ãã«ã®äœçœ®ãèšæ¶ããŸãã èšæ¶ãããäœçœ®ããçŸåšã®äœçœ®ãžã®ããã¹ãã®æçåã¯ã cut()
é¢æ°ã«ãã£ãŠå®è¡ãããŸãã éåžžã cut()
åŒã³åºããåŸãã¹ããŒããã·ã³ã¯ããŒãµãŒã«ä¿¡å·ãéä¿¡ããŸã-ããããèŠãŠãéå§ã¿ã°ããã£ãããããŸãããããã¯ãã®ååã§ããã ãªããããªã«è€éãªã®ã§ããïŒ ãŸã...ç§ã¯thçŽè
ã§ãã äžå¿
èŠã«äœåãªè¡ãäœæããªãããŒãµãŒãäœæããŸããã
å®ã¯ãåŸã§ãããŒãµãŒã®èãããããã¹ãŠã®ç¶æ
ãšèãããããã¹ãŠã®ã¢ã¯ã·ã§ã³ããªã¹ãããŸãã-圌ããèšãããã«ãã¹ããŒããã·ã³ãããã°ã©ã ããŸãã ã å±æ§åã«ã¯ãå±æ§ãèªå·±çµäºã¿ã°ãæå-
ããã³:
ãå²ãåŒçšç¬Šã«é¢é£ããå€ãã®ãã¥ã¢ã³ã¹ããããŸãã ããã§ã¯ããããã®åã±ãŒã¹ã®è©³çŽ°ãªåwingãçç¥ããŸãããã¹ãŠãã³ãŒãã«å«ãŸããŠãããããå¿
èŠã«å¿ããŠèªåã§ç¢ºèªã§ããŸãã
å¥ã®æ©èœïŒ style
script
ãšscript
ããŒãµãŒã¯åå¥ã«åãåããšè¿œå ãè¡ããããŒãµãŒãŠãŒã¶ãŒã決å®ãã ããããå®è¡ããããæ
æ²ãæ〠ãããã§æ¬¡ã«äœããã¹ããã ããšãã°ãã¹ã¯ãªããã®eval
ãäœæã§ããŸãã ããããã¹ã¿ã€ã«ãã©ããããã¯ãç§ã«ãšã£ãŠãäžæ確ãªè³ªåã§ãã ç§ã®å®è£
ã§èæ
®ãããŠããªãå¯äžã®ãã®ã¯ããããã®ã¿ã°ã®å¯èœæ§ã®ããããªãããŒãªæ§é ã§ãã script
å
ã§ã return '</script>';
ã¹ããªããreturn '</script>';
ããã¹ãã«ééãããšããŸãããreturn '</script>';
ãããŒãµãŒã¯ãããscript
ã¿ã°ãéãããšèª€ã£ãŠèªèãscript
ãããã¯äžå¿«ã§ãããç°¡åã«ä¿®åŸ©ãããŸã ç§ã¯æ ãè
ã§ã ã
å·®ãèšç®ãã
ãã®ãããçŸåšã®æ®µéã§ã¯ãHTMLã®äžéšãæž¡ãããããå®éã®DOMèŠçŽ ãŸãã¯VDOMèŠçŽ ã«è§£æã§ããæå¹ãªHTMLããŒãµãŒããããŸãã å®ç§ã§ãã
ããã€ãã®HTMLãæ¢ã«ç»é¢ã«ã¬ã³ããªã³ã°ãããŠãããšæ³åããŠãã ãããå°ãå€æŽããããšæããŸãã ãããåãåãã調æŽãè¡ããããŒãµãŒã«VDOMã³ã³ã¹ãã©ã¯ã¿ãŒããã£ãŒãããŸãã VDOMããŒãã®ãªã¹ããååŸããŸãã 次ã«ãç»é¢ã«è¡šç€ºãããHTMLãšãããŒãµãŒã解æããäºå®ãšã®å·®ãèšç®ããå¿
èŠããããŸãã å®éãHTMLãæç»ããã芪ããŒããååŸãããã®ãã¹ãŠã®åã®é
åãååŸããHTMLããŒãµãŒãäœæããä»®æ³åã®åãé
åãšæ¯èŒããå¿
èŠããããŸãã ãããŠãç§ããæ¯èŒããããšèšããšã-ç§ã¯ãäžèŽãããã©ããããšãã質åã«çããã ãã§ãªãããããã ããããã®æŽæ°ã-å€ãæšæããæ°ããèŠçŽ ãååŸããããã«è¿œå ããèŠçŽ ãšåé€ããèŠçŽ ã®ãªã¹ãã ãã®åŸãå€æŽã®çµæã®ãã³ãã«ã¯ããã§ã«ã¬ã³ããªã³ã°ãããŠå€æŽãããŠããªãHTMLãç Žå£ããã圱é¿ãåããããŒãã®ã¿ãå·§åŠã«å€æŽããã ãã§ããã§ã«ã¬ã³ããªã³ã°ãããHTMLã«ããŒã«ãããŸãã ãã®æäœã¯VDOM updateãšåŒã°ããŸãã ãã®ãããªãã®ã ãããããŸãæåã«ã
æ¯èŒãã£ãã·ã¥
æåã«ãHTMLããŒããšVDOMããŒããæ¯èŒããæ¹æ³ãåŠã¶å¿ èŠããããŸãã ããã¯æ¯èŒçç°¡åã«è¡ãããŸãïŒ
- ã¿ã€ããæ¯èŒããŸãã äžèŽããªãå ŽåãããŒãã¯ç°ãªããŸã
- äž¡æ¹ã®ããŒããããã¹ããŸãã¯ã³ã¡ã³ãã§ããå Žå-ã³ã³ãã³ããæ¯èŒããŸãã äžèŽããŸããïŒ åãã§ãã äžèŽããŸãããïŒ éãã
- å±æ§ã®æ°ãæ¯èŒããŸãã äžèŽããŸãããïŒ éãã
- å±æ§ã®ååšãšãã®å€ãæ¯èŒããŸãã äžèŽããªããã®ããããŸãããïŒ ããŠãããªãã¯ãã€ã³ããåŸãã
- åå«ããŒãããšã«æé 1ã4ãå®è¡ããŸãã
- ãããèªãã å ŽåãããŒãã¯ãŸã äžèŽããŠããŸãã
ã芧ã®ãšãããæ¯åããŒããæåããæ¯èŒããã®ã¯æéãããããŸãã äž»ã«ã¹ããã5ã®ååž°ãåå ã§ãã ãããã£ãŠã1ã€ã®æŽæ°ã®ãã¬ãŒã ã¯ãŒã¯å ã«ååšããããŒãã®çžäºã®æ¯èŒçµæãä¿åãããã£ãã·ã¥ã³ã³ãã¬ãŒã¿ãŒãäœæããŸããã ãããã£ãŠã2ã€ã®ããŒããç°ãªããšããäºå®ããã§ã«ã€ã³ã¹ããŒã«ãããŠããå Žåãå床ã€ã³ã¹ããŒã«ãããã®ã§ã¯ãªãããã£ãã·ã¥ããååŸãããŸãã åãã³ãŒãããããã ã
LCS
ããã¯ãLongest Common Subsequenceã®ç¥ã§ãã ãã®ã¯ã©ã¹ã¯åºæ¬çã«ãåçããã°ã©ãã³ã°ã䜿çšããŠLCSåé¡ã解決ããããã®ãããªãã¯ã¹ã§ãã å
¥åã«2ã€ã®é
åïŒäžæ¹ã¯å®éã®ããŒããããäžæ¹ã¯ä»®æ³ããŒãïŒãæž¡ããäžèšã§èª¬æããæ¯èŒãã£ãã·ã¥ã«ããã£ãŒãããŸãã 次ã«ã produceModifyBatch
ãåŒã³åºããŠã ããããšã³ããªã®é
åïŒäžçªäžã§èª¬æïŒãååŸããŸã ãããã¯ããã®ãããªããŒãã§äœãè¡ãå¿
èŠããããã瀺ããŠããŸãã
ãŸãã produceModifyBatch
ãåŒã³åºããåŸãLCSã¯é
åã®æåãšæåŸããåãèŠçŽ ãåãæšãŠãŸãïŒ doSkips
é¢æ°ïŒã 次ã«ãæ®ãã®ããŒã¿ã¯åçããã°ã©ãã³ã°ãããªãã¯ã¹ã«åºã¥ããŠããŸã- ãã®ãããªã§èª¬æãããšããã§ãã 次ã«ãããããã€ãã¹ããŠã åé€ããããŒããšè¿œå ããããŒãã決å®ããŸãïŒãããªã§ã説æãããŠããŸãïŒã ãã®æ®µéã§ã¯ã æŽæ°ããå¿
èŠãããããŒãã®ãªã¹ããååŸããªãããšã«æ³šæããŠãã ããã çµæã«ã¯åé€ãšè¿œå ã®ã¿ãå«ãŸããŸãããïŒ ãã ããåãå Žæãžã®ããŒãã®åé€ãšè¿œå ïŒãŸãã¯è¿œå ãšåé€ïŒã¯updateã§ãã normalizeBatch
æäœã¯ã1åã®æäœã§é£æ¥ããè¿œå ãšåé€ãæãããã- æŽæ° ãããããšã³ããªã®ãã©ã€ããªé
åã®åãã©ãŒããããè¡ãã ãã§ãã çµæã¯æçµçã«å¹žããªãŠãŒã¶ãŒã«è¿ãããšãã§ããŸãã
LCSã¯VDOMã®æãé£ããéšåã§ãããå€ãã®äººã«ãšã£ãŠæãããéæ³ã®ããã«èŠããŸãã ããªããèŠãããšãã§ããããã«ã圌ããèšãããã«ãã¢ã«ãŽãªãºã èªäœã¯ããªãããŒã§ãããéåžžã«ç解å¯èœã§ãã ã¡ãªã¿ã«ããã®è€éãã¯äºæ¬¡ã§ãããå¿é
ããããšã¯ãããŸããã å€æŽãæ¯èŒçå°ãªããèŠçŽ ã®æã®éäžã«ããå Žåããããã®ã»ãšãã©ã¯doSkips
ã¹ããŒãžã§doSkips
ããããã®çµæãåçããã°ã©ãã³ã°ãããªãã¯ã¹ã®ãµã€ãºã3x3ãè¶
ããããšã¯ãŸãã§ãã ãã¡ããããŠãŒã¶ãŒããäºãã®äžã«ç«ã£ãŠ1äžåã®ãã¿ã³ãåæç»ããªãå Žåã å®éã«ã¯ããã®ãããªã±ãŒã¹ã¯ãŸãã§ãã ãããã£ãŠãèŠçŽ ã2ã€ãŸãã¯1ã€ããå Žåã¯LCSãããªãã¯ã¹ãäœæãããçµæãæã§åŠçããã®ãçã«ããªã£ãŠããŸãã å®éã«ã¯ãå€ãã®å ŽåãèŠçŽ ã®å€§ããªãã¹ãããããŸãã ãã ããJSã®åŒã³åºãã¹ã¿ãã¯ãäžæããã«ã¯äžååã§ãïŒããã«ååž°çãªåŠçãè¡ããŸãïŒã ãããŠç§ãã¡ã¯çããŠããŸãã , React.js â . â . .
DOM Differ
, update, parent-, LCS-, HTML- . , , â , . ã³ã¡ã³ãã¯ãããŸããã
! !
update: parent-, VDOM-. LCS, update batch. , , , , â . , â updateAttributes
, update, (, VDOM--). : , â , parent.insertBefore
. , â parent.removeChild
. . .
diff
, update batch-. , .
æã£ãŠ
ãŸãšã
, VDOM. , , , JS-. -, , HTML- â , .
, .