CSSã³ã³ããã¯ãšãªãã£ãã·ã¥ç®¡çã®è©³çްãæé©åæŠç¥ãããã©ãŒãã³ã¹ã®å©ç¹ãã°ããŒãã«ãŠã§ãéçºã®ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠè§£èª¬ã
CSSã³ã³ããã¯ãšãªãã£ãã·ã¥ç®¡çãšã³ãžã³ïŒã¯ãšãªãã£ãã·ã¥ã®æé©å
ãŠã§ãéçºãé²åãç¶ããäžã§ãæé©ãªããã©ãŒãã³ã¹ã®éæã¯æéèŠèª²é¡ã§ãããŠã§ããµã€ããè€éåãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãããåçã«ãªãã«ã€ããŠãããã³ããšã³ãéçºè ã¯èªã¿èŸŒã¿é床ãšã¬ã³ããªã³ã°å¹çãåäžãããããã®æŠç¥ãåžžã«æš¡çŽ¢ããŠããŸãã倧ããªé²æ©ãèŠãããåéã®1ã€ã¯ãç¹ã«ã³ã³ããã¯ãšãªã®ç»å Žã«ããCSSã®ç®¡çã§ãããã®èšäºã§ã¯ãCSSã³ã³ããã¯ãšãªãã£ãã·ã¥ç®¡çãšã³ãžã³ã®è€éããæãäžãã广çãªã¯ãšãªãã£ãã·ã¥ã®æé©åããã°ããŒãã«ãªèŠèŽè ã«åããŠææ°ã®Webã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåçã«åäžãããæ¹æ³ãæ¢ããŸãã
CSSã³ã³ããã¯ãšãªã®çè§£
ãã£ãã·ã¥ç®¡çã«å ¥ãåã«ãCSSã³ã³ããã¯ãšãªã®åºæ¬æŠå¿µãçè§£ããããšãäžå¯æ¬ ã§ãããã¥ãŒããŒããµã€ãºã«å¯Ÿå¿ããåŸæ¥ã®ã¡ãã£ã¢ã¯ãšãªãšã¯ç°ãªããã³ã³ããã¯ãšãªã¯ãã³ã³ããŒãã³ãã芪ã³ã³ããã®å¯žæ³ã«åºã¥ããŠã¹ã¿ã€ã«ãé©å¿ãããããšãã§ããŸããããã«ãããã¬ã¹ãã³ã·ããã¶ã€ã³ã«å¯Ÿãããããã现ãããã³ã³ããŒãã³ãäžå¿ã®ã¢ãããŒããæäŸãããéçºè ã¯ãå šäœçãªããŒãžã¬ã€ã¢ãŠãããã¥ãŒããŒãã«é¢ä¿ãªããç¹å®ã®ã³ã³ããã¹ãã«é©å¿ãããçã«èªå·±å®çµåã§åå©çšå¯èœãªUIèŠçŽ ãæ§ç¯ã§ããŸãã
ã³ã³ããã¯ãšãªã®æ¡çšã¯ãç¹ã«è€éãªãã¶ã€ã³ã·ã¹ãã ãã³ã³ããŒãã³ãã©ã€ãã©ãªã«å¯ŸããŠãã¬ã€ã¢ãŠãã管çããããã®ããå ç¢ã§æè»ãªæ¹æ³ãçŽæããŸããããããä»ã®æ°ãããã¯ãããžãŒãšåæ§ã«ããã®å®è£ ã¯ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé ãå°å ¥ããå¯èœæ§ããããŸããããã§ãã³ã³ããã¯ãšãªã®ãã£ãã·ã¥ç®¡çãšã³ãžã³ã®æŠå¿µãäžå¯æ¬ ã«ãªããŸãã
ã³ã³ããã¯ãšãªã®ãã£ãã·ã¥ã®èª²é¡
ãã©ãŠã¶ãã³ã³ããã¯ãšãªã«ééãããšããæ¬¡ã®ããšãè¡ãå¿ èŠããããŸã:
- 芪ã³ã³ãããèå¥ããã
- ã³ã³ããã®å¯žæ³ã枬å®ããã
- ã³ã³ããã¯ãšãªã®æ¡ä»¶ãè©äŸ¡ããã
- æ¡ä»¶ãæºããããŠããå Žåã¯ãé¢é£ããã¹ã¿ã€ã«ãé©çšããã
倿°ã®ã³ã³ããŒãã³ããæã€è€éãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ããããããè€æ°ã®ã³ã³ããã¯ãšãªãæã€å¯èœæ§ãããããããã®ããã»ã¹ã¯èšç®éçŽçã«ãªãå¯èœæ§ããããŸãããããã®æ¡ä»¶ãç¹°ãè¿ã枬å®ããã³è©äŸ¡ããããšã¯ãç¹ã«åçãªãµã€ãºå€æŽãã³ã³ãã³ãã®å€æŽäžã«ã次ã®ãããªçµæã«ã€ãªããå¯èœæ§ããããŸã:
- CPU䜿çšçã®å¢å ïŒã¹ã¿ã€ã«ãç¶ç¶çã«åèšç®ãããšããã©ãŠã¶ã®åŠçèœåãå§è¿«ãããå¯èœæ§ããããŸãã
- ã¬ã³ããªã³ã°æéã®é å»¶ïŒãã©ãŠã¶ãèŠèŠçåºåãã¬ã³ããªã³ã°ããããããCSSã®åŠçã«å€ãã®æéãè²»ããå¯èœæ§ããããŸãã
- ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®é å»¶ïŒã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ããã¹ã¿ã€ã«ã®åèšç®ã®ãªãŒããŒãããã«ããå¿çããªããªãå¯èœæ§ããããŸãã
ããã§ãã€ã³ããªãžã§ã³ããªã¯ãšãªãã£ãã·ã¥ç®¡çãšã³ãžã³ã®å¿ èŠæ§ãçããŸããç®æšã¯ãã³ã³ããã¯ãšãªè©äŸ¡ã®çµæãä¿åããã³åå©çšããããšã«ãããåé·ãªèšç®ãæå°éã«æããããšã§ãã
CSSã³ã³ããã¯ãšãªãã£ãã·ã¥ç®¡çãšã³ãžã³ãšã¯ïŒ
CSSã³ã³ããã¯ãšãªãã£ãã·ã¥ç®¡çãšã³ãžã³ã¯ãã¯ãšãªè©äŸ¡ã®çµæãã€ã³ããªãžã§ã³ãã«ä¿åãååŸãããã³ç¡å¹ã«ããããšã«ãããã³ã³ããã¯ãšãªã®ããã©ãŒãã³ã¹ãæé©åããããã«èšèšãããã·ã¹ãã ãŸãã¯äžé£ã®ã¢ã«ãŽãªãºã ã§ããæ¬è³ªçã«ããã©ãŠã¶ãåãé«ã³ã¹ããªèšç®ãç¹°ãè¿ãå®è¡ããã®ãé²ãã¹ããŒããªã¬ã€ã€ãŒãšããŠæ©èœããŸãã
ãã®ãããªãšã³ãžã³ã®äž»èŠãªæ©èœã«ã¯ãéåžžã以äžãå«ãŸããŸã:
- ãã£ãã·ã³ã°ïŒç¹å®ã®ã³ã³ããã®ç¶æ ïŒå¹ ãé«ãããŸãã¯ãã®ä»ã®å±æ§ã«åºã¥ããªã©ïŒã«å¯ŸããŠèšç®ãããã¹ã¿ã€ã«ãä¿åããã
- ç¡å¹åïŒãã£ãã·ã¥ãããçµæãæå¹ã§ãªããªããåèšç®ããå¿ èŠãããå ŽåïŒã³ã³ããã®å¯žæ³ã倿Žãããå ŽåããŸãã¯ã³ã³ãã³ããæŽæ°ãããå Žåãªã©ïŒã倿ããã
- åªå é äœä»ãïŒãã£ãã·ã¥ããã³åèšç®ããããšãæãéèŠã§ããã¯ãšãªãç¹å®ããŸããããã¯ã䜿çšé »åºŠãŸãã¯æœåšçãªããã©ãŒãã³ã¹ãžã®åœ±é¿ã«åºã¥ããŠè¡ãããããšããããããŸãã
- ãšãã¯ã·ã§ã³ïŒã¡ã¢ãªäœ¿çšéã管çããããã«ãå€ããªã£ããšã³ããªãŸãã¯ããŸã䜿çšãããŠããªããã£ãã·ã¥ãšã³ããªãåé€ããã
æçµçãªç®çã¯ãå¯èœãªéããã£ãã·ã¥ãããããŒã¿ã掻çšãã絶察ã«å¿ èŠãªå Žåã«ã®ã¿å®å šãªåèšç®ãå®è¡ããããšã«ãããã¹ã¿ã€ã«ãå¹ççã«é©çšãããããã«ããããšã§ãã
ã¯ãšãªãã£ãã·ã¥æé©åã®äž»èŠãªåå
ã³ã³ããã¯ãšãªã®ã¯ãšãªãã£ãã·ã¥ãæé©åããã«ã¯ã管çãšã³ãžã³ã®èšèšãšå®è£ ãå°ãããã€ãã®äž»èŠãªååãå«ãŸããŸã:
1. ãã£ãã·ã³ã°ã®ç²åºŠ
ãã£ãã·ã³ã°ã®æå¹æ§ã¯ãçµæãã©ã®çšåºŠãã现ããä¿åãããã«äŸåããŸããã³ã³ããã¯ãšãªã®å Žåãããã¯æ¬¡ã®ããšãæå³ããŸã:
- ã³ã³ããåºæã®ãã£ãã·ã³ã°ïŒã°ããŒãã«ãã£ãã·ã¥ã§ã¯ãªããåã ã®ã³ã³ããŒãã³ããŸãã¯èŠçŽ ã®ã¹ã¿ã€ã«ããã£ãã·ã¥ããŸããããã¯ãã³ã³ããã¯ãšãªãã³ã³ããŒãã³ãäžå¿ã§ãããããç¹ã«éèŠã§ãã
- 屿§ããŒã¹ã®ãã£ãã·ã³ã°ïŒã¯ãšãªãããªã¬ãŒããã³ã³ããã®ç¹å®ã®å¯žæ³ãŸãã¯ãã®ä»ã®é¢é£å±æ§ã«åºã¥ããŠçµæãä¿åããŸããããšãã°ãã«ãŒãã³ã³ããŒãã³ãã®å¹ ã300pxã500pxããŸãã¯800pxã®å Žåã«ã¹ã¿ã€ã«ããã£ãã·ã¥ããŸãã
- ç¶æ ããŒã¹ã®ãã£ãã·ã³ã°ïŒã³ã³ãããç°ãªãç¶æ ïŒããšãã°ãã¢ã¯ãã£ããéã¢ã¯ãã£ãïŒã®å Žåããã£ãã·ã³ã°ããããã®ç¶æ ãèæ ®ããå¿ èŠãããå ŽåããããŸãã
2. å¹ççãªç¡å¹åæŠç¥
ãã£ãã·ã¥ã¯ãææ°ã®ç¶æ ãç¶æããèœåã«ãã£ãŠã®ã¿åªããŠããŸããç¡å¹åã¯ããã£ãã·ã¥ç®¡çã®éèŠãªåŽé¢ã§ããã³ã³ããã¯ãšãªã®å Žåãããã«ã¯ä»¥äžãå«ãŸããŸã:
- 寞æ³ã®å€æŽæ€åºïŒãšã³ãžã³ã¯ãã³ã³ããã®ãµã€ãºã倿Žãããããšãæ€åºã§ããå¿ èŠããããŸããããã«ã¯ãDOMã®å€æŽãç£èŠãããã`ResizeObserver`ã䜿çšããããšããããããŸãã
- ã³ã³ãã³ã倿޿€åºïŒã³ã³ããå ã®ã³ã³ãã³ãã®å€æŽã¯ããã®å¯žæ³ã«åœ±é¿ãäžããå¯èœæ§ããããåè©äŸ¡ãå¿ èŠã«ãªããŸãã
- æåç¡å¹åïŒäžéšã®åçãªã·ããªãªã§ã¯ãéçºè ã¯ç¹å®ã®ã³ã³ããŒãã³ãã®ãã£ãã·ã¥ç¡å¹åãæåã§ããªã¬ãŒããå¿ èŠãããå ŽåããããŸãã
æŠç¥ã¯ã倿Žãæ€åºãããã¯ãšãªæ¡ä»¶ã«åœ±é¿ããå Žåã«ã®ã¿åèšç®ãè¡ãlazy invalidationãç®çãšããå¿ èŠããããŸãã
3. ãã£ãã·ã¥ãšãã¯ã·ã§ã³ããªã·ãŒ
ãã£ãã·ã¥ãããã¯ãšãªã®æ°ãå¢ãããšãã¡ã¢ãªæ¶è²»ãåé¡ã«ãªãå¯èœæ§ããããŸãã广çãªãšãã¯ã·ã§ã³ããªã·ãŒãå®è£ ããããšãäžå¯æ¬ ã§ã:
- Least Recently Used (LRU): æè¿ã¢ã¯ã»ã¹ãããŠããªããã£ãã·ã¥ãšã³ããªãåé€ããŸãã
- Least Frequently Used (LFU): ã¢ã¯ã»ã¹é »åºŠã®äœããšã³ããªãåé€ããŸãã
- Time-To-Live (TTL): ãã£ãã·ã¥ãšã³ããªãæå¹ã§ããæéã®å¶éãèšå®ããŸãã
- ãµã€ãºããŒã¹ã®ãšãã¯ã·ã§ã³ïŒãã£ãã·ã¥ã®åèšãµã€ãºãå¶éããå¶éã«éãããšãã«ãšã³ããªãåé€ããŸãã
ããªã·ãŒã®éžæã¯ãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã®åäœãšãªãœãŒã¹ã®å¶çŽã«ãã£ãŠç°ãªããŸãã
4. ãã£ãã·ã¥ã®äºåèšç®ãšåæå
ç¹å®ã®ã·ããªãªã§ã¯ããã£ãã·ã¥ãäºåã«èšç®ããŠåæåãããšãå€§å¹ ãªããã©ãŒãã³ã¹åäžãåŸãããŸããããã«ã¯ã以äžãå«ãŸããå ŽåããããŸã:
- ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒïŒã³ã³ããã¯ãšãªããµãŒããŒäžã§è©äŸ¡ãããå Žåããã®çµæãåæHTMLã«åã蟌ãããšãã§ããããŒãæã®ã¯ã©ã€ã¢ã³ãåŽã®èšç®ãåæžãããŸãã
- æŠç¥çãªäºåèšç®ïŒäžè¬çãªã³ã³ãããµã€ãºãŸãã¯ç¶æ ã®å Žåãã¹ã¿ã€ã«ãäºåã«èšç®ãããšãå®è¡æã®åèšç®ãé²ãããšãã§ããŸãã
5. ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãšã®çµ±å
ããã©ãŒãã³ã¹ã®é«ããã£ãã·ã¥ç®¡çãšã³ãžã³ã¯ããã©ãŠã¶ã®ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãšã·ãŒã ã¬ã¹ã«çµ±åããå¿ èŠããããŸããããã¯ã以äžãçè§£ããããšãæå³ããŸã:
- ãã£ãã·ã¥ã確èªããã¿ã€ãã³ã°ïŒã³ã³ããã¯ãšãªã®ã¹ã¿ã€ã«ã®èšç®ãå®è¡ããåã
- ãã£ãã·ã¥ãæŽæ°ããã¿ã€ãã³ã°ïŒã¹ã¿ã€ã«ãèšç®ãããé©çšãããåŸã
- åã¬ã³ããªã³ã°ãããªã¬ãŒããæ¹æ³ïŒã³ã³ããã¯ãšãªã«ããã¹ã¿ã€ã«ã®å€æŽãããã®åŸã®ã¬ã€ã¢ãŠããšãã€ã³ãæäœãæ£ããããªã¬ãŒããããã«ããã
å®è·µçãªå®è£ æŠç¥ãšäŸ
å ç¢ãªCSSã³ã³ããã¯ãšãªãã£ãã·ã¥ç®¡çãšã³ãžã³ãå®è£ ããã«ã¯ããã©ãŠã¶ãã€ãã£ãæ©èœã®æŽ»çšããã«ã¹ã¿ã JavaScriptãœãªã¥ãŒã·ã§ã³ã®æ¡çšãŸã§ãããã€ãã®æ¹æ³ããããŸãã
ãã©ãŠã¶ãã€ãã£ãæ©èœã®æŽ»çš
ææ°ã®ãã©ãŠã¶ã¯ãCSSã®åŠçæ¹æ³ã«ãããŠãŸããŸãæŽç·ŽãããŠããŸãã ãã³ã³ããã¯ãšãªãã£ãã·ã¥ç®¡çãšã³ãžã³ããšããååã®çŽæ¥çãªãã©ãŠã¶APIã¯ãããŸãããããã©ãŠã¶ã¯å éšçãªæé©åã䜿çšããŠããŸã:
- å¹ççãªResize ObserversïŒãã©ãŠã¶ã¯ãã³ã³ããã®ãµã€ãºå€æŽã€ãã³ããæ€åºããããã«å¹ççãªã¡ã«ããºã ã䜿çšããŠããŸãã `ResizeObserver`ãèŠçŽ ã«ã¢ã¿ããããããšããã©ãŠã¶ã®ã¬ã³ããªã³ã°ãšã³ãžã³ã¯ããµã€ãºå€æŽã«ã€ããŠJavaScriptãŸãã¯CSSãšã³ãžã³ã«å¹ççã«éç¥ã§ããŸãã
- ã¹ã¿ã€ã«åèšç®ã®æé©åïŒãã©ãŠã¶ã¯ãã€ã³ããªãžã§ã³ããªã¹ã¿ã€ã«ã®åèšç®ãå®è¡ããŸãã倿Žã®åœ±é¿ãåããCSSã«ãŒã«ã®ã¿ãåè©äŸ¡ããããšãç®æããŠããŸããã³ã³ããã¯ãšãªã®å Žåãããã¯ã1ã€ã®èŠçŽ ã®ãµã€ãºã倿Žããããšãã«ã*ãã¹ãŠ*ã®èŠçŽ ã®*ãã¹ãŠ*ã®ã³ã³ããã¯ãšãªãå¿ ãããåè©äŸ¡ããããã§ã¯ãªãããšãæå³ããŸãã
ãã ãããããã®ãã€ãã£ãæé©åã¯ã倿°ã®æ·±ããã¹ããããã³ã³ããŒãã³ããšè€éãªã³ã³ããã¯ãšãªããžãã¯ãæã€éåžžã«è€éãªã¢ããªã±ãŒã·ã§ã³ã«ã¯ãå¿ ãããååã§ã¯ãªãå ŽåããããŸãã
ã«ã¹ã¿ã JavaScriptãœãªã¥ãŒã·ã§ã³
é«åºŠãªå¶åŸ¡ãšæé©åã®ããã«ãéçºè ã¯ã«ã¹ã¿ã ãœãªã¥ãŒã·ã§ã³ãæ§ç¯ã§ããŸããããã«ã¯ãJavaScriptã`ResizeObserver`ãããã³ã«ã¹ã¿ã ãã£ãã·ã³ã°ã¡ã«ããºã ãçµã¿åããããããšããããããŸãã
äŸã®ã·ããªãªïŒã³ã³ããã¯ãšãªãåããã«ãŒãã³ã³ããŒãã³ã
eã³ããŒã¹ãµã€ãå šäœã§äœ¿çšãããã¬ã¹ãã³ã·ãã«ãŒãã³ã³ããŒãã³ããèããŠã¿ãŸãããããã®ã«ãŒãã¯ãå¹ ã«åºã¥ããŠç°ãªãã¬ã€ã¢ãŠãã衚瀺ããå¿ èŠããããŸãã
.card {
display: grid;
grid-template-columns: 1fr;
gap: 1rem;
}
@container (min-width: 500px) {
.card {
grid-template-columns: 1fr 2fr;
}
}
@container (min-width: 800px) {
.card {
grid-template-columns: 2fr 1fr;
}
}
å€§èŠæš¡ãªååãªã¹ãããŒãžã§ã¯ããããã®ã«ãŒããæ°çŸåããå¯èœæ§ããããŸãããã£ãã·ã¥ããªãå Žåãåã«ãŒãã¯ãããŒãžã®ãµã€ãºã倿Žãããããã¢ãŒãã«ãã³ã³ãã³ãã®äžéšããªãŒããŒã¬ã€ãããã³ã«ã¹ã¿ã€ã«ãåè©äŸ¡ããå¯èœæ§ããããããã©ãŒãã³ã¹ã«åœ±é¿ãäžããŸãã
ã·ã³ãã«ãªJavaScriptãã£ãã·ã¥ã®å®è£
åºæ¬çãªJavaScriptãã£ãã·ã¥ã¯ã次ã®ããã«æ©èœããå¯èœæ§ããããŸã:
- ã³ã³ããŒãã³ãã®ç¶æ ãä¿åããïŒåã«ãŒãã€ã³ã¹ã¿ã³ã¹ã«ã€ããŠãçŸåšã®æå¹ãªã³ã³ããå¹ ãšé©çšãããã¹ã¿ã€ã«ã®ã¬ã³ãŒããä¿æããŸãã
- `ResizeObserver`ã䜿çšããïŒåã«ãŒãèŠçŽ ã«`ResizeObserver`ãã¢ã¿ããããŸãã
- ãµã€ãºå€æŽæïŒ`ResizeObserver`ã³ãŒã«ããã¯ãèµ·åãããšãã«ãŒãã®æ°ãã寞æ³ãååŸããŸãã
- ãã£ãã·ã¥ã確èªããïŒãã£ãã·ã¥ã§ã«ãŒãã®çŸåšã®ç¶æ ãæ€çŽ¢ããŸããæ°ãã寞æ³ããã¹ã¿ã€ã«å€æŽãå¿ èŠãšããªãç¯å²å ã«ããå ŽåïŒã¯ãšãªãã¬ãŒã¯ãã€ã³ãã«åºã¥ãïŒãäœãè¡ããŸããã
- åè©äŸ¡ããŠãã£ãã·ã¥ãæŽæ°ããïŒå¯žæ³ããã¹ã¿ã€ã«ã倿Žããå¯èœæ§ã®ããã»ã©å€åããå Žåãã³ã³ããã¯ãšãªãåè©äŸ¡ããŸãïŒãŸãã¯ãã©ãŠã¶ã«åŠçãããŸããããã£ãã·ã¥ãæŽæ°ãããããã«ããŸãïŒãæ°ããç¶æ ã§ãã£ãã·ã¥ãæŽæ°ããå¿ èŠã«å¿ããŠãæç€ºçãªå¶åŸ¡ã®ããã«æ°ããã¯ã©ã¹ãŸãã¯ã€ã³ã©ã€ã³ã¹ã¿ã€ã«ãé©çšããŸãã
äŸã®JavaScriptã¹ããããïŒæŠå¿µçïŒïŒ
class ContainerQueryCache {
constructor() {
this.cache = new Map(); // Stores { elementId: { width: number, appliedStyles: string[] } }
}
async processElement(element) {
const elementId = element.id || Math.random().toString(36).substring(7); // Ensure unique ID
if (!element.id) element.id = elementId;
const rect = element.getBoundingClientRect();
const currentWidth = rect.width;
const cachedData = this.cache.get(elementId);
// Simplified logic: only re-evaluate if width changes significantly or not cached
if (!cachedData || Math.abs(currentWidth - cachedData.width) > 10) {
// In a real scenario, you'd more intelligently determine if style changes are needed
// Here, we rely on browser's inherent handling triggered by potential size change.
// The primary benefit is avoiding redundant JS calculations.
console.log(`Container width changed for ${elementId}. Re-evaluating if necessary.`);
this.cache.set(elementId, { width: currentWidth, appliedStyles: [] }); // Update cache
// Potentially, trigger a re-computation or style update here if needed
// e.g., by forcing a reflow or applying/removing classes based on query logic.
} else {
console.log(`Container width for ${elementId} is within tolerance. Using cached state.`);
}
}
}
const cacheManager = new ContainerQueryCache();
// Observe all elements with a specific class, or a data attribute
document.querySelectorAll('.card').forEach(cardElement => {
const observer = new ResizeObserver(entries => {
for (let entry of entries) {
cacheManager.processElement(entry.target);
}
});
observer.observe(cardElement);
// Initial processing
cacheManager.processElement(cardElement);
});
ãã®æŠå¿µçãªäŸã¯ãã«ã¹ã¿ã ãã£ãã·ã¥ãã³ã³ãããµã€ãºã远跡ããäžèŠãªååŠçãåé¿ããæ¹æ³ã匷調ããŠããŸããå®éã®å®è£ ã¯ãã¹ã¿ã€ã«ã®é©ç𿹿³ïŒããšãã°ãCSSã¯ã©ã¹ã®è¿œå /åé€ïŒã«ãã£ãŠç°ãªããŸãã
ãã¬ãŒã ã¯ãŒã¯åºæã®æé©å
ææ°ã®JavaScriptãã¬ãŒã ã¯ãŒã¯ïŒReactãVueãAngularïŒã¯ãã³ã³ããŒãã³ãã®ç¶æ ã管çããDOMã®å€æŽã«å¯Ÿå¿ããããã®ç¬èªã®ã¡ã«ããºã ãæäŸããããšããããããŸããã³ã³ããã¯ãšãªããžãã¯ããããã®ãã¬ãŒã ã¯ãŒã¯ãšçµ±åãããšã次ã®ããšãå¯èœã«ãªããŸã:
- ããã©ãŒãã³ã¹ããã¯ïŒReactã§`useRef`ã`useEffect`ã`useCallback`ã䜿çšããããä»ã®ãã¬ãŒã ã¯ãŒã¯ã§åæ§ã®ããã¯ã䜿çšããŠã`ResizeObserver`ã€ã³ã¹ã¿ã³ã¹ãšãã£ãã·ã¥ããŒã¿ã管çããŸãã
- ã¡ã¢åïŒ`React.memo`ãªã©ã®ææ³ã¯ãã³ã³ãããµã€ãºã®å€æŽã®åœ±é¿ãåããªãã³ã³ããŒãã³ãã®äžèŠãªåã¬ã³ããªã³ã°ãé²ãã®ã«åœ¹ç«ã¡ãŸãã
- ç¶æ 管çïŒéäžç¶æ 管çãœãªã¥ãŒã·ã§ã³ã¯ãããŸããŸãªã³ã³ããŒãã³ãéã§ã³ã³ãããµã€ãºã«é¢ããæ å ±ãä¿åããŠå ±æããå¯èœæ§ããããŸãã
ããšãã°ãReactã®ã«ã¹ã¿ã ããã¯ã¯ã`ResizeObserver`ããžãã¯ãšãã£ãã·ã¥ãã«ãã»ã«åããŠãã³ã³ããã¯ãšãªã®å¿çæ§ãå¿ èŠãšãããã¹ãŠã®ã³ã³ããŒãã³ãã«ç°¡åã«é©çšã§ããããã«ããããšãã§ããŸãã
ããŒã«ãšã©ã€ãã©ãª
ã³ã³ããã¯ãšãªã®å®è£ ãšç®¡çãç°¡çŽ åããããã«ãããã€ãã®ã©ã€ãã©ãªãšããŒã«ãç»å ŽããŠããŸã:
- CSSããªãã£ã«ïŒãŸã ã³ã³ããã¯ãšãªãå®å šã«ãµããŒãããŠããªããã©ãŠã¶ã®å Žåãããªãã£ã«ãäžå¯æ¬ ã§ãããããã®ããªãã£ã«ã«ã¯ãç¬èªã®ãã£ãã·ã³ã°ããã³åè©äŸ¡ããžãã¯ãçµã¿èŸŒãŸããŠããããšããããããŸãã
- ã³ã³ããŒãã³ãã©ã€ãã©ãªïŒã³ã³ããã¯ãšãªã念é ã«çœ®ããŠæ§ç¯ãããUIã³ã³ããŒãã³ãã©ã€ãã©ãªã«ã¯ãå¿çæ§ãåŠçããããã®æé©åãããå éšã¡ã«ããºã ããããããŸãã
- ããã©ãŒãã³ã¹ç£æ»ããŒã«ïŒLighthouseãWebPageTestããã©ãŠã¶éçºè ããŒã«ïŒ[ããã©ãŒãã³ã¹]ã¿ãïŒãªã©ã®ããŒã«ã¯ãã³ã³ããã¯ãšãªã®åèšç®ãªã©ãCSSãšJavaScriptã®å®è¡ã«é¢é£ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããã®ã«éåžžã«åœ¹ç«ã¡ãŸãã
æé©åãããã¯ãšãªãã£ãã·ã¥ã®ããã©ãŒãã³ã¹äžã®å©ç¹
广çãªCSSã³ã³ããã¯ãšãªãã£ãã·ã¥ç®¡çãšã³ãžã³ãWebããã©ãŒãã³ã¹ã«äžãã圱é¿ã¯éåžžã«å€§ããã§ã:
- CPUè² è·ã®è»œæžïŒåé·ãªã¹ã¿ã€ã«ã®èšç®ãæå°éã«æããããšã§ããã©ãŠã¶ã®CPU䜿çšçãæžå°ããããã¹ãããã®å¹ãããšã¯ã¹ããªãšã³ã¹ãå®çŸããŸãã
- ã¬ã³ããªã³ã°ã®é«éåïŒCSSã®èšç®ã«è²»ããæéãå°ãªããªããšããããšã¯ããã©ãŠã¶ããã¯ã»ã«ãã¬ã³ããªã³ã°ããããã«å©çšã§ããæéãé·ããªããããŒãžã®èªã¿èŸŒã¿ãéããªãããã©ã³ãžã·ã§ã³ãã¹ã ãŒãºã«ãªããŸãã
- ã€ã³ã¿ã©ã¯ãã£ããã£ã®åäžïŒããã¯ã°ã©ãŠã³ãåŠçãå°ãªãããšã§ãJavaScriptãããå¹ççã«å®è¡ã§ãããããã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ã®å¿çæ§ãåäžããŸãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäžïŒæçµçã«ããããã®æé©åã¯ãã¹ãŠãããåªããã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«è²¢ç®ããŸããããã¯ãã°ããŒãã«ã«ãŠãŒã¶ãŒãç¶æããããã«äžå¯æ¬ ã§ãã
ããŸããŸãªç»é¢ãµã€ãºãšåããæã€ããŸããŸãªããã€ã¹ã§è£œåãé²èЧããã°ããŒãã«ãªeã³ããŒã¹ãã©ãããã©ãŒã ãèããŠã¿ãŸããããæé©åãããã³ã³ããã¯ãšãªã¯ã補åãªã¹ããã·ãŒã ã¬ã¹ãã€è¿ éã«é©å¿ãããŠãŒã¶ãŒã®å Žæãããã€ã¹ã«é¢ä¿ãªããäžè²«ãã髿§èœãªãšã¯ã¹ããªãšã³ã¹ãæäŸããããšãä¿èšŒããŸããããšãã°ãæ±äº¬ã®ã¿ãã¬ããã䜿çšããŠãããŠãŒã¶ãŒã¯ããã®ãµã€ãºã«åãããŠæé©åããã補åã°ãªããã衚瀺ããå¯èœæ§ããããããã€ã¹ãå転ããããšãå¹ççãªãã£ãã·ã³ã°ãšåè©äŸ¡ã«ãããã°ãªããã¯ã»ãŒç¬æã«åæ§æãããŸãã
ã°ããŒãã«ãªå®è£ ã®ããã®ãã¹ããã©ã¯ãã£ã¹
ã°ããŒãã«ãªèŠèŽè åãã«ã³ã³ããã¯ãšãªãã£ãã·ã¥ç®¡çãèšèšããã³å®è£ ããå Žåã¯ãããã€ãã®ãã¹ããã©ã¯ãã£ã¹ãé å®ããå¿ èŠããããŸã:
- ããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ãïŒã³ã³ããã¯ãšãªãå®å šã«ãµããŒããããŠããªãå ŽåããŸãã¯JavaScriptãç¡å¹ã«ãªã£ãŠããå Žåã§ããã³ã¢æ©èœãšã³ã³ãã³ãã«ã¢ã¯ã»ã¹ã§ããããšã確èªããŠãã ãããæ¢åã®ã¬ã¹ãã³ã·ããã¶ã€ã³ãžã®æ¡åŒµæ©èœãšããŠã³ã³ããã¯ãšãªãå®è£ ããŸãã
- ã¯ãã¹ãã©ãŠã¶ããã³ã¯ãã¹ããã€ã¹ã®ãã¹ãïŒå¹ åºããã©ãŠã¶ãããã€ã¹ãããã³ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§å®è£ ãå³å¯ã«ãã¹ãããŸããå€ãã®æ°èåžå Žã§æ®åããŠããããŒãšã³ãããã€ã¹ã®ããã©ãŒãã³ã¹ã«çްå¿ã®æ³šæãæã£ãŠãã ããã
- ããŒã«ã©ã€ãºã«é¢ããèæ ®äºé ïŒã³ã³ããã¯ãšãªã¯äž»ã«ã¬ã€ã¢ãŠãã«é¢ãããã®ã§ãããããŸããŸãªèšèªã«ããããã¹ãã®æ¡åŒµãŸãã¯åçž®ããã³ã³ãããµã€ãºã«åœ±é¿ããåè©äŸ¡ãããªã¬ãŒããå¯èœæ§ãããæ¹æ³ãæ€èšããŠãã ããããã£ãã·ã³ã°æŠç¥ããããã®æœåšçãªå€åãåŠçã§ããããšã確èªããŠãã ããã
- ã¢ã¯ã»ã·ããªãã£ïŒã³ã³ããã¯ãšãªãæèŒããã¬ã¹ãã³ã·ããã¶ã€ã³ãå«ããåžžã«ã¢ã¯ã»ã·ããªãã£åºæºãç¶æããŠãã ãããã¹ã¯ãªãŒã³ãªãŒããŒãšããŒããŒãããã²ãŒã·ã§ã³ã§ãã¹ãããŸãã
- ããã©ãŒãã³ã¹ç£èŠïŒããŸããŸãªå°åããŠãŒã¶ãŒã»ã°ã¡ã³ãã§ãã¬ã³ããªã³ã°ãJavaScriptã®å®è¡ãCPU䜿çšçã«é¢é£ããã¡ããªã¯ã¹ã远跡ããããã«ãå ç¢ãªããã©ãŒãã³ã¹ç£èŠããŒã«ãå®è£ ããŸãã
- ã³ãŒãåå²ãšé å»¶èªã¿èŸŒã¿ïŒå€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã®å Žåã¯ãã³ã³ããã¯ãšãªã®èгå¯ãšãã£ãã·ã³ã°ãåŠçããJavaScriptã¢ãžã¥ãŒã«ã«å¯ŸããŠã³ãŒãåå²ãæ€èšããå¿ èŠãªå Žåã«ã®ã¿ããããé å»¶èªã¿èŸŒã¿ããŸãã
ã³ã³ããã¯ãšãªãã£ãã·ã³ã°ã®å°æ¥
CSSã³ã³ããã¯ãšãªãã£ãã·ã¥ç®¡çã®å°æ¥ã¯ããã©ãŠã¶ãšã³ãžã³ã®ããæ·±ãçµ±åãšãããæŽç·ŽãããããŒã«ãå«ãã§ããå¯èœæ§ããããŸããæ¬¡ãæåŸ ã§ããŸã:
- æšæºåãããAPIïŒã³ã³ããã¯ãšãªã®ãã£ãã·ã³ã°ãšç¡å¹åãæç€ºçã«å¶åŸ¡ããéçºè ãããã©ãŒãã³ã¹ã®é«ããœãªã¥ãŒã·ã§ã³ãå®è£ ãããããããããæšæºåãããAPIã®å¯èœæ§ã
- AIãå©çšããæé©åïŒå°æ¥ã®é²æ©ã§ã¯ããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãšã³ã³ãã³ãã®å€æŽãäºæž¬ããŠããã£ãã·ã¥ã®ç¶æ ãç©æ¥µçã«æé©åããAIã¢ã«ãŽãªãºã ãèŠãããå¯èœæ§ããããŸãã
- ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ã®åŒ·åïŒã³ã³ããã¯ãšãªã®SSRã®ç¶ç¶çãªæ¹åã«ãããäºåã¬ã³ããªã³ã°ãããã³ã³ããã¹ã察å¿ã®HTMLãé ä¿¡ãããŸãã
- 宣èšåãã£ãã·ã³ã°ïŒCSSå ãŸãã¯ã¡ã¿å±æ§ãä»ããŠããã£ãã·ã³ã°æŠç¥ãçŽæ¥å®çŸ©ããããã®å®£èšçãªæ¹æ³ã暡玢ããåºç¯ãªJavaScriptã®å¿ èŠæ§ãæžããã
çµè«
CSSã³ã³ããã¯ãšãªãã£ãã·ã¥ç®¡çãšã³ãžã³ã¯ãåãªãæœè±¡çãªæŠå¿µã§ã¯ãªããçŸä»£ã«ãããŠé«æ§èœã§ã¹ã±ãŒã©ãã«ã§é©å¿æ§ã®ããWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®éèŠãªã³ã³ããŒãã³ãã§ãããã£ãã·ã³ã°ãç¡å¹åãããã³ãšãã¯ã·ã§ã³ã®ååãçè§£ãããã©ãŠã¶ãã€ãã£ãæ©èœãšã«ã¹ã¿ã JavaScriptãœãªã¥ãŒã·ã§ã³ã®äž¡æ¹ã掻çšããããšã«ãããéçºè ã¯ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã
ã°ããŒãã«ãªèŠèŽè ã«ãšã£ãŠãæé©åãããããã©ãŒãã³ã¹ã®éèŠæ§ã¯ããã匷調ããŠãããããããšã¯ãããŸãããé©åã«ç®¡çãããã³ã³ããã¯ãšãªãã£ãã·ã¥ã¯ãããã€ã¹ããããã¯ãŒã¯æ¡ä»¶ããŸãã¯å°ççãªå Žæã«é¢ä¿ãªããWebãµã€ããé«éã§ã¹ã ãŒãºãã€äžè²«ãããšã¯ã¹ããªãšã³ã¹ãæäŸããããšãä¿èšŒããŸããã³ã³ããã¯ãšãªãæçããããåºãæ¡çšãããã«ã€ããŠãå ç¢ãªãã£ãã·ã¥ç®¡çæŠç¥ãžã®æè³ã¯ãäž»èŠãªWebã¢ããªã±ãŒã·ã§ã³ã®äž»èŠãªå·®å¥åèŠå ãšãªãã§ãããã
ãããã®æé©åææ³ãæ¡çšããããšã§ãããžã¿ã«ãšã¯ã¹ããªãšã³ã¹ãèŠèŠçã«é åçã§æ©èœè±å¯ã§ããã ãã§ãªããã©ãã«ããŠã誰ã«ãšã£ãŠããããã©ãŒãã³ã¹ãé«ããã¢ã¯ã»ã¹å¯èœã«ãªããŸãã