From 111712e96918d8a3de56047bb27706126211c4aa Mon Sep 17 00:00:00 2001 From: Michael Freno Date: Sun, 4 Jan 2026 12:02:18 -0500 Subject: [PATCH] testing improvements --- .gitignore | 2 + perf-results-2026-01-04.json | 1920 ++++++++++++++++++---------- perf-results-baseline-7e89e6d.json | 1137 ---------------- scripts/perf-test.ts | 195 ++- 4 files changed, 1380 insertions(+), 1874 deletions(-) delete mode 100644 perf-results-baseline-7e89e6d.json diff --git a/.gitignore b/.gitignore index aa24275..7db022d 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,8 @@ tasks # Temp gitignore #*_migration_source +perf-results-*.json + # System Files .DS_Store diff --git a/perf-results-2026-01-04.json b/perf-results-2026-01-04.json index cc5ef50..4a445fe 100644 --- a/perf-results-2026-01-04.json +++ b/perf-results-2026-01-04.json @@ -1,117 +1,73 @@ { - "timestamp": "2026-01-04T16:35:18.768Z", + "timestamp": "2026-01-04T16:59:54.705Z", "baseUrl": "http://localhost:3000", - "runsPerPage": 5, + "runsPerPage": 3, "results": [ { "page": "Home", "url": "http://localhost:3000/", "runs": [ + { + "fcp": 160, + "lcp": 156, + "cls": 0.04666640980253497, + "fid": 0, + "ttfb": 9.399999998509884, + "domContentLoaded": 166.79999999701977, + "loadComplete": 562.6999999955297, + "totalRequests": 105, + "totalBytes": 8451841, + "jsBytes": 4421934, + "cssBytes": 0, + "imageBytes": 810035, + "fontBytes": 0, + "jsRequests": 91, + "cssRequests": 0, + "imageRequests": 7, + "jsExecutionTime": 0, + "taskDuration": 56, + "layoutDuration": 0, + "paintDuration": 0 + }, { "fcp": 152, - "lcp": 0, - "cls": 0, + "lcp": 184, + "cls": 0.04665493133921685, "fid": 0, "ttfb": 8, - "domContentLoaded": 157.70000000298023, - "loadComplete": 586.6000000014901, - "totalRequests": 100, - "totalBytes": 8103339, - "jsBytes": 4295712, + "domContentLoaded": 163.89999999850988, + "loadComplete": 580.5, + "totalRequests": 105, + "totalBytes": 8451841, + "jsBytes": 4421934, "cssBytes": 0, "imageBytes": 810035, "fontBytes": 0, - "jsRequests": 87, + "jsRequests": 91, "cssRequests": 0, - "imageRequests": 5, + "imageRequests": 7, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 104, "layoutDuration": 0, "paintDuration": 0 }, { - "fcp": 144, - "lcp": 0, - "cls": 0, + "fcp": 136, + "lcp": 164, + "cls": 0.04663327383504485, "fid": 0, - "ttfb": 7.799999997019768, - "domContentLoaded": 158.10000000149012, - "loadComplete": 565.3999999985099, - "totalRequests": 98, - "totalBytes": 8299347, - "jsBytes": 4295712, + "ttfb": 6.399999998509884, + "domContentLoaded": 141.89999999850988, + "loadComplete": 602.1999999955297, + "totalRequests": 105, + "totalBytes": 8451841, + "jsBytes": 4421934, "cssBytes": 0, "imageBytes": 810035, "fontBytes": 0, - "jsRequests": 87, + "jsRequests": 91, "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 156, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 10.399999998509884, - "domContentLoaded": 181.39999999850988, - "loadComplete": 614.5, - "totalRequests": 98, - "totalBytes": 8299347, - "jsBytes": 4295712, - "cssBytes": 0, - "imageBytes": 810035, - "fontBytes": 0, - "jsRequests": 87, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 148, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.700000002980232, - "domContentLoaded": 157.20000000298023, - "loadComplete": 565.3000000044703, - "totalRequests": 100, - "totalBytes": 8234411, - "jsBytes": 4295712, - "cssBytes": 0, - "imageBytes": 810035, - "fontBytes": 0, - "jsRequests": 87, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 152, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.699999995529652, - "domContentLoaded": 164.20000000298023, - "loadComplete": 585.5, - "totalRequests": 98, - "totalBytes": 8299347, - "jsBytes": 4295712, - "cssBytes": 0, - "imageBytes": 810035, - "fontBytes": 0, - "jsRequests": 87, - "cssRequests": 0, - "imageRequests": 5, + "imageRequests": 7, "jsExecutionTime": 0, "taskDuration": 0, "layoutDuration": 0, @@ -119,44 +75,44 @@ } ], "average": { - "fcp": 150.4, - "lcp": 0, - "cls": 0, + "fcp": 149.33333333333334, + "lcp": 168, + "cls": 0.046651538325598894, "fid": 0, - "ttfb": 8.519999998807908, - "domContentLoaded": 163.72000000178815, - "loadComplete": 583.4600000008941, - "totalRequests": 98.8, - "totalBytes": 8247158.2, - "jsBytes": 4295712, + "ttfb": 7.933333332339923, + "domContentLoaded": 157.5333333313465, + "loadComplete": 581.7999999970198, + "totalRequests": 105, + "totalBytes": 8451841, + "jsBytes": 4421934, "cssBytes": 0, "imageBytes": 810035, "fontBytes": 0, - "jsRequests": 87, + "jsRequests": 91, "cssRequests": 0, - "imageRequests": 5, + "imageRequests": 7, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 53.333333333333336, "layoutDuration": 0, "paintDuration": 0 }, "median": { - "fcp": 156, - "lcp": 0, - "cls": 0, + "fcp": 136, + "lcp": 164, + "cls": 0.04663327383504485, "fid": 0, - "ttfb": 10.399999998509884, - "domContentLoaded": 181.39999999850988, - "loadComplete": 614.5, - "totalRequests": 98, - "totalBytes": 8299347, - "jsBytes": 4295712, + "ttfb": 6.399999998509884, + "domContentLoaded": 141.89999999850988, + "loadComplete": 602.1999999955297, + "totalRequests": 105, + "totalBytes": 8451841, + "jsBytes": 4421934, "cssBytes": 0, "imageBytes": 810035, "fontBytes": 0, - "jsRequests": 87, + "jsRequests": 91, "cssRequests": 0, - "imageRequests": 5, + "imageRequests": 7, "jsExecutionTime": 0, "taskDuration": 0, "layoutDuration": 0, @@ -164,67 +120,67 @@ }, "p95": { "fcp": 152, - "lcp": 0, - "cls": 0, + "lcp": 184, + "cls": 0.04665493133921685, "fid": 0, - "ttfb": 8.699999995529652, - "domContentLoaded": 164.20000000298023, - "loadComplete": 585.5, - "totalRequests": 98, - "totalBytes": 8299347, - "jsBytes": 4295712, + "ttfb": 8, + "domContentLoaded": 163.89999999850988, + "loadComplete": 580.5, + "totalRequests": 105, + "totalBytes": 8451841, + "jsBytes": 4421934, "cssBytes": 0, "imageBytes": 810035, "fontBytes": 0, - "jsRequests": 87, + "jsRequests": 91, "cssRequests": 0, - "imageRequests": 5, + "imageRequests": 7, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 104, "layoutDuration": 0, "paintDuration": 0 }, "min": { - "fcp": 144, - "lcp": 0, - "cls": 0, + "fcp": 136, + "lcp": 156, + "cls": 0.04663327383504485, "fid": 0, - "ttfb": 7.700000002980232, - "domContentLoaded": 157.20000000298023, - "loadComplete": 565.3000000044703, - "totalRequests": 98, - "totalBytes": 8103339, - "jsBytes": 4295712, + "ttfb": 6.399999998509884, + "domContentLoaded": 141.89999999850988, + "loadComplete": 562.6999999955297, + "totalRequests": 105, + "totalBytes": 8451841, + "jsBytes": 4421934, "cssBytes": 0, "imageBytes": 810035, "fontBytes": 0, - "jsRequests": 87, + "jsRequests": 91, "cssRequests": 0, - "imageRequests": 5, + "imageRequests": 7, "jsExecutionTime": 0, "taskDuration": 0, "layoutDuration": 0, "paintDuration": 0 }, "max": { - "fcp": 156, - "lcp": 0, - "cls": 0, + "fcp": 160, + "lcp": 184, + "cls": 0.04666640980253497, "fid": 0, - "ttfb": 10.399999998509884, - "domContentLoaded": 181.39999999850988, - "loadComplete": 614.5, - "totalRequests": 100, - "totalBytes": 8299347, - "jsBytes": 4295712, + "ttfb": 9.399999998509884, + "domContentLoaded": 166.79999999701977, + "loadComplete": 602.1999999955297, + "totalRequests": 105, + "totalBytes": 8451841, + "jsBytes": 4421934, "cssBytes": 0, "imageBytes": 810035, "fontBytes": 0, - "jsRequests": 87, + "jsRequests": 91, "cssRequests": 0, - "imageRequests": 5, + "imageRequests": 7, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 104, "layoutDuration": 0, "paintDuration": 0 } @@ -234,223 +190,179 @@ "url": "http://localhost:3000/about", "runs": [ { - "fcp": 76, - "lcp": 0, - "cls": 0, + "fcp": 428, + "lcp": 428, + "cls": 0.00008728592484085647, "fid": 0, - "ttfb": 5.799999997019768, - "domContentLoaded": 82, - "loadComplete": 431.70000000298023, - "totalRequests": 92, - "totalBytes": 4338478, - "jsBytes": 4274041, + "ttfb": 22.200000002980232, + "domContentLoaded": 132.89999999850988, + "loadComplete": 851.6999999955297, + "totalRequests": 103, + "totalBytes": 4514246, + "jsBytes": 4423537, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 87, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 390, "layoutDuration": 0, "paintDuration": 0 }, { - "fcp": 80, - "lcp": 0, - "cls": 0, + "fcp": 336, + "lcp": 336, + "cls": 0.00014995421107413841, "fid": 0, - "ttfb": 6.700000002980232, - "domContentLoaded": 89, - "loadComplete": 462.5, - "totalRequests": 92, - "totalBytes": 4338478, - "jsBytes": 4274041, + "ttfb": 19.799999997019768, + "domContentLoaded": 274.1000000014901, + "loadComplete": 979.7000000029802, + "totalRequests": 103, + "totalBytes": 4514246, + "jsBytes": 4423537, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 87, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 295, "layoutDuration": 0, "paintDuration": 0 }, { - "fcp": 96, - "lcp": 0, - "cls": 0, + "fcp": 392, + "lcp": 392, + "cls": 0.00007936278292181069, "fid": 0, - "ttfb": 8.899999998509884, - "domContentLoaded": 105.89999999850988, - "loadComplete": 496.20000000298023, - "totalRequests": 92, - "totalBytes": 4338478, - "jsBytes": 4274041, + "ttfb": 24.099999994039536, + "domContentLoaded": 327.8999999985099, + "loadComplete": 644.2999999970198, + "totalRequests": 103, + "totalBytes": 4514246, + "jsBytes": 4423537, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 87, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 84, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.399999998509884, - "domContentLoaded": 91.20000000298023, - "loadComplete": 470.1000000014901, - "totalRequests": 92, - "totalBytes": 4338478, - "jsBytes": 4274041, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 87, - "cssRequests": 0, - "imageRequests": 3, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 84, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.700000002980232, - "domContentLoaded": 89.89999999850988, - "loadComplete": 475.19999999552965, - "totalRequests": 92, - "totalBytes": 4338478, - "jsBytes": 4274041, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 87, - "cssRequests": 0, - "imageRequests": 3, - "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 346, "layoutDuration": 0, "paintDuration": 0 } ], "average": { - "fcp": 84, - "lcp": 0, - "cls": 0, + "fcp": 385.3333333333333, + "lcp": 385.3333333333333, + "cls": 0.00010553430627893521, "fid": 0, - "ttfb": 7.3, - "domContentLoaded": 91.6, - "loadComplete": 467.14000000059605, - "totalRequests": 92, - "totalBytes": 4338478, - "jsBytes": 4274041, + "ttfb": 22.033333331346512, + "domContentLoaded": 244.96666666616997, + "loadComplete": 825.2333333318433, + "totalRequests": 103, + "totalBytes": 4514246, + "jsBytes": 4423537, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 87, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 343.6666666666667, "layoutDuration": 0, "paintDuration": 0 }, "median": { - "fcp": 96, - "lcp": 0, - "cls": 0, + "fcp": 392, + "lcp": 392, + "cls": 0.00007936278292181069, "fid": 0, - "ttfb": 8.899999998509884, - "domContentLoaded": 105.89999999850988, - "loadComplete": 496.20000000298023, - "totalRequests": 92, - "totalBytes": 4338478, - "jsBytes": 4274041, + "ttfb": 24.099999994039536, + "domContentLoaded": 327.8999999985099, + "loadComplete": 644.2999999970198, + "totalRequests": 103, + "totalBytes": 4514246, + "jsBytes": 4423537, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 87, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 346, "layoutDuration": 0, "paintDuration": 0 }, "p95": { - "fcp": 84, - "lcp": 0, - "cls": 0, + "fcp": 428, + "lcp": 428, + "cls": 0.00008728592484085647, "fid": 0, - "ttfb": 7.700000002980232, - "domContentLoaded": 89.89999999850988, - "loadComplete": 475.19999999552965, - "totalRequests": 92, - "totalBytes": 4338478, - "jsBytes": 4274041, + "ttfb": 22.200000002980232, + "domContentLoaded": 132.89999999850988, + "loadComplete": 851.6999999955297, + "totalRequests": 103, + "totalBytes": 4514246, + "jsBytes": 4423537, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 87, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 390, "layoutDuration": 0, "paintDuration": 0 }, "min": { - "fcp": 76, - "lcp": 0, - "cls": 0, + "fcp": 336, + "lcp": 336, + "cls": 0.00007936278292181069, "fid": 0, - "ttfb": 5.799999997019768, - "domContentLoaded": 82, - "loadComplete": 431.70000000298023, - "totalRequests": 92, - "totalBytes": 4338478, - "jsBytes": 4274041, + "ttfb": 19.799999997019768, + "domContentLoaded": 132.89999999850988, + "loadComplete": 644.2999999970198, + "totalRequests": 103, + "totalBytes": 4514246, + "jsBytes": 4423537, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 87, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 295, "layoutDuration": 0, "paintDuration": 0 }, "max": { - "fcp": 96, - "lcp": 0, - "cls": 0, + "fcp": 428, + "lcp": 428, + "cls": 0.00014995421107413841, "fid": 0, - "ttfb": 8.899999998509884, - "domContentLoaded": 105.89999999850988, - "loadComplete": 496.20000000298023, - "totalRequests": 92, - "totalBytes": 4338478, - "jsBytes": 4274041, + "ttfb": 24.099999994039536, + "domContentLoaded": 327.8999999985099, + "loadComplete": 979.7000000029802, + "totalRequests": 103, + "totalBytes": 4514246, + "jsBytes": 4423537, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 87, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 390, "layoutDuration": 0, "paintDuration": 0 } @@ -460,223 +372,907 @@ "url": "http://localhost:3000/blog", "runs": [ { - "fcp": 100, - "lcp": 0, - "cls": 0, + "fcp": 656, + "lcp": 1940, + "cls": 0.00011959311402874229, "fid": 0, - "ttfb": 11.100000001490116, - "domContentLoaded": 97.29999999701977, - "loadComplete": 545.5999999940395, - "totalRequests": 112, - "totalBytes": 4472603, - "jsBytes": 4408166, + "ttfb": 78.20000000298023, + "domContentLoaded": 413.19999999552965, + "loadComplete": 1915.7999999970198, + "totalRequests": 122, + "totalBytes": 4632398, + "jsBytes": 4541689, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 98, + "jsRequests": 103, "cssRequests": 0, - "imageRequests": 12, + "imageRequests": 16, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 1297, "layoutDuration": 0, "paintDuration": 0 }, { - "fcp": 104, - "lcp": 0, - "cls": 0, + "fcp": 552, + "lcp": 1216, + "cls": 0.00008675864890769677, "fid": 0, - "ttfb": 11.399999998509884, - "domContentLoaded": 101.5, - "loadComplete": 474.80000000447035, - "totalRequests": 112, - "totalBytes": 4472603, - "jsBytes": 4408166, + "ttfb": 32.70000000298023, + "domContentLoaded": 490.8999999985099, + "loadComplete": 1442.1000000014901, + "totalRequests": 122, + "totalBytes": 4632398, + "jsBytes": 4541689, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 98, + "jsRequests": 103, "cssRequests": 0, - "imageRequests": 12, + "imageRequests": 16, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 980, "layoutDuration": 0, "paintDuration": 0 }, { - "fcp": 100, - "lcp": 0, - "cls": 0, + "fcp": 544, + "lcp": 1732, + "cls": 0.00007793539541739004, "fid": 0, - "ttfb": 10.899999998509884, - "domContentLoaded": 97.20000000298023, - "loadComplete": 528.5, - "totalRequests": 112, - "totalBytes": 4472603, - "jsBytes": 4408166, + "ttfb": 37.20000000298023, + "domContentLoaded": 158.70000000298023, + "loadComplete": 1629.8000000044703, + "totalRequests": 122, + "totalBytes": 4632398, + "jsBytes": 4541689, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 98, + "jsRequests": 103, "cssRequests": 0, - "imageRequests": 12, + "imageRequests": 16, "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 100, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 11, - "domContentLoaded": 98.69999999552965, - "loadComplete": 525.5, - "totalRequests": 112, - "totalBytes": 4472603, - "jsBytes": 4408166, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 98, - "cssRequests": 0, - "imageRequests": 12, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 100, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 9.5, - "domContentLoaded": 95.40000000596046, - "loadComplete": 505.1000000014901, - "totalRequests": 112, - "totalBytes": 4472603, - "jsBytes": 4408166, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 98, - "cssRequests": 0, - "imageRequests": 12, - "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 1246, "layoutDuration": 0, "paintDuration": 0 } ], "average": { - "fcp": 100.8, - "lcp": 0, - "cls": 0, + "fcp": 584, + "lcp": 1629.3333333333333, + "cls": 0.00009476238611794304, "fid": 0, - "ttfb": 10.779999999701976, - "domContentLoaded": 98.02000000029803, - "loadComplete": 515.9, - "totalRequests": 112, - "totalBytes": 4472603, - "jsBytes": 4408166, + "ttfb": 49.3666666696469, + "domContentLoaded": 354.26666666567326, + "loadComplete": 1662.56666666766, + "totalRequests": 122, + "totalBytes": 4632398, + "jsBytes": 4541689, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 98, + "jsRequests": 103, "cssRequests": 0, - "imageRequests": 12, + "imageRequests": 16, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 1174.3333333333333, "layoutDuration": 0, "paintDuration": 0 }, "median": { - "fcp": 100, - "lcp": 0, - "cls": 0, + "fcp": 544, + "lcp": 1732, + "cls": 0.00007793539541739004, "fid": 0, - "ttfb": 10.899999998509884, - "domContentLoaded": 97.20000000298023, - "loadComplete": 528.5, - "totalRequests": 112, - "totalBytes": 4472603, - "jsBytes": 4408166, + "ttfb": 37.20000000298023, + "domContentLoaded": 158.70000000298023, + "loadComplete": 1629.8000000044703, + "totalRequests": 122, + "totalBytes": 4632398, + "jsBytes": 4541689, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 98, + "jsRequests": 103, "cssRequests": 0, - "imageRequests": 12, + "imageRequests": 16, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 1246, "layoutDuration": 0, "paintDuration": 0 }, "p95": { - "fcp": 100, - "lcp": 0, - "cls": 0, + "fcp": 656, + "lcp": 1940, + "cls": 0.00011959311402874229, "fid": 0, - "ttfb": 9.5, - "domContentLoaded": 95.40000000596046, - "loadComplete": 505.1000000014901, - "totalRequests": 112, - "totalBytes": 4472603, - "jsBytes": 4408166, + "ttfb": 78.20000000298023, + "domContentLoaded": 413.19999999552965, + "loadComplete": 1915.7999999970198, + "totalRequests": 122, + "totalBytes": 4632398, + "jsBytes": 4541689, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 98, + "jsRequests": 103, "cssRequests": 0, - "imageRequests": 12, + "imageRequests": 16, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 1297, "layoutDuration": 0, "paintDuration": 0 }, "min": { - "fcp": 100, - "lcp": 0, - "cls": 0, + "fcp": 544, + "lcp": 1216, + "cls": 0.00007793539541739004, "fid": 0, - "ttfb": 9.5, - "domContentLoaded": 95.40000000596046, - "loadComplete": 474.80000000447035, - "totalRequests": 112, - "totalBytes": 4472603, - "jsBytes": 4408166, + "ttfb": 32.70000000298023, + "domContentLoaded": 158.70000000298023, + "loadComplete": 1442.1000000014901, + "totalRequests": 122, + "totalBytes": 4632398, + "jsBytes": 4541689, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 98, + "jsRequests": 103, "cssRequests": 0, - "imageRequests": 12, + "imageRequests": 16, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 980, "layoutDuration": 0, "paintDuration": 0 }, "max": { - "fcp": 104, - "lcp": 0, - "cls": 0, + "fcp": 656, + "lcp": 1940, + "cls": 0.00011959311402874229, "fid": 0, - "ttfb": 11.399999998509884, - "domContentLoaded": 101.5, - "loadComplete": 545.5999999940395, - "totalRequests": 112, - "totalBytes": 4472603, - "jsBytes": 4408166, + "ttfb": 78.20000000298023, + "domContentLoaded": 490.8999999985099, + "loadComplete": 1915.7999999970198, + "totalRequests": 122, + "totalBytes": 4632398, + "jsBytes": 4541689, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 98, + "jsRequests": 103, "cssRequests": 0, - "imageRequests": 12, + "imageRequests": 16, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 1297, + "layoutDuration": 0, + "paintDuration": 0 + } + }, + { + "page": "Blog Post (basic)", + "url": "http://localhost:3000/blog/I_made_a_macOS_app_in_a_day", + "runs": [ + { + "fcp": 748, + "lcp": 876, + "cls": 0.00007054605994204926, + "fid": 0, + "ttfb": 251.20000000298023, + "domContentLoaded": 583, + "loadComplete": 927.4000000059605, + "totalRequests": 138, + "totalBytes": 5055597, + "jsBytes": 4964550, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 129, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 354, + "layoutDuration": 0, + "paintDuration": 0 + }, + { + "fcp": 792, + "lcp": 924, + "cls": 0.000056656700102880665, + "fid": 0, + "ttfb": 287.20000000298023, + "domContentLoaded": 594.1000000014901, + "loadComplete": 1019.1000000014901, + "totalRequests": 138, + "totalBytes": 5055597, + "jsBytes": 4964550, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 129, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 353, + "layoutDuration": 0, + "paintDuration": 0 + }, + { + "fcp": 1004, + "lcp": 1132, + "cls": 0.00016702569561240116, + "fid": 0, + "ttfb": 416.40000000596046, + "domContentLoaded": 550.5, + "loadComplete": 1677.8999999985099, + "totalRequests": 138, + "totalBytes": 5055597, + "jsBytes": 4964550, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 129, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 332, + "layoutDuration": 0, + "paintDuration": 0 + } + ], + "average": { + "fcp": 848, + "lcp": 977.3333333333334, + "cls": 0.00009807615188577703, + "fid": 0, + "ttfb": 318.2666666706403, + "domContentLoaded": 575.8666666671634, + "loadComplete": 1208.1333333353202, + "totalRequests": 138, + "totalBytes": 5055597, + "jsBytes": 4964550, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 129, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 346.3333333333333, + "layoutDuration": 0, + "paintDuration": 0 + }, + "median": { + "fcp": 792, + "lcp": 924, + "cls": 0.000056656700102880665, + "fid": 0, + "ttfb": 287.20000000298023, + "domContentLoaded": 594.1000000014901, + "loadComplete": 1019.1000000014901, + "totalRequests": 138, + "totalBytes": 5055597, + "jsBytes": 4964550, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 129, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 353, + "layoutDuration": 0, + "paintDuration": 0 + }, + "p95": { + "fcp": 1004, + "lcp": 1132, + "cls": 0.00016702569561240116, + "fid": 0, + "ttfb": 416.40000000596046, + "domContentLoaded": 550.5, + "loadComplete": 1677.8999999985099, + "totalRequests": 138, + "totalBytes": 5055597, + "jsBytes": 4964550, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 129, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 332, + "layoutDuration": 0, + "paintDuration": 0 + }, + "min": { + "fcp": 748, + "lcp": 876, + "cls": 0.000056656700102880665, + "fid": 0, + "ttfb": 251.20000000298023, + "domContentLoaded": 550.5, + "loadComplete": 927.4000000059605, + "totalRequests": 138, + "totalBytes": 5055597, + "jsBytes": 4964550, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 129, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 332, + "layoutDuration": 0, + "paintDuration": 0 + }, + "max": { + "fcp": 1004, + "lcp": 1132, + "cls": 0.00016702569561240116, + "fid": 0, + "ttfb": 416.40000000596046, + "domContentLoaded": 594.1000000014901, + "loadComplete": 1677.8999999985099, + "totalRequests": 138, + "totalBytes": 5055597, + "jsBytes": 4964550, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 129, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 354, + "layoutDuration": 0, + "paintDuration": 0 + } + }, + { + "page": "Blog Post with multiple images", + "url": "http://localhost:3000/blog/Shapes_With_Abigail!", + "runs": [ + { + "fcp": 2088, + "lcp": 4300, + "cls": 0.00019789763242619515, + "fid": 0, + "ttfb": 1480, + "domContentLoaded": 1821.3000000044703, + "loadComplete": 4132.20000000298, + "totalRequests": 165, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 9, + "jsExecutionTime": 0, + "taskDuration": 443, + "layoutDuration": 0, + "paintDuration": 0 + }, + { + "fcp": 812, + "lcp": 920, + "cls": 0.00015847958851253054, + "fid": 0, + "ttfb": 286.5, + "domContentLoaded": 633.3999999985099, + "loadComplete": 1862.1999999955297, + "totalRequests": 165, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 9, + "jsExecutionTime": 0, + "taskDuration": 367, + "layoutDuration": 0, + "paintDuration": 0 + }, + { + "fcp": 808, + "lcp": 936, + "cls": 0.00011160022437327193, + "fid": 0, + "ttfb": 292.80000000447035, + "domContentLoaded": 578.1999999955297, + "loadComplete": 1314.3999999985099, + "totalRequests": 165, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 9, + "jsExecutionTime": 0, + "taskDuration": 257, + "layoutDuration": 0, + "paintDuration": 0 + } + ], + "average": { + "fcp": 1236, + "lcp": 2052, + "cls": 0.00015599248177066588, + "fid": 0, + "ttfb": 686.4333333348235, + "domContentLoaded": 1010.96666666617, + "loadComplete": 2436.2666666656733, + "totalRequests": 165, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 9, + "jsExecutionTime": 0, + "taskDuration": 355.6666666666667, + "layoutDuration": 0, + "paintDuration": 0 + }, + "median": { + "fcp": 808, + "lcp": 936, + "cls": 0.00011160022437327193, + "fid": 0, + "ttfb": 292.80000000447035, + "domContentLoaded": 578.1999999955297, + "loadComplete": 1314.3999999985099, + "totalRequests": 165, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 9, + "jsExecutionTime": 0, + "taskDuration": 257, + "layoutDuration": 0, + "paintDuration": 0 + }, + "p95": { + "fcp": 2088, + "lcp": 4300, + "cls": 0.00019789763242619515, + "fid": 0, + "ttfb": 1480, + "domContentLoaded": 1821.3000000044703, + "loadComplete": 4132.20000000298, + "totalRequests": 165, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 9, + "jsExecutionTime": 0, + "taskDuration": 443, + "layoutDuration": 0, + "paintDuration": 0 + }, + "min": { + "fcp": 808, + "lcp": 920, + "cls": 0.00011160022437327193, + "fid": 0, + "ttfb": 286.5, + "domContentLoaded": 578.1999999955297, + "loadComplete": 1314.3999999985099, + "totalRequests": 165, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 9, + "jsExecutionTime": 0, + "taskDuration": 257, + "layoutDuration": 0, + "paintDuration": 0 + }, + "max": { + "fcp": 2088, + "lcp": 4300, + "cls": 0.00019789763242619515, + "fid": 0, + "ttfb": 1480, + "domContentLoaded": 1821.3000000044703, + "loadComplete": 4132.20000000298, + "totalRequests": 165, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 9, + "jsExecutionTime": 0, + "taskDuration": 443, + "layoutDuration": 0, + "paintDuration": 0 + } + }, + { + "page": "Blog Post with large banner", + "url": "http://localhost:3000/blog/My_MacOS_rice.", + "runs": [ + { + "fcp": 820, + "lcp": 1576, + "cls": 0.0000651823758097833, + "fid": 0, + "ttfb": 276.59999999403954, + "domContentLoaded": 646.2000000029802, + "loadComplete": 952.8000000044703, + "totalRequests": 164, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 8, + "jsExecutionTime": 0, + "taskDuration": 409, + "layoutDuration": 0, + "paintDuration": 0 + }, + { + "fcp": 880, + "lcp": 2160, + "cls": 0.000051238950878504373, + "fid": 0, + "ttfb": 274.09999999403954, + "domContentLoaded": 693.7000000029802, + "loadComplete": 1390.8000000044703, + "totalRequests": 164, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 8, + "jsExecutionTime": 0, + "taskDuration": 1301, + "layoutDuration": 0, + "paintDuration": 0 + }, + { + "fcp": 876, + "lcp": 1852, + "cls": 0.000055821799447016466, + "fid": 0, + "ttfb": 225.70000000298023, + "domContentLoaded": 327, + "loadComplete": 1227.6999999955297, + "totalRequests": 164, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 8, + "jsExecutionTime": 0, + "taskDuration": 1070, + "layoutDuration": 0, + "paintDuration": 0 + } + ], + "average": { + "fcp": 858.6666666666666, + "lcp": 1862.6666666666667, + "cls": 0.00005741437537843471, + "fid": 0, + "ttfb": 258.79999999701977, + "domContentLoaded": 555.6333333353201, + "loadComplete": 1190.4333333348234, + "totalRequests": 164, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 8, + "jsExecutionTime": 0, + "taskDuration": 926.6666666666666, + "layoutDuration": 0, + "paintDuration": 0 + }, + "median": { + "fcp": 876, + "lcp": 1852, + "cls": 0.000055821799447016466, + "fid": 0, + "ttfb": 225.70000000298023, + "domContentLoaded": 327, + "loadComplete": 1227.6999999955297, + "totalRequests": 164, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 8, + "jsExecutionTime": 0, + "taskDuration": 1070, + "layoutDuration": 0, + "paintDuration": 0 + }, + "p95": { + "fcp": 880, + "lcp": 2160, + "cls": 0.000051238950878504373, + "fid": 0, + "ttfb": 274.09999999403954, + "domContentLoaded": 693.7000000029802, + "loadComplete": 1390.8000000044703, + "totalRequests": 164, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 8, + "jsExecutionTime": 0, + "taskDuration": 1301, + "layoutDuration": 0, + "paintDuration": 0 + }, + "min": { + "fcp": 820, + "lcp": 1576, + "cls": 0.000051238950878504373, + "fid": 0, + "ttfb": 225.70000000298023, + "domContentLoaded": 327, + "loadComplete": 952.8000000044703, + "totalRequests": 164, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 8, + "jsExecutionTime": 0, + "taskDuration": 409, + "layoutDuration": 0, + "paintDuration": 0 + }, + "max": { + "fcp": 880, + "lcp": 2160, + "cls": 0.0000651823758097833, + "fid": 0, + "ttfb": 276.59999999403954, + "domContentLoaded": 693.7000000029802, + "loadComplete": 1390.8000000044703, + "totalRequests": 164, + "totalBytes": 5831575, + "jsBytes": 5740528, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 152, + "cssRequests": 0, + "imageRequests": 8, + "jsExecutionTime": 0, + "taskDuration": 1301, + "layoutDuration": 0, + "paintDuration": 0 + } + }, + { + "page": "Blog Post with Mermaid", + "url": "http://localhost:3000/blog/A_Journey_in_Self_Hosting", + "runs": [ + { + "fcp": 2768, + "lcp": 2768, + "cls": 0.00024232751351815682, + "fid": 0, + "ttfb": 2173.5999999940395, + "domContentLoaded": 2543, + "loadComplete": 4855.5, + "totalRequests": 186, + "totalBytes": 12817938, + "jsBytes": 12726891, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 177, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 1005, + "layoutDuration": 0, + "paintDuration": 0 + }, + { + "fcp": 3548, + "lcp": 3548, + "cls": 0.00016448296440972222, + "fid": 0, + "ttfb": 3000.7000000029802, + "domContentLoaded": 3408.4000000059605, + "loadComplete": 4668, + "totalRequests": 186, + "totalBytes": 12817938, + "jsBytes": 12726891, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 177, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 1076, + "layoutDuration": 0, + "paintDuration": 0 + }, + { + "fcp": 920, + "lcp": 920, + "cls": 0.00005739648450058674, + "fid": 0, + "ttfb": 328.20000000298023, + "domContentLoaded": 719, + "loadComplete": 1139.2000000029802, + "totalRequests": 186, + "totalBytes": 12817938, + "jsBytes": 12726891, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 177, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 1066, + "layoutDuration": 0, + "paintDuration": 0 + } + ], + "average": { + "fcp": 2412, + "lcp": 2412, + "cls": 0.00015473565414282194, + "fid": 0, + "ttfb": 1834.1666666666667, + "domContentLoaded": 2223.4666666686535, + "loadComplete": 3554.2333333343267, + "totalRequests": 186, + "totalBytes": 12817938, + "jsBytes": 12726891, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 177, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 1049, + "layoutDuration": 0, + "paintDuration": 0 + }, + "median": { + "fcp": 2768, + "lcp": 2768, + "cls": 0.00024232751351815682, + "fid": 0, + "ttfb": 2173.5999999940395, + "domContentLoaded": 2543, + "loadComplete": 4855.5, + "totalRequests": 186, + "totalBytes": 12817938, + "jsBytes": 12726891, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 177, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 1005, + "layoutDuration": 0, + "paintDuration": 0 + }, + "p95": { + "fcp": 3548, + "lcp": 3548, + "cls": 0.00016448296440972222, + "fid": 0, + "ttfb": 3000.7000000029802, + "domContentLoaded": 3408.4000000059605, + "loadComplete": 4668, + "totalRequests": 186, + "totalBytes": 12817938, + "jsBytes": 12726891, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 177, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 1076, + "layoutDuration": 0, + "paintDuration": 0 + }, + "min": { + "fcp": 920, + "lcp": 920, + "cls": 0.00005739648450058674, + "fid": 0, + "ttfb": 328.20000000298023, + "domContentLoaded": 719, + "loadComplete": 1139.2000000029802, + "totalRequests": 186, + "totalBytes": 12817938, + "jsBytes": 12726891, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 177, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 1005, + "layoutDuration": 0, + "paintDuration": 0 + }, + "max": { + "fcp": 3548, + "lcp": 3548, + "cls": 0.00024232751351815682, + "fid": 0, + "ttfb": 3000.7000000029802, + "domContentLoaded": 3408.4000000059605, + "loadComplete": 4855.5, + "totalRequests": 186, + "totalBytes": 12817938, + "jsBytes": 12726891, + "cssBytes": 0, + "imageBytes": 0, + "fontBytes": 0, + "jsRequests": 177, + "cssRequests": 0, + "imageRequests": 5, + "jsExecutionTime": 0, + "taskDuration": 1076, "layoutDuration": 0, "paintDuration": 0 } @@ -686,223 +1282,179 @@ "url": "http://localhost:3000/resume", "runs": [ { - "fcp": 80, - "lcp": 0, - "cls": 0, + "fcp": 380, + "lcp": 380, + "cls": 0.00014887656694577065, "fid": 0, - "ttfb": 5.600000001490116, - "domContentLoaded": 81.89999999850988, - "loadComplete": 487.79999999701977, - "totalRequests": 95, - "totalBytes": 9252918, - "jsBytes": 7777227, + "ttfb": 23.399999998509884, + "domContentLoaded": 328.79999999701977, + "loadComplete": 965.7999999970198, + "totalRequests": 99, + "totalBytes": 4494958, + "jsBytes": 4404249, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 88, + "jsRequests": 91, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 319, "layoutDuration": 0, "paintDuration": 0 }, { - "fcp": 80, - "lcp": 0, - "cls": 0, + "fcp": 332, + "lcp": 332, + "cls": 0.0002888629112714603, "fid": 0, - "ttfb": 7, - "domContentLoaded": 85.60000000149012, - "loadComplete": 502, - "totalRequests": 95, - "totalBytes": 9252918, - "jsBytes": 7777227, + "ttfb": 19.899999998509884, + "domContentLoaded": 304.29999999701977, + "loadComplete": 606.6999999955297, + "totalRequests": 99, + "totalBytes": 4494958, + "jsBytes": 4404249, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 88, + "jsRequests": 91, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 335, "layoutDuration": 0, "paintDuration": 0 }, { - "fcp": 80, - "lcp": 0, - "cls": 0, + "fcp": 92, + "lcp": 92, + "cls": 0.00035258505864398473, "fid": 0, - "ttfb": 6.600000001490116, - "domContentLoaded": 86.69999999552965, - "loadComplete": 597.5999999940395, - "totalRequests": 95, - "totalBytes": 9252918, - "jsBytes": 7777227, + "ttfb": 8.199999995529652, + "domContentLoaded": 105.40000000596046, + "loadComplete": 1785.4000000059605, + "totalRequests": 99, + "totalBytes": 4494958, + "jsBytes": 4404249, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 88, + "jsRequests": 91, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 84, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.699999995529652, - "domContentLoaded": 88.29999999701977, - "loadComplete": 568.1000000014901, - "totalRequests": 95, - "totalBytes": 9252918, - "jsBytes": 7777227, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 88, - "cssRequests": 0, - "imageRequests": 3, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 84, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.700000002980232, - "domContentLoaded": 88.5, - "loadComplete": 482, - "totalRequests": 95, - "totalBytes": 9252918, - "jsBytes": 7777227, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 88, - "cssRequests": 0, - "imageRequests": 3, - "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 53, "layoutDuration": 0, "paintDuration": 0 } ], "average": { - "fcp": 81.6, - "lcp": 0, - "cls": 0, + "fcp": 268, + "lcp": 268, + "cls": 0.00026344151228707187, "fid": 0, - "ttfb": 6.920000000298023, - "domContentLoaded": 86.19999999850988, - "loadComplete": 527.4999999985099, - "totalRequests": 95, - "totalBytes": 9252918, - "jsBytes": 7777227, + "ttfb": 17.16666666418314, + "domContentLoaded": 246.16666666666666, + "loadComplete": 1119.2999999995034, + "totalRequests": 99, + "totalBytes": 4494958, + "jsBytes": 4404249, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 88, + "jsRequests": 91, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 235.66666666666666, "layoutDuration": 0, "paintDuration": 0 }, "median": { - "fcp": 80, - "lcp": 0, - "cls": 0, + "fcp": 332, + "lcp": 332, + "cls": 0.0002888629112714603, "fid": 0, - "ttfb": 6.600000001490116, - "domContentLoaded": 86.69999999552965, - "loadComplete": 597.5999999940395, - "totalRequests": 95, - "totalBytes": 9252918, - "jsBytes": 7777227, + "ttfb": 19.899999998509884, + "domContentLoaded": 304.29999999701977, + "loadComplete": 606.6999999955297, + "totalRequests": 99, + "totalBytes": 4494958, + "jsBytes": 4404249, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 88, + "jsRequests": 91, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 335, "layoutDuration": 0, "paintDuration": 0 }, "p95": { - "fcp": 84, - "lcp": 0, - "cls": 0, + "fcp": 380, + "lcp": 380, + "cls": 0.00014887656694577065, "fid": 0, - "ttfb": 7.700000002980232, - "domContentLoaded": 88.5, - "loadComplete": 482, - "totalRequests": 95, - "totalBytes": 9252918, - "jsBytes": 7777227, + "ttfb": 23.399999998509884, + "domContentLoaded": 328.79999999701977, + "loadComplete": 965.7999999970198, + "totalRequests": 99, + "totalBytes": 4494958, + "jsBytes": 4404249, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 88, + "jsRequests": 91, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 319, "layoutDuration": 0, "paintDuration": 0 }, "min": { - "fcp": 80, - "lcp": 0, - "cls": 0, + "fcp": 92, + "lcp": 92, + "cls": 0.00014887656694577065, "fid": 0, - "ttfb": 5.600000001490116, - "domContentLoaded": 81.89999999850988, - "loadComplete": 482, - "totalRequests": 95, - "totalBytes": 9252918, - "jsBytes": 7777227, + "ttfb": 8.199999995529652, + "domContentLoaded": 105.40000000596046, + "loadComplete": 606.6999999955297, + "totalRequests": 99, + "totalBytes": 4494958, + "jsBytes": 4404249, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 88, + "jsRequests": 91, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 53, "layoutDuration": 0, "paintDuration": 0 }, "max": { - "fcp": 84, - "lcp": 0, - "cls": 0, + "fcp": 380, + "lcp": 380, + "cls": 0.00035258505864398473, "fid": 0, - "ttfb": 7.700000002980232, - "domContentLoaded": 88.5, - "loadComplete": 597.5999999940395, - "totalRequests": 95, - "totalBytes": 9252918, - "jsBytes": 7777227, + "ttfb": 23.399999998509884, + "domContentLoaded": 328.79999999701977, + "loadComplete": 1785.4000000059605, + "totalRequests": 99, + "totalBytes": 4494958, + "jsBytes": 4404249, "cssBytes": 0, "imageBytes": 0, "fontBytes": 0, - "jsRequests": 88, + "jsRequests": 91, "cssRequests": 0, - "imageRequests": 3, + "imageRequests": 5, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 335, "layoutDuration": 0, "paintDuration": 0 } @@ -912,223 +1464,179 @@ "url": "http://localhost:3000/contact", "runs": [ { - "fcp": 116, - "lcp": 0, - "cls": 0, + "fcp": 624, + "lcp": 624, + "cls": 0.00034250432081183314, "fid": 0, - "ttfb": 8.299999997019768, - "domContentLoaded": 91.39999999850988, - "loadComplete": 457.69999999552965, - "totalRequests": 97, - "totalBytes": 5076898, - "jsBytes": 4351416, + "ttfb": 25.899999998509884, + "domContentLoaded": 362.09999999403954, + "loadComplete": 4668.79999999702, + "totalRequests": 104, + "totalBytes": 5229913, + "jsBytes": 4478159, "cssBytes": 0, "imageBytes": 660146, "fontBytes": 0, - "jsRequests": 91, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 4, + "imageRequests": 6, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 387, "layoutDuration": 0, "paintDuration": 0 }, { - "fcp": 116, - "lcp": 0, - "cls": 0, + "fcp": 824, + "lcp": 824, + "cls": 0.00020064100414637185, "fid": 0, - "ttfb": 7.799999997019768, - "domContentLoaded": 93.29999999701977, - "loadComplete": 472.1000000014901, - "totalRequests": 97, - "totalBytes": 5076898, - "jsBytes": 4351416, + "ttfb": 44.600000001490116, + "domContentLoaded": 482.20000000298023, + "loadComplete": 1250.5, + "totalRequests": 104, + "totalBytes": 5229913, + "jsBytes": 4478159, "cssBytes": 0, "imageBytes": 660146, "fontBytes": 0, - "jsRequests": 91, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 4, + "imageRequests": 6, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 389, "layoutDuration": 0, "paintDuration": 0 }, { - "fcp": 120, - "lcp": 0, - "cls": 0, + "fcp": 540, + "lcp": 540, + "cls": 0.00018063759509428048, "fid": 0, - "ttfb": 8.400000005960464, - "domContentLoaded": 97.59999999403954, - "loadComplete": 467.19999999552965, - "totalRequests": 97, - "totalBytes": 5076898, - "jsBytes": 4351416, + "ttfb": 28.19999999552965, + "domContentLoaded": 330.09999999403954, + "loadComplete": 1055.5999999940395, + "totalRequests": 104, + "totalBytes": 5229913, + "jsBytes": 4478159, "cssBytes": 0, "imageBytes": 660146, "fontBytes": 0, - "jsRequests": 91, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 4, + "imageRequests": 6, "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 120, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.100000001490116, - "domContentLoaded": 92.20000000298023, - "loadComplete": 451.20000000298023, - "totalRequests": 97, - "totalBytes": 5076898, - "jsBytes": 4351416, - "cssBytes": 0, - "imageBytes": 660146, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 4, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 120, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8, - "domContentLoaded": 93.60000000149012, - "loadComplete": 537.8000000044703, - "totalRequests": 97, - "totalBytes": 5076898, - "jsBytes": 4351416, - "cssBytes": 0, - "imageBytes": 660146, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 4, - "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 349, "layoutDuration": 0, "paintDuration": 0 } ], "average": { - "fcp": 118.4, - "lcp": 0, - "cls": 0, + "fcp": 662.6666666666666, + "lcp": 662.6666666666666, + "cls": 0.0002412609733508285, "fid": 0, - "ttfb": 8.120000000298024, - "domContentLoaded": 93.61999999880791, - "loadComplete": 477.2, - "totalRequests": 97, - "totalBytes": 5076898, - "jsBytes": 4351416, + "ttfb": 32.899999998509884, + "domContentLoaded": 391.46666666368645, + "loadComplete": 2324.9666666636863, + "totalRequests": 104, + "totalBytes": 5229913, + "jsBytes": 4478159, "cssBytes": 0, "imageBytes": 660146, "fontBytes": 0, - "jsRequests": 91, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 4, + "imageRequests": 6, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 375, "layoutDuration": 0, "paintDuration": 0 }, "median": { - "fcp": 120, - "lcp": 0, - "cls": 0, + "fcp": 624, + "lcp": 624, + "cls": 0.00034250432081183314, "fid": 0, - "ttfb": 8.400000005960464, - "domContentLoaded": 97.59999999403954, - "loadComplete": 467.19999999552965, - "totalRequests": 97, - "totalBytes": 5076898, - "jsBytes": 4351416, + "ttfb": 25.899999998509884, + "domContentLoaded": 362.09999999403954, + "loadComplete": 4668.79999999702, + "totalRequests": 104, + "totalBytes": 5229913, + "jsBytes": 4478159, "cssBytes": 0, "imageBytes": 660146, "fontBytes": 0, - "jsRequests": 91, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 4, + "imageRequests": 6, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 387, "layoutDuration": 0, "paintDuration": 0 }, "p95": { - "fcp": 120, - "lcp": 0, - "cls": 0, + "fcp": 824, + "lcp": 824, + "cls": 0.00020064100414637185, "fid": 0, - "ttfb": 8, - "domContentLoaded": 93.60000000149012, - "loadComplete": 537.8000000044703, - "totalRequests": 97, - "totalBytes": 5076898, - "jsBytes": 4351416, + "ttfb": 44.600000001490116, + "domContentLoaded": 482.20000000298023, + "loadComplete": 1250.5, + "totalRequests": 104, + "totalBytes": 5229913, + "jsBytes": 4478159, "cssBytes": 0, "imageBytes": 660146, "fontBytes": 0, - "jsRequests": 91, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 4, + "imageRequests": 6, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 389, "layoutDuration": 0, "paintDuration": 0 }, "min": { - "fcp": 116, - "lcp": 0, - "cls": 0, + "fcp": 540, + "lcp": 540, + "cls": 0.00018063759509428048, "fid": 0, - "ttfb": 7.799999997019768, - "domContentLoaded": 91.39999999850988, - "loadComplete": 451.20000000298023, - "totalRequests": 97, - "totalBytes": 5076898, - "jsBytes": 4351416, + "ttfb": 25.899999998509884, + "domContentLoaded": 330.09999999403954, + "loadComplete": 1055.5999999940395, + "totalRequests": 104, + "totalBytes": 5229913, + "jsBytes": 4478159, "cssBytes": 0, "imageBytes": 660146, "fontBytes": 0, - "jsRequests": 91, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 4, + "imageRequests": 6, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 349, "layoutDuration": 0, "paintDuration": 0 }, "max": { - "fcp": 120, - "lcp": 0, - "cls": 0, + "fcp": 824, + "lcp": 824, + "cls": 0.00034250432081183314, "fid": 0, - "ttfb": 8.400000005960464, - "domContentLoaded": 97.59999999403954, - "loadComplete": 537.8000000044703, - "totalRequests": 97, - "totalBytes": 5076898, - "jsBytes": 4351416, + "ttfb": 44.600000001490116, + "domContentLoaded": 482.20000000298023, + "loadComplete": 4668.79999999702, + "totalRequests": 104, + "totalBytes": 5229913, + "jsBytes": 4478159, "cssBytes": 0, "imageBytes": 660146, "fontBytes": 0, - "jsRequests": 91, + "jsRequests": 95, "cssRequests": 0, - "imageRequests": 4, + "imageRequests": 6, "jsExecutionTime": 0, - "taskDuration": 0, + "taskDuration": 389, "layoutDuration": 0, "paintDuration": 0 } diff --git a/perf-results-baseline-7e89e6d.json b/perf-results-baseline-7e89e6d.json deleted file mode 100644 index be0f8af..0000000 --- a/perf-results-baseline-7e89e6d.json +++ /dev/null @@ -1,1137 +0,0 @@ -{ - "timestamp": "2026-01-04T16:33:45.014Z", - "baseUrl": "http://localhost:3000", - "runsPerPage": 5, - "results": [ - { - "page": "Home", - "url": "http://localhost:3000/", - "runs": [ - { - "fcp": 152, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.300000004470348, - "domContentLoaded": 156.29999999701977, - "loadComplete": 567.6000000014901, - "totalRequests": 105, - "totalBytes": 8432409, - "jsBytes": 4427576, - "cssBytes": 0, - "imageBytes": 810035, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 7, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 152, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.899999998509884, - "domContentLoaded": 166.60000000149012, - "loadComplete": 567.3000000044703, - "totalRequests": 105, - "totalBytes": 8432409, - "jsBytes": 4427576, - "cssBytes": 0, - "imageBytes": 810035, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 7, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 152, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 6.9000000059604645, - "domContentLoaded": 154.60000000149012, - "loadComplete": 569, - "totalRequests": 105, - "totalBytes": 8432409, - "jsBytes": 4427576, - "cssBytes": 0, - "imageBytes": 810035, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 7, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 156, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.200000002980232, - "domContentLoaded": 159.39999999850988, - "loadComplete": 552, - "totalRequests": 105, - "totalBytes": 8432409, - "jsBytes": 4427576, - "cssBytes": 0, - "imageBytes": 810035, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 7, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 156, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 10.600000001490116, - "domContentLoaded": 161.19999999552965, - "loadComplete": 591.5999999940395, - "totalRequests": 105, - "totalBytes": 8432409, - "jsBytes": 4427576, - "cssBytes": 0, - "imageBytes": 810035, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 7, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - } - ], - "average": { - "fcp": 153.6, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.380000002682209, - "domContentLoaded": 159.6199999988079, - "loadComplete": 569.5, - "totalRequests": 105, - "totalBytes": 8432409, - "jsBytes": 4427576, - "cssBytes": 0, - "imageBytes": 810035, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 7, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "median": { - "fcp": 152, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 6.9000000059604645, - "domContentLoaded": 154.60000000149012, - "loadComplete": 569, - "totalRequests": 105, - "totalBytes": 8432409, - "jsBytes": 4427576, - "cssBytes": 0, - "imageBytes": 810035, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 7, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "p95": { - "fcp": 156, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 10.600000001490116, - "domContentLoaded": 161.19999999552965, - "loadComplete": 591.5999999940395, - "totalRequests": 105, - "totalBytes": 8432409, - "jsBytes": 4427576, - "cssBytes": 0, - "imageBytes": 810035, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 7, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "min": { - "fcp": 152, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 6.9000000059604645, - "domContentLoaded": 154.60000000149012, - "loadComplete": 552, - "totalRequests": 105, - "totalBytes": 8432409, - "jsBytes": 4427576, - "cssBytes": 0, - "imageBytes": 810035, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 7, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "max": { - "fcp": 156, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 10.600000001490116, - "domContentLoaded": 166.60000000149012, - "loadComplete": 591.5999999940395, - "totalRequests": 105, - "totalBytes": 8432409, - "jsBytes": 4427576, - "cssBytes": 0, - "imageBytes": 810035, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 7, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - } - }, - { - "page": "About", - "url": "http://localhost:3000/about", - "runs": [ - { - "fcp": 88, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.600000001490116, - "domContentLoaded": 92.70000000298023, - "loadComplete": 456, - "totalRequests": 103, - "totalBytes": 4494798, - "jsBytes": 4429163, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 88, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.100000001490116, - "domContentLoaded": 93.80000000447035, - "loadComplete": 458.6000000014901, - "totalRequests": 103, - "totalBytes": 4494798, - "jsBytes": 4429163, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 88, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.299999997019768, - "domContentLoaded": 94.70000000298023, - "loadComplete": 496.20000000298023, - "totalRequests": 103, - "totalBytes": 4494798, - "jsBytes": 4429163, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 88, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.4000000059604645, - "domContentLoaded": 91.10000000149012, - "loadComplete": 445.29999999701977, - "totalRequests": 103, - "totalBytes": 4494798, - "jsBytes": 4429163, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 88, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.899999998509884, - "domContentLoaded": 93, - "loadComplete": 504.79999999701977, - "totalRequests": 103, - "totalBytes": 4494798, - "jsBytes": 4429163, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - } - ], - "average": { - "fcp": 88, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.86000000089407, - "domContentLoaded": 93.06000000238419, - "loadComplete": 472.179999999702, - "totalRequests": 103, - "totalBytes": 4494798, - "jsBytes": 4429163, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "median": { - "fcp": 88, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.299999997019768, - "domContentLoaded": 94.70000000298023, - "loadComplete": 496.20000000298023, - "totalRequests": 103, - "totalBytes": 4494798, - "jsBytes": 4429163, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "p95": { - "fcp": 88, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.899999998509884, - "domContentLoaded": 93, - "loadComplete": 504.79999999701977, - "totalRequests": 103, - "totalBytes": 4494798, - "jsBytes": 4429163, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "min": { - "fcp": 88, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.4000000059604645, - "domContentLoaded": 91.10000000149012, - "loadComplete": 445.29999999701977, - "totalRequests": 103, - "totalBytes": 4494798, - "jsBytes": 4429163, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "max": { - "fcp": 88, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.299999997019768, - "domContentLoaded": 94.70000000298023, - "loadComplete": 504.79999999701977, - "totalRequests": 103, - "totalBytes": 4494798, - "jsBytes": 4429163, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - } - }, - { - "page": "Blog Index", - "url": "http://localhost:3000/blog", - "runs": [ - { - "fcp": 108, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 12.099999994039536, - "domContentLoaded": 102.29999999701977, - "loadComplete": 509.3999999985099, - "totalRequests": 121, - "totalBytes": 4613030, - "jsBytes": 4547395, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 103, - "cssRequests": 0, - "imageRequests": 15, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 108, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 11.5, - "domContentLoaded": 110, - "loadComplete": 503.80000000447035, - "totalRequests": 121, - "totalBytes": 4613030, - "jsBytes": 4547395, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 103, - "cssRequests": 0, - "imageRequests": 15, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 96, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 10.899999998509884, - "domContentLoaded": 92.69999999552965, - "loadComplete": 471.69999999552965, - "totalRequests": 121, - "totalBytes": 4613030, - "jsBytes": 4547395, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 103, - "cssRequests": 0, - "imageRequests": 15, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 104, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 11.299999997019768, - "domContentLoaded": 99.30000000447035, - "loadComplete": 475.70000000298023, - "totalRequests": 121, - "totalBytes": 4613030, - "jsBytes": 4547395, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 103, - "cssRequests": 0, - "imageRequests": 15, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 104, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 11.5, - "domContentLoaded": 99.40000000596046, - "loadComplete": 537.6000000014901, - "totalRequests": 121, - "totalBytes": 4613030, - "jsBytes": 4547395, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 103, - "cssRequests": 0, - "imageRequests": 15, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - } - ], - "average": { - "fcp": 104, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 11.459999997913837, - "domContentLoaded": 100.74000000059604, - "loadComplete": 499.64000000059605, - "totalRequests": 121, - "totalBytes": 4613030, - "jsBytes": 4547395, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 103, - "cssRequests": 0, - "imageRequests": 15, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "median": { - "fcp": 96, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 10.899999998509884, - "domContentLoaded": 92.69999999552965, - "loadComplete": 471.69999999552965, - "totalRequests": 121, - "totalBytes": 4613030, - "jsBytes": 4547395, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 103, - "cssRequests": 0, - "imageRequests": 15, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "p95": { - "fcp": 104, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 11.5, - "domContentLoaded": 99.40000000596046, - "loadComplete": 537.6000000014901, - "totalRequests": 121, - "totalBytes": 4613030, - "jsBytes": 4547395, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 103, - "cssRequests": 0, - "imageRequests": 15, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "min": { - "fcp": 96, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 10.899999998509884, - "domContentLoaded": 92.69999999552965, - "loadComplete": 471.69999999552965, - "totalRequests": 121, - "totalBytes": 4613030, - "jsBytes": 4547395, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 103, - "cssRequests": 0, - "imageRequests": 15, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "max": { - "fcp": 108, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 12.099999994039536, - "domContentLoaded": 110, - "loadComplete": 537.6000000014901, - "totalRequests": 121, - "totalBytes": 4613030, - "jsBytes": 4547395, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 103, - "cssRequests": 0, - "imageRequests": 15, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - } - }, - { - "page": "Resume", - "url": "http://localhost:3000/resume", - "runs": [ - { - "fcp": 84, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.9000000059604645, - "domContentLoaded": 90.19999999552965, - "loadComplete": 462.3999999985099, - "totalRequests": 99, - "totalBytes": 4475494, - "jsBytes": 4409859, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 84, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.700000002980232, - "domContentLoaded": 89.5, - "loadComplete": 632.6999999955297, - "totalRequests": 99, - "totalBytes": 4475494, - "jsBytes": 4409859, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 84, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.300000004470348, - "domContentLoaded": 97.29999999701977, - "loadComplete": 453.79999999701977, - "totalRequests": 99, - "totalBytes": 4475494, - "jsBytes": 4409859, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 84, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.299999997019768, - "domContentLoaded": 92.20000000298023, - "loadComplete": 491.3999999985099, - "totalRequests": 99, - "totalBytes": 4475494, - "jsBytes": 4409859, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 84, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.100000001490116, - "domContentLoaded": 90.70000000298023, - "loadComplete": 429, - "totalRequests": 99, - "totalBytes": 4475494, - "jsBytes": 4409859, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - } - ], - "average": { - "fcp": 84, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.460000002384186, - "domContentLoaded": 91.97999999970197, - "loadComplete": 493.85999999791386, - "totalRequests": 99, - "totalBytes": 4475494, - "jsBytes": 4409859, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "median": { - "fcp": 84, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.300000004470348, - "domContentLoaded": 97.29999999701977, - "loadComplete": 453.79999999701977, - "totalRequests": 99, - "totalBytes": 4475494, - "jsBytes": 4409859, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "p95": { - "fcp": 84, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.100000001490116, - "domContentLoaded": 90.70000000298023, - "loadComplete": 429, - "totalRequests": 99, - "totalBytes": 4475494, - "jsBytes": 4409859, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "min": { - "fcp": 84, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.100000001490116, - "domContentLoaded": 89.5, - "loadComplete": 429, - "totalRequests": 99, - "totalBytes": 4475494, - "jsBytes": 4409859, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "max": { - "fcp": 84, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 7.9000000059604645, - "domContentLoaded": 97.29999999701977, - "loadComplete": 632.6999999955297, - "totalRequests": 99, - "totalBytes": 4475494, - "jsBytes": 4409859, - "cssBytes": 0, - "imageBytes": 0, - "fontBytes": 0, - "jsRequests": 91, - "cssRequests": 0, - "imageRequests": 5, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - } - }, - { - "page": "Contact", - "url": "http://localhost:3000/contact", - "runs": [ - { - "fcp": 120, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.200000002980232, - "domContentLoaded": 100.89999999850988, - "loadComplete": 469.6000000014901, - "totalRequests": 104, - "totalBytes": 5210481, - "jsBytes": 4483801, - "cssBytes": 0, - "imageBytes": 660146, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 6, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 120, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.600000001490116, - "domContentLoaded": 93.60000000149012, - "loadComplete": 483.6000000014901, - "totalRequests": 104, - "totalBytes": 5210481, - "jsBytes": 4483801, - "cssBytes": 0, - "imageBytes": 660146, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 6, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 120, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.700000002980232, - "domContentLoaded": 94.79999999701977, - "loadComplete": 470, - "totalRequests": 104, - "totalBytes": 5210481, - "jsBytes": 4483801, - "cssBytes": 0, - "imageBytes": 660146, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 6, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 120, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8, - "domContentLoaded": 94.80000000447035, - "loadComplete": 505.30000000447035, - "totalRequests": 104, - "totalBytes": 5210481, - "jsBytes": 4483801, - "cssBytes": 0, - "imageBytes": 660146, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 6, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - { - "fcp": 116, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.299999997019768, - "domContentLoaded": 92.89999999850988, - "loadComplete": 462.1000000014901, - "totalRequests": 104, - "totalBytes": 5210481, - "jsBytes": 4483801, - "cssBytes": 0, - "imageBytes": 660146, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 6, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - } - ], - "average": { - "fcp": 119.2, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.36000000089407, - "domContentLoaded": 95.4, - "loadComplete": 478.1200000017881, - "totalRequests": 104, - "totalBytes": 5210481, - "jsBytes": 4483801, - "cssBytes": 0, - "imageBytes": 660146, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 6, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "median": { - "fcp": 120, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.700000002980232, - "domContentLoaded": 94.79999999701977, - "loadComplete": 470, - "totalRequests": 104, - "totalBytes": 5210481, - "jsBytes": 4483801, - "cssBytes": 0, - "imageBytes": 660146, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 6, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "p95": { - "fcp": 116, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.299999997019768, - "domContentLoaded": 92.89999999850988, - "loadComplete": 462.1000000014901, - "totalRequests": 104, - "totalBytes": 5210481, - "jsBytes": 4483801, - "cssBytes": 0, - "imageBytes": 660146, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 6, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "min": { - "fcp": 116, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8, - "domContentLoaded": 92.89999999850988, - "loadComplete": 462.1000000014901, - "totalRequests": 104, - "totalBytes": 5210481, - "jsBytes": 4483801, - "cssBytes": 0, - "imageBytes": 660146, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 6, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - }, - "max": { - "fcp": 120, - "lcp": 0, - "cls": 0, - "fid": 0, - "ttfb": 8.700000002980232, - "domContentLoaded": 100.89999999850988, - "loadComplete": 505.30000000447035, - "totalRequests": 104, - "totalBytes": 5210481, - "jsBytes": 4483801, - "cssBytes": 0, - "imageBytes": 660146, - "fontBytes": 0, - "jsRequests": 95, - "cssRequests": 0, - "imageRequests": 6, - "jsExecutionTime": 0, - "taskDuration": 0, - "layoutDuration": 0, - "paintDuration": 0 - } - } - ] -} \ No newline at end of file diff --git a/scripts/perf-test.ts b/scripts/perf-test.ts index b37c487..5846c22 100644 --- a/scripts/perf-test.ts +++ b/scripts/perf-test.ts @@ -64,7 +64,13 @@ const TEST_PAGES: PageTestConfig[] = [ { name: "Home", path: "/" }, { name: "About", path: "/about" }, { name: "Blog Index", path: "/blog" }, - { name: "Blog Post", path: "/blog/A_Journey_in_Self_Hosting" }, + { name: "Blog Post (basic)", path: "/blog/I_made_a_macOS_app_in_a_day" }, + { + name: "Blog Post with multiple images", + path: "/blog/Shapes_With_Abigail!" + }, + { name: "Blog Post with large banner", path: "/blog/My_MacOS_rice." }, + { name: "Blog Post with Mermaid", path: "/blog/A_Journey_in_Self_Hosting" }, { name: "Resume", path: "/resume" }, { name: "Contact", path: "/contact" } ]; @@ -77,11 +83,102 @@ if (process.env.TEST_BLOG_POST) { }); } +async function setupPerformanceObservers(page: Page) { + await page.addInitScript(() => { + (window as any).__perfMetrics = { + lcp: 0, + cls: 0, + fid: 0, + largestContentfulPaint: 0, + cumulativeLayoutShift: 0, + firstInputDelay: 0, + layoutShifts: [] as number[], + longTasks: [] as number[] + }; + + // Observe LCP + if ("PerformanceObserver" in window) { + try { + const lcpObserver = new PerformanceObserver((entryList) => { + const entries = entryList.getEntries(); + const lastEntry = entries[entries.length - 1] as any; + (window as any).__perfMetrics.lcp = + lastEntry.renderTime || lastEntry.loadTime; + (window as any).__perfMetrics.largestContentfulPaint = + lastEntry.renderTime || lastEntry.loadTime; + }); + lcpObserver.observe({ + type: "largest-contentful-paint", + buffered: true + }); + } catch (e) { + // LCP not supported + } + + // Observe CLS + try { + const clsObserver = new PerformanceObserver((entryList) => { + for (const entry of entryList.getEntries()) { + const layoutShift = entry as any; + if (!layoutShift.hadRecentInput) { + (window as any).__perfMetrics.cls += layoutShift.value; + (window as any).__perfMetrics.cumulativeLayoutShift += + layoutShift.value; + (window as any).__perfMetrics.layoutShifts.push( + layoutShift.value + ); + } + } + }); + clsObserver.observe({ type: "layout-shift", buffered: true }); + } catch (e) { + // CLS not supported + } + + // Observe FID (first input) + try { + const fidObserver = new PerformanceObserver((entryList) => { + const firstInput = entryList.getEntries()[0] as any; + if (firstInput) { + (window as any).__perfMetrics.fid = + firstInput.processingStart - firstInput.startTime; + (window as any).__perfMetrics.firstInputDelay = + firstInput.processingStart - firstInput.startTime; + } + }); + fidObserver.observe({ type: "first-input", buffered: true }); + } catch (e) { + // FID not supported + } + + // Observe long tasks + try { + const longTaskObserver = new PerformanceObserver((entryList) => { + for (const entry of entryList.getEntries()) { + (window as any).__perfMetrics.longTasks.push(entry.duration); + } + }); + longTaskObserver.observe({ type: "longtask", buffered: true }); + } catch (e) { + // Long tasks not supported + } + } + }); +} + async function collectPerformanceMetrics( page: Page ): Promise { - // Wait for page to be fully loaded - await page.waitForLoadState("networkidle"); + // Wait for page to be loaded + await page.waitForLoadState("load"); + + // Wait a bit longer for LCP to settle (it can change as content loads) + await page.waitForTimeout(1000); + + // Additional wait for any remaining network activity + await page.waitForLoadState("networkidle", { timeout: 5000 }).catch(() => { + // Ignore timeout - networkidle may never happen for some pages + }); // Collect comprehensive performance metrics const metrics = await page.evaluate(() => { @@ -91,28 +188,38 @@ async function collectPerformanceMetrics( const paint = performance.getEntriesByType("paint"); const fcp = paint.find((entry) => entry.name === "first-contentful-paint"); - // Get LCP using PerformanceObserver - let lcp = 0; - let cls = 0; - let fid = 0; + // Get metrics from our observers + const observedMetrics = (window as any).__perfMetrics || { + lcp: 0, + cls: 0, + fid: 0, + longTasks: [] + }; - // Try to get LCP from existing entries - const lcpEntries = performance.getEntriesByType( - "largest-contentful-paint" - ) as any[]; - if (lcpEntries.length > 0) { - lcp = - lcpEntries[lcpEntries.length - 1].renderTime || - lcpEntries[lcpEntries.length - 1].loadTime; + // Fallback to direct API if observers didn't capture anything + let lcp = observedMetrics.lcp; + let cls = observedMetrics.cls; + let fid = observedMetrics.fid; + + if (lcp === 0) { + const lcpEntries = performance.getEntriesByType( + "largest-contentful-paint" + ) as any[]; + if (lcpEntries.length > 0) { + lcp = + lcpEntries[lcpEntries.length - 1].renderTime || + lcpEntries[lcpEntries.length - 1].loadTime; + } } - // Get layout shift entries - const layoutShiftEntries = performance.getEntriesByType( - "layout-shift" - ) as any[]; - cls = layoutShiftEntries - .filter((entry: any) => !entry.hadRecentInput) - .reduce((sum: number, entry: any) => sum + entry.value, 0); + if (cls === 0) { + const layoutShiftEntries = performance.getEntriesByType( + "layout-shift" + ) as any[]; + cls = layoutShiftEntries + .filter((entry: any) => !entry.hadRecentInput) + .reduce((sum: number, entry: any) => sum + entry.value, 0); + } // Get resource timing const resources = performance.getEntriesByType( @@ -157,23 +264,45 @@ async function collectPerformanceMetrics( } }); - // Get performance measure entries for JS execution - const measures = performance.getEntriesByType("measure"); - let jsExecutionTime = 0; + // Calculate long task duration let taskDuration = 0; + if (observedMetrics.longTasks && observedMetrics.longTasks.length > 0) { + taskDuration = observedMetrics.longTasks.reduce( + (sum: number, duration: number) => sum + duration, + 0 + ); + } + + // Get more granular performance entries + let jsExecutionTime = 0; let layoutDuration = 0; let paintDuration = 0; + const measures = performance.getEntriesByType("measure"); measures.forEach((entry) => { if (entry.name.includes("script") || entry.name.includes("js")) { jsExecutionTime += entry.duration; } }); - // Try to get long task entries - const longTasks = performance.getEntriesByType("longtask") as any[]; - longTasks.forEach((task: any) => { - taskDuration += task.duration; + // Check for script evaluation entries + const entries = performance.getEntries(); + entries.forEach((entry: any) => { + if (entry.entryType === "measure") { + if ( + entry.name.toLowerCase().includes("script") || + entry.name.toLowerCase().includes("js") + ) { + jsExecutionTime += entry.duration; + } else if (entry.name.toLowerCase().includes("layout")) { + layoutDuration += entry.duration; + } else if ( + entry.name.toLowerCase().includes("paint") || + entry.name.toLowerCase().includes("render") + ) { + paintDuration += entry.duration; + } + } }); return { @@ -219,7 +348,8 @@ async function testPagePerformance( for (let i = 0; i < WARMUP_RUNS; i++) { const context = await browser.newContext(); const page = await context.newPage(); - await page.goto(url, { waitUntil: "networkidle" }); + await setupPerformanceObservers(page); + await page.goto(url, { waitUntil: "load" }); await page.close(); await context.close(); console.log(` ✓ Warmup run ${i + 1}/${WARMUP_RUNS}`); @@ -235,8 +365,11 @@ async function testPagePerformance( }); const page = await context.newPage(); + // Setup performance observers before navigation + await setupPerformanceObservers(page); + // Navigate and collect metrics - await page.goto(url, { waitUntil: "networkidle" }); + await page.goto(url, { waitUntil: "load" }); const metrics = await collectPerformanceMetrics(page); await page.close();