ã¢ãžã¥ãŒã«ãããã¡ã€ãªã³ã°ãåŠã³ãJavaScriptã®ããã©ãŒãã³ã¹ããã¹ã¿ãŒãWebpack Bundle AnalyzerãChrome DevToolsã䜿ã£ããã³ãã«ãµã€ãºãšå®è¡æããã©ãŒãã³ã¹ã®åæã«é¢ããå®å šã¬ã€ãã
JavaScriptã¢ãžã¥ãŒã«ãããã¡ã€ãªã³ã°ïŒããã©ãŒãã³ã¹åæã®åŸ¹åºè§£èª¬
çŸä»£ã®ãŠã§ãéçºã®äžçã«ãããŠãããã©ãŒãã³ã¹ã¯åãªãæ©èœã§ã¯ãªããããžãã£ããªãŠãŒã¶ãŒäœéšã®ããã®åºæ¬èŠä»¶ã§ããäžçäžã®ãŠãŒã¶ãŒã¯ããã€ãšã³ãã®ãã¹ã¯ãããããäœã¹ããã¯ã®æºåž¯é»è©±ãŸã§ãããŸããŸãªããã€ã¹ã§ãŠã§ãã¢ããªã±ãŒã·ã§ã³ãé«éãã€å¿çæ§ã«åªããŠããããšãæåŸ ããŠããŸããæ°çŸããªç§ã®é å»¶ããã³ã³ããŒãžã§ã³ãšé¡§å®¢åªå€±ã®åããç®ã«ãªãããšããããŸããã¢ããªã±ãŒã·ã§ã³ãè€éåããã«ã€ããŠãæ°çŸããããã¯æ°åãã®JavaScriptã¢ãžã¥ãŒã«ããæ§ç¯ãããããšãå€ããªããŸãããã®ã¢ãžã¥ãŒã«æ§ã¯ä¿å®æ§ãã¹ã±ãŒã©ããªãã£ã«åªããŠããŸãããé倧ãªèª²é¡ãçããŸããããã¯ããããã®å€ãã®éšåã®ãã¡ãã©ããã·ã¹ãã å šäœãé ãããŠããã®ããç¹å®ããããšã§ããããã§JavaScriptã¢ãžã¥ãŒã«ãããã¡ã€ãªã³ã°ã圹ç«ã¡ãŸãã
ã¢ãžã¥ãŒã«ãããã¡ã€ãªã³ã°ãšã¯ãåã ã®JavaScriptã¢ãžã¥ãŒã«ã®ããã©ãŒãã³ã¹ç¹æ§ãäœç³»çã«åæããããã»ã¹ã§ããããã¯ãã¢ããªãé ãããšããæŒ ç¶ãšããæèŠãããã`data-visualization`ã¢ãžã¥ãŒã«ãåæãã³ãã«ã«500KBã远å ããåæåäžã«ã¡ã€ã³ã¹ã¬ããã200msãããã¯ããŠããããšãã£ãããŒã¿ã«åºã¥ããæŽå¯ãžãšç§»è¡ããããšã§ãããã®ã¬ã€ãã§ã¯ãJavaScriptã¢ãžã¥ãŒã«ã广çã«ãããã¡ã€ãªã³ã°ããããã«å¿ èŠãªããŒã«ããã¯ããã¯ãèãæ¹ãå æ¬çã«æŠèª¬ããäžçäžã®ãŠãŒã¶ãŒã®ããã«ãããé«éã§å¹ççãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããããã«ããŸãã
ãªãã¢ãžã¥ãŒã«ãããã¡ã€ãªã³ã°ãéèŠãªã®ã
éå¹çãªã¢ãžã¥ãŒã«ã®åœ±é¿ã¯ããã°ãã°ãåã®åãå·ã«ããæ»ãã®ãããªãã®ã§ããäžã€ã®ããã©ãŒãã³ã¹ã®äœãã¢ãžã¥ãŒã«ã¯ç®ç«ããªããããããŸããããããããæ°ååèç©ããããšãã¢ããªã±ãŒã·ã§ã³ãæ©èœäžå šã«é¥ãããå¯èœæ§ããããŸãããªããããéèŠãªã®ããçè§£ããããšããæé©åãžã®ç¬¬äžæ©ã§ãã
Core Web Vitals (CWV)ãžã®åœ±é¿
Googleã®Core Web Vitalsã¯ãèªã¿èŸŒã¿ããã©ãŒãã³ã¹ãã€ã³ã¿ã©ã¯ãã£ããã£ãèŠèŠçãªå®å®æ§ã«é¢ããå®éã®ãŠãŒã¶ãŒäœéšã枬å®ããäžé£ã®ææšã§ããJavaScriptã¢ãžã¥ãŒã«ã¯ãããã®ææšã«çŽæ¥åœ±é¿ããŸãïŒ
- Largest Contentful Paint (LCP): å€§èŠæš¡ãªJavaScriptãã³ãã«ã¯ã¡ã€ã³ã¹ã¬ããããããã¯ããéèŠãªã³ã³ãã³ãã®ã¬ã³ããªã³ã°ãé å»¶ãããLCPã«æªåœ±é¿ãäžããŸãã
- Interaction to Next Paint (INP): ãã®ææšã¯å¿çæ§ã枬å®ããŸããCPUè² è·ã®é«ãã¢ãžã¥ãŒã«ãé·ãã¿ã¹ã¯ãå®è¡ãããšãã¡ã€ã³ã¹ã¬ããããããã¯ãããã¯ãªãã¯ãããŒå ¥åãšãã£ããŠãŒã¶ãŒã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãžã®ãã©ãŠã¶ã®å¿çã劚ããããINPãé«ããªããŸãã
- Cumulative Layout Shift (CLS): ã¹ããŒã¹ã確ä¿ããã«DOMãæäœããJavaScriptã¯ãäºæãã¬ã¬ã€ã¢ãŠãã·ãããåŒãèµ·ãããCLSã¹ã³ã¢ãæªåãããŸãã
ãã³ãã«ãµã€ãºãšãããã¯ãŒã¯é å»¶
ã€ã³ããŒããããã¹ãŠã®ã¢ãžã¥ãŒã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®æçµçãªãã³ãã«ãµã€ãºãå¢å ãããŸããé«éãªå ãã¡ã€ããŒã€ã³ã¿ãŒããããå©çšããŠããå°åã®ãŠãŒã¶ãŒã«ãšã£ãŠã远å ã®200KBãããŠã³ããŒãããããšã¯äºçްãªããšãããããŸãããããããäžçã®å¥ã®å°åã§äœéãª3Gã4Gãããã¯ãŒã¯ã䜿çšããŠãããŠãŒã¶ãŒã«ãšã£ãŠã¯ãåã200KBãåæèªã¿èŸŒã¿æéãæ°ç§ãå¢å ãããå¯èœæ§ããããŸããã¢ãžã¥ãŒã«ãããã¡ã€ãªã³ã°ã¯ããã³ãã«ãµã€ãºã«æãå¯äžããŠãããã®ãç¹å®ããã®ã«åœ¹ç«ã¡ãäŸåé¢ä¿ããã®éã¿ã«å€ãããã©ããã«ã€ããŠãæ å ±ã«åºã¥ããæ±ºå®ãäžãããšãã§ããŸãã
CPUå®è¡ã³ã¹ã
ã¢ãžã¥ãŒã«ã®ããã©ãŒãã³ã¹ã³ã¹ãã¯ãããŠã³ããŒããããåŸãçµãããŸããããã©ãŠã¶ã¯ãã®åŸãJavaScriptã³ãŒããè§£æãã³ã³ãã€ã«ãå®è¡ããå¿ èŠããããŸãããã¡ã€ã«ãµã€ãºãå°ããã¢ãžã¥ãŒã«ã§ãã£ãŠããèšç®ã³ã¹ããé«ããç¹ã«ã¢ãã€ã«ããã€ã¹ã§ã¯ãããªãã®CPUæéãšããããªãŒå¯¿åœãæ¶è²»ããå¯èœæ§ããããŸããåçãããã¡ã€ãªã³ã°ã¯ããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³äžã«é å»¶ãã«ã¯ã€ããåŒãèµ·ããããããã®CPUè² è·ã®é«ãã¢ãžã¥ãŒã«ãç¹å®ããããã«äžå¯æ¬ ã§ãã
ã³ãŒãã®å¥å šæ§ãšä¿å®æ§
ãããã¡ã€ãªã³ã°ã¯ããã°ãã°ã³ãŒãããŒã¹ã®åé¡é åã«å ãåœãŠãŸããäžè²«ããŠããã©ãŒãã³ã¹ã®ããã«ããã¯ãšãªã£ãŠããã¢ãžã¥ãŒã«ã¯ãäžé©åãªã¢ãŒããã¯ãã£ã®æ±ºå®ãéå¹çãªã¢ã«ãŽãªãºã ããŸãã¯è¥å€§åãããµãŒãããŒãã£ã©ã€ãã©ãªãžã®äŸåã®å åã§ããå¯èœæ§ããããŸãããããã®ã¢ãžã¥ãŒã«ãç¹å®ããããšã¯ããããããªãã¡ã¯ã¿ãªã³ã°ãããã眮ãæããããããè¯ãä»£æ¿æ¡ãèŠã€ãããããããã®ç¬¬äžæ©ã§ãããæçµçã«ã¯ãããžã§ã¯ãã®é·æçãªå¥å šæ§ãåäžãããŸãã
ã¢ãžã¥ãŒã«ãããã¡ã€ãªã³ã°ã®2ã€ã®æ±
广çãªã¢ãžã¥ãŒã«ãããã¡ã€ãªã³ã°ã¯ãäž»ã«2ã€ã®ã«ããŽãªã«åé¡ã§ããŸããã³ãŒããå®è¡ãããåã«è¡ãããéçåæãšãã³ãŒããå®è¡ãããŠããéã«è¡ãããåçåæã§ãã
第1ã®æ±ïŒéçåæ - ãããã€åã®ãã³ãã«åæ
éçåæã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãã³ãã«ãããåºåããã©ãŠã¶ã§å®éã«å®è¡ããããšãªãæ€æ»ããŸããããã§ã®äž»ãªç®æšã¯ãJavaScriptãã³ãã«ã®æ§æãšãµã€ãºãçè§£ããããšã§ãã
äž»èŠããŒã«ïŒãã³ãã«ã¢ãã©ã€ã¶ãŒ
ãã³ãã«ã¢ãã©ã€ã¶ãŒã¯ããã«ãåºåãè§£æãããã³ãã«å ã®åã¢ãžã¥ãŒã«ãšäŸåé¢ä¿ã®ãµã€ãºã瀺ãã€ã³ã¿ã©ã¯ãã£ããªèŠèŠåïŒéåžžã¯ããªãŒãããïŒãçæããäžå¯æ¬ ãªããŒã«ã§ããããã«ãããäœãæãã¹ããŒã¹ãå æããŠããããäžç®ã§ç¢ºèªã§ããŸãã
- Webpack Bundle Analyzer: Webpackã䜿çšããŠãããããžã§ã¯ãã§æã人æ°ã®ããéžæè¢ã§ããåé·æ¹åœ¢ã®é¢ç©ãã¢ãžã¥ãŒã«ã®ãµã€ãºã«æ¯äŸãããæç¢ºã§è²åããããããªãŒããããæäŸããŸããããŸããŸãªã»ã¯ã·ã§ã³ã«ã«ãŒãœã«ãåãããããšã§ãçã®ãã¡ã€ã«ãµã€ãºãè§£æåŸã®ãµã€ãºãgzipå§çž®åŸã®ãµã€ãºã確èªã§ããã¢ãžã¥ãŒã«ã®ã³ã¹ãã®å šäœåãææ¡ã§ããŸãã
- Rollup Plugin Visualizer: Rollupãã³ãã©ã䜿çšããéçºè åãã®åæ§ã®ããŒã«ã§ãããã³ãã«ã®æ§æãèŠèŠåããHTMLãã¡ã€ã«ãçæãã倧ããªäŸåé¢ä¿ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
- Source Map Explorer: ãã®ããŒã«ã¯ããœãŒã¹ããããçæã§ããã©ã®ãã³ãã©ã§ãåäœããŸããã³ã³ãã€ã«ãããã³ãŒããåæãããœãŒã¹ãããã䜿çšããŠå ã®ãœãŒã¹ãã¡ã€ã«ã«ãããã³ã°ãçŽããŸããããã¯ããµãŒãããŒãã£ã®äŸåé¢ä¿ã ãã§ãªããèªåèªèº«ã®ã³ãŒãã®ã©ã®éšåãè¥å€§åã«å¯äžããŠããããç¹å®ããã®ã«ç¹ã«åœ¹ç«ã¡ãŸãã
å®è·µçãªæŽå¯ïŒ ãã³ãã«ã¢ãã©ã€ã¶ãŒãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒCIïŒãã€ãã©ã€ã³ã«çµ±åããŸããç¹å®ã®ãã³ãã«ã®ãµã€ãºãäžå®ã®ãããå€ïŒäŸïŒ5%ïŒãè¶ ããŠå¢å ããå Žåã«å€±æãããžã§ããèšå®ããŸãããã®ããã¢ã¯ãã£ããªã¢ãããŒãã«ããããµã€ãºã®ãªã°ã¬ãã·ã§ã³ãæ¬çªç°å¢ã«å°éããã®ãé²ããŸãã
第2ã®æ±ïŒåçåæ - å®è¡æã®ãããã¡ã€ãªã³ã°
éçåæã¯ãã³ãã«ã«äœãå«ãŸããŠããããæããŠãããŸããããã®ã³ãŒããå®è¡æã«ã©ã®ããã«åäœãããã¯æããŠãããŸãããåçåæã§ã¯ããã©ãŠã¶ãNode.jsããã»ã¹ã®ãããªå®éã®ç°å¢ã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããéã®ããã©ãŒãã³ã¹ã枬å®ããŸããããã§ã®çŠç¹ã¯ãCPU䜿çšçãå®è¡æéãã¡ã¢ãªæ¶è²»ã§ãã
äž»èŠããŒã«ïŒãã©ãŠã¶éçºè ããŒã«ïŒããã©ãŒãã³ã¹ããã«ïŒ
ChromeãFirefoxãEdgeãªã©ã®ãã©ãŠã¶ã®ããã©ãŒãã³ã¹ããã«ã¯ãåçåæã®ããã®æã匷åãªããŒã«ã§ãããããã¯ãŒã¯ãªã¯ãšã¹ãããã¬ã³ããªã³ã°ãã¹ã¯ãªããå®è¡ãŸã§ããã©ãŠã¶ãè¡ã£ãŠãããã¹ãŠã®è©³çްãªã¿ã€ã ã©ã€ã³ãèšé²ããããšãã§ããŸãã
- ãã¬ãŒã ãã£ãŒãïŒ ããã¯ããã©ãŒãã³ã¹ããã«ã®äžå¿çãªèŠèŠåã§ããã¡ã€ã³ã¹ã¬ããã®ã¢ã¯ãã£ããã£ãæç³»åã§è¡šç€ºããŸãããMainããã©ãã¯ã®é·ããŠå¹ ã®åºããããã¯ã¯ãUIããããã¯ãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãäœäžãããããã³ã°ã¿ã¹ã¯ãã§ãããããã®ã¿ã¹ã¯ãæ¡å€§ãããšãã©ã®é¢æ°ãã©ã®é¢æ°ãåŒã³åºãããã瀺ããããããŠã³ãã¥ãŒã§ããJavaScriptã®ã³ãŒã«ã¹ã¿ãã¯ã衚瀺ãããããã«ããã¯ã®åå ãç¹å®ã®ã¢ãžã¥ãŒã«ãŸã§è¿œè·¡ã§ããŸãã
- Bottom-Upã¿ããšCall Treeã¿ãïŒ ãããã®ã¿ãã¯ãèšé²ããã®éèšããŒã¿ãæäŸããŸãããBottom-Upããã¥ãŒã¯ãåã ã®å®è¡ã«æãæéãããã£ã颿°ããªã¹ãã¢ããããããç¹ã«äŸ¿å©ã§ãããTotal Timeãã§ãœãŒãããããšã§ãèšé²æéäžã«ã©ã®é¢æ°ãã²ããŠã¯ã©ã®ã¢ãžã¥ãŒã«ãæãèšç®ã³ã¹ããé«ãã£ããã確èªã§ããŸãã
ãã¯ããã¯ïŒperformance.measure()
ã«ããã«ã¹ã¿ã ããã©ãŒãã³ã¹ããŒã¯
ãã¬ãŒã ãã£ãŒãã¯äžè¬çãªåæã«ã¯åªããŠããŸãããæã«ã¯éåžžã«ç¹å®ã®æäœã®æç¶æéãæž¬å®ããå¿ èŠããããŸãããã©ãŠã¶ã«çµã¿èŸŒãŸããŠããPerformance APIã¯ããã®ç®çã«æé©ã§ãã
ã«ã¹ã¿ã ã¿ã€ã ã¹ã¿ã³ãïŒããŒã¯ïŒãäœæãããããã®éã®æç¶æéãæž¬å®ã§ããŸããããã¯ãã¢ãžã¥ãŒã«ã®åæåãç¹å®ã®æ©èœã®å®è¡ããããã¡ã€ãªã³ã°ããã®ã«éåžžã«åœ¹ç«ã¡ãŸãã
åçã«ã€ã³ããŒããããã¢ãžã¥ãŒã«ã®ãããã¡ã€ãªã³ã°äŸïŒ
async function loadAndRunHeavyModule() {
performance.mark('heavy-module-start');
try {
const heavyModule = await import('./heavy-module.js');
heavyModule.doComplexCalculation();
} catch (error) {
console.error("Failed to load module", error);
} finally {
performance.mark('heavy-module-end');
performance.measure(
'Heavy Module Load and Execution',
'heavy-module-start',
'heavy-module-end'
);
}
}
ããã©ãŒãã³ã¹ãããã¡ã€ã«ãèšé²ãããšããã®ã«ã¹ã¿ã ã®ãHeavy Module Load and Executionãæž¬å®ããTimingsããã©ãã¯ã«è¡šç€ºããããã®æäœã«å¯Ÿããæ£ç¢ºã§åé¢ãããã¡ããªãã¯ãåŸãããŸãã
Node.jsã§ã®ãããã¡ã€ãªã³ã°
ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒãããã¯ãšã³ãã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã©ãŠã¶ã®éçºè
ããŒã«ã¯äœ¿çšã§ããŸãããNode.jsã«ã¯ãV8ãšã³ãžã³ãæèŒããçµã¿èŸŒã¿ã®ãããã¡ã€ã©ããããŸãã--prof
ãã©ã°ãä»ããŠã¹ã¯ãªãããå®è¡ãããšããã°ãã¡ã€ã«ãçæãããŸãããã®ãã¡ã€ã«ã¯ã--prof-process
ãã©ã°ã§åŠçããããšã§ã颿°å®è¡æéã®äººéãèªãã圢åŒã®åæãçæãããµãŒããŒãµã€ãã¢ãžã¥ãŒã«ã®ããã«ããã¯ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
ã¢ãžã¥ãŒã«ãããã¡ã€ãªã³ã°ã®å®è·µçãªã¯ãŒã¯ãããŒ
éçåæãšåçåæãæ§é åãããã¯ãŒã¯ãããŒã«çµã¿åãããããšããå¹ççãªæé©åã®éµã§ãã以äžã®æé ã«åŸã£ãŠãããã©ãŒãã³ã¹ã®åé¡ãäœç³»çã«èšºæããä¿®æ£ããŸãã
ã¹ããã1ïŒéçåæããå§ããïŒæè»œã«åŸãããææïŒ
åžžã«æ¬çªãã«ãã§ãã³ãã«ã¢ãã©ã€ã¶ãŒãå®è¡ããããšããå§ããŸãããããäž»èŠãªåé¡ãèŠã€ããæãæã£åãæ©ãæ¹æ³ã§ãã以äžã®ãããªç¹ãæ¢ããŸãïŒ
- å€§èŠæš¡ã§ã¢ããªã·ãã¯ãªã©ã€ãã©ãªïŒ ããã€ãã®é¢æ°ãã䜿çšããŠããªãã®ã«ã巚倧ãªã°ã©ãäœæã©ã€ãã©ãªããŠãŒãã£ãªãã£ã©ã€ãã©ãªãå«ãŸããŠããŸãããïŒ
- éè€ããäŸåé¢ä¿ïŒ 誀ã£ãŠåãã©ã€ãã©ãªã®è€æ°ã®ããŒãžã§ã³ãå«ãã§ããŸãããïŒ
- ããªãŒã·ã§ã€ãã³ã°ãããŠããªãã¢ãžã¥ãŒã«ïŒ ããã©ã€ãã©ãªãããªãŒã·ã§ã€ãã³ã°çšã«èšå®ãããŠããããäžéšããã€ã³ããŒãããŠããªãã«ããããããããã®ã³ãŒãããŒã¹å šäœãå«ãŸããŠããŸãããïŒ
ãã®åæã«åºã¥ããŠãããã«è¡åãèµ·ããããšãã§ããŸããäŸãã°ã`moment.js`ããã³ãã«ã®å€§éšåãå ããŠããããšãããã£ãå Žåãããã¢ãžã¥ãŒã«åãããããªãŒã·ã§ã€ãã³ã°ãå¯èœãª`date-fns`ã`day.js`ã®ãããªãããå°ããªä»£æ¿åã«çœ®ãæããããšãæ€èšã§ããŸãã
ã¹ããã2ïŒããã©ãŒãã³ã¹ã®ããŒã¹ã©ã€ã³ã確ç«ãã
倿Žãå ããåã«ãããŒã¹ã©ã€ã³ã®æž¬å®ãå¿ èŠã§ããã·ãŒã¯ã¬ãããã©ãŠã¶ãŠã£ã³ããŠã§ã¢ããªã±ãŒã·ã§ã³ãéãïŒæ¡åŒµæ©èœããã®å¹²æžãé¿ããããïŒãéçºè ããŒã«ã®ããã©ãŒãã³ã¹ããã«ã䜿çšããŠäž»èŠãªãŠãŒã¶ãŒãããŒãèšé²ããŸããããã¯ãåæããŒãžã®èªã¿èŸŒã¿ãååã®æ€çŽ¢ãã«ãŒããžã®ååã®è¿œå ãªã©ãèããããŸãããã®ããã©ãŒãã³ã¹ãããã¡ã€ã«ãä¿åããŸãããããã倿Žåãã®ã¹ãããã·ã§ããã§ããTotal Blocking TimeïŒTBTïŒãæé·ã¿ã¹ã¯ã®æç¶æéãªã©ã®äž»èŠãªã¡ããªã¯ã¹ãèšé²ããŠãããŸãã
ã¹ããã3ïŒåçãããã¡ã€ãªã³ã°ãšä»®èª¬æ€èšŒ
次ã«ãéçåæããŠãŒã¶ãŒããå ±åãããåé¡ã«åºã¥ããŠä»®èª¬ãç«ãŠãŸããäŸãã°ãã`ProductFilter`ã¢ãžã¥ãŒã«ã¯ããŠãŒã¶ãŒãè€æ°ã®ãã£ã«ã¿ãŒãéžæããéã«å€§ããªãªã¹ããåã¬ã³ããªã³ã°ããå¿ èŠããããããã«ã¯ã€ããåŒãèµ·ãããŠãããšèããããšãã£ã仮説ã§ãã
ãã®ä»®èª¬ãæ€èšŒããããã«ããã®ã¢ã¯ã·ã§ã³ãå ·äœçã«å®è¡ããªããããã©ãŒãã³ã¹ãããã¡ã€ã«ãèšé²ããŸããé å»¶ãçºçããŠããç¬éã®ãã¬ãŒã ãã£ãŒããæ¡å€§ããŸãã`ProductFilter.js`å ã®é¢æ°ããçºçããŠããé·ãã¿ã¹ã¯ãèŠããŸããïŒBottom-Upã¿ãã䜿çšããŠããã®ã¢ãžã¥ãŒã«ããã®é¢æ°ãç·å®è¡æéã®é«ãå²åãæ¶è²»ããŠããããšã確èªããŸãããã®ããŒã¿ãããªãã®ä»®èª¬ãè£ä»ããŸãã
ã¹ããã4ïŒæé©åãšå枬å®
æ€èšŒããã仮説ãããšã«ãã¿ãŒã²ãããçµã£ãæé©åãå®è£ ã§ããŸããé©åãªæŠç¥ã¯åé¡ã«ãã£ãŠç°ãªããŸãïŒ
- åæèªã¿èŸŒã¿æã®å€§èŠæš¡ã¢ãžã¥ãŒã«ã«å¯ŸããŠïŒ åçãª`import()`ã䜿çšããŠã¢ãžã¥ãŒã«ãã³ãŒãåå²ãããŠãŒã¶ãŒããã®æ©èœã«ããã²ãŒããããšãã«ã®ã¿èªã¿èŸŒãŸããããã«ããŸãã
- CPUè² è·ã®é«ã颿°ã«å¯ŸããŠïŒ ã¢ã«ãŽãªãºã ããªãã¡ã¯ã¿ãªã³ã°ããŠå¹çåããŸãã颿°ã®çµæãã¡ã¢åããŠãæ¯åã®ã¬ã³ããªã³ã°ã§ã®åèšç®ãé¿ããããšã¯ã§ããŸããïŒåŠçãWeb Workerã«ãªãããŒãããŠã¡ã€ã³ã¹ã¬ãããè§£æŸããããšã¯ã§ããŸããïŒ
- è¥å€§åããäŸåé¢ä¿ã«å¯ŸããŠïŒ éãã©ã€ãã©ãªãããã軜éã§ç®çã«ç¹åãã代æ¿åã«çœ®ãæããŸãã
ä¿®æ£ãå®è£ ããåŸãã¹ããã2ãç¹°ãè¿ããŸããåããŠãŒã¶ãŒãããŒã®æ°ããããã©ãŒãã³ã¹ãããã¡ã€ã«ãèšé²ããããŒã¹ã©ã€ã³ãšæ¯èŒããŸããã¡ããªã¯ã¹ã¯æ¹åãããŸãããïŒé·ãã¿ã¹ã¯ã¯ãªããªã£ãããå€§å¹ ã«ççž®ããããããŸãããïŒãã®æž¬å®ã¹ãããã¯ãæé©åãæãŸãã广ããããããããšã確èªããããã«äžå¯æ¬ ã§ãã
ã¹ããã5ïŒèªååãšç£èŠ
ããã©ãŒãã³ã¹ã¯äžåºŠããã®ã¿ã¹ã¯ã§ã¯ãããŸããããªã°ã¬ãã·ã§ã³ãé²ãããã«ã¯ãèªååãå¿ èŠã§ãã
- ããã©ãŒãã³ã¹ããžã§ããïŒ Lighthouse CIã®ãããªããŒã«ã䜿çšããŠãããã©ãŒãã³ã¹ããžã§ããïŒäŸïŒTBTã¯200msæªæºãã¡ã€ã³ãã³ãã«ãµã€ãºã¯250KBæªæºïŒãèšå®ããŸãããããã®ããžã§ãããè¶ ããå ŽåãCIãã€ãã©ã€ã³ããã«ãã倱æãããããã«ããŸãã
- ãªã¢ã«ãŠãŒã¶ãŒã¢ãã¿ãªã³ã°ïŒRUMïŒïŒ RUMããŒã«ãçµ±åããŠãäžçäžã®å®éã®ãŠãŒã¶ãŒããããã©ãŒãã³ã¹ããŒã¿ãåéããŸããããã«ãããããŸããŸãªããã€ã¹ããããã¯ãŒã¯ãå°ççãã±ãŒã·ã§ã³ã§ã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«åäœãããã«ã€ããŠã®æŽå¯ãåŸãããããŒã«ã«ãã¹ãã§ã¯èŠéãå¯èœæ§ã®ããåé¡ãçºèŠããã®ã«åœ¹ç«ã¡ãŸãã
ããããèœãšã穎ãšãã®åé¿æ¹æ³
ãããã¡ã€ãªã³ã°ãæ·±ãæãäžããéã«ã¯ããããã®ããããééãã«æ³šæããŠãã ããïŒ
- éçºã¢ãŒãã§ã®ãããã¡ã€ãªã³ã°ïŒ éçºãµãŒããŒã®ãã«ãããããã¡ã€ãªã³ã°ããŠã¯ãããŸãããéçºãã«ãã«ã¯ããããªããŒãã£ã³ã°ããããã°çšã®è¿œå ã³ãŒããå«ãŸããŠãããçž®å°åãããŠããããããã©ãŒãã³ã¹ãæé©åãããŠããŸãããåžžã«æ¬çªã«è¿ããã«ãããããã¡ã€ãªã³ã°ããŠãã ããã
- ãããã¯ãŒã¯ãšCPUã®ã¹ããããªã³ã°ãç¡èŠããïŒ ããªãã®éçºãã·ã³ã¯ãå¹³åçãªãŠãŒã¶ãŒã®ããã€ã¹ãããã¯ããã«åŒ·åã§ããå¯èœæ§ãé«ãã§ãããã©ãŠã¶ã®éçºè ããŒã«ã«ããã¹ããããªã³ã°æ©èœã䜿çšããŠãäœéãªãããã¯ãŒã¯æ¥ç¶ïŒäŸïŒãFast 3GãïŒãäœéãªCPUïŒäŸïŒã4x slowdownãïŒãã·ãã¥ã¬ãŒãããããçŸå®çãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®å šäœåãææ¡ããŠãã ããã
- ãã€ã¯ãæé©åã«éäžããïŒ ãã¬ãŒãã®æ³åïŒ80/20ã®æ³åïŒã¯ããã©ãŒãã³ã¹ã«ãåœãŠã¯ãŸããŸããä»ã®ã¢ãžã¥ãŒã«ãã¡ã€ã³ã¹ã¬ããã300ããªç§ãããã¯ããŠããã®ã«ã2ããªç§ãç¯çŽãã颿°ã®æé©åã«äœæ¥ãè²»ãããŠã¯ãããŸãããåžžã«æå€§ã®ããã«ããã¯ããåãçµã¿ãŸãããããã¬ãŒã ãã£ãŒãã䜿ãã°ãããããç°¡åã«èŠã€ããããšãã§ããŸãã
- ãµãŒãããŒãã£è£œã¹ã¯ãªãããå¿ããïŒ ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã¯ãèªåèªèº«ã®ã³ãŒãã ãã§ãªããå®è¡ããããã¹ãŠã®ã³ãŒãã«åœ±é¿ãããŸããåæãåºåããŸãã¯ã«ã¹ã¿ããŒãµããŒããŠã£ãžã§ããçšã®ãµãŒãããŒãã£è£œã¹ã¯ãªããã¯ããã°ãã°ããã©ãŒãã³ã¹åé¡ã®äž»èŠãªåå ãšãªããŸãããããã®åœ±é¿ããããã¡ã€ãªã³ã°ããé å»¶èªã¿èŸŒã¿ãããããã軜éãªä»£æ¿åãèŠã€ããããšãæ€èšããŠãã ããã
çµè«ïŒç¶ç¶çãªå®è·µãšããŠã®ãããã¡ã€ãªã³ã°
JavaScriptã¢ãžã¥ãŒã«ãããã¡ã€ãªã³ã°ã¯ãçŸä»£ã®ãŠã§ãéçºè ã«ãšã£ãŠäžå¯æ¬ ãªã¹ãã«ã§ããããã¯ããã©ãŒãã³ã¹æé©åãåœãŠæšéããããŒã¿é§åã®ç§åŠãžãšå€ããŸããéçãªãã³ãã«æ€æ»ãšåçãªå®è¡æãããã¡ã€ãªã³ã°ãšããåæã®2ã€ã®æ±ããã¹ã¿ãŒããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ããã«ããã¯ãæ£ç¢ºã«ç¹å®ãã解決ããèœåãåŸãããšãã§ããŸãã
ãã³ãã«ãåæããããŒã¹ã©ã€ã³ã確ç«ãã仮説ãç«ãŠãŠæ€èšŒããæé©åãããããŠå枬å®ãããšããäœç³»çãªã¯ãŒã¯ãããŒã«åŸãããšãå¿ããªãã§ãã ãããæãéèŠãªã®ã¯ãèªååãšç¶ç¶çãªç£èŠãéããŠãããã©ãŒãã³ã¹åæãéçºã©ã€ããµã€ã¯ã«ã«çµ±åããããšã§ããããã©ãŒãã³ã¹ã¯ç®çå°ã§ã¯ãªããç¶ç¶çãªæ ã§ãããããã¡ã€ãªã³ã°ã宿çãªç¿æ £ã«ããããšã§ãäžçã®ã©ãã«ããŠãããã¹ãŠã®ãŠãŒã¶ãŒã®ããã«ããéããããã¢ã¯ã»ã¹ãããããããæ¥œãããŠã§ãäœéšãæ§ç¯ããããšã«ã³ãããããã®ã§ãã