[{"data":1,"prerenderedAt":997},["ShallowReactive",2],{"content:\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fbest-lighthouse-ci-setup-for-frontend-pipelines":3,"surroundings:\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fbest-lighthouse-ci-setup-for-frontend-pipelines":989},{"id":4,"title":5,"body":6,"description":981,"extension":982,"meta":983,"navigation":984,"path":985,"seo":986,"stem":987,"__hash__":988},"content\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fbest-lighthouse-ci-setup-for-frontend-pipelines\u002Findex.md","Best Lighthouse CI setup for frontend pipelines",{"type":7,"value":8,"toc":971},"minimark",[9,13,22,27,30,57,78,82,85,109,120,127,152,156,178,181,214,238,501,505,512,535,542,673,677,680,722,762,770,806,810,816,834,858,862,894,898,917,930,949,967],[10,11,5],"h1",{"id":12},"best-lighthouse-ci-setup-for-frontend-pipelines",[14,15,16,17,21],"p",{},"Frontend pipelines frequently suffer from silent performance regressions when Lighthouse CI is treated as a passive reporting tool. This guide targets a single, high-impact workflow: configuring Lighthouse CI with strict metric thresholds, deterministic environment controls, and automated assertion logic. We will bypass theoretical overviews and focus on exact ",[18,19,20],"code",{},"lighthouserc.json"," configurations. You will learn CI\u002FCD integration patterns and rapid diagnostic steps for resolving flaky runs.",[23,24,26],"h2",{"id":25},"root-cause-analysis-why-default-lighthouse-ci-fails-in-cicd","Root Cause Analysis: Why Default Lighthouse CI Fails in CI\u002FCD",[14,28,29],{},"Default Lighthouse configurations assume stable hardware and consistent network conditions. CI runners violate both assumptions. Three primary failure modes dominate pipeline execution:",[31,32,33,41,51],"ul",{},[34,35,36,40],"li",{},[37,38,39],"strong",{},"Single-run variance:"," One execution cannot account for background OS tasks or garbage collection spikes.",[34,42,43,46,47,50],{},[37,44,45],{},"DevTools throttling mismatch:"," ",[18,48,49],{},"throttlingMethod: 'devtools'"," relies on the host machine's CPU, causing inconsistent throttling across ephemeral runners.",[34,52,53,56],{},[37,54,55],{},"Missing assertion budgets:"," Without explicit thresholds, Lighthouse defaults to composite scoring, which masks incremental regressions.",[14,58,59,60,63,64,67,68,71,72,77],{},"Stabilize traces by enforcing ",[18,61,62],{},"numberOfRuns: 3"," and explicitly setting ",[18,65,66],{},"preset: 'desktop'"," or ",[18,69,70],{},"preset: 'mobile'",". Default scoring curves often misrepresent real-world bottlenecks. Align your CI gates with established ",[73,74,76],"a",{"href":75},"\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002F","Understanding Core Web Vitals Thresholds"," rather than chasing arbitrary 100\u002F100 targets.",[23,79,81],{"id":80},"step-1-deterministic-environment-configuration","Step 1: Deterministic Environment Configuration",[14,83,84],{},"CI environments require explicit resource allocation to prevent host starvation. Configure your runner with a minimum of 2 vCPUs and 4GB RAM. Headless Chrome flags are mandatory for stable execution:",[31,86,87,93,99],{},[34,88,89,92],{},[18,90,91],{},"--no-sandbox",": Required for root Docker containers.",[34,94,95,98],{},[18,96,97],{},"--disable-gpu",": Prevents software rasterizer conflicts in headless mode.",[34,100,101,104,105,108],{},[18,102,103],{},"--disable-dev-shm-usage",": Avoids ",[18,106,107],{},"\u002Fdev\u002Fshm"," crashes in constrained containers.",[14,110,111,112,115,116,119],{},"Network simulation must be forced via ",[18,113,114],{},"throttlingMethod: 'simulate'"," in the config. This bypasses live network variance. For authenticated routes, inject state via ",[18,117,118],{},"--chrome-flags"," or a pre-warmed server command. Never hardcode tokens. Use CI environment variables to pass session cookies directly to the browser context.",[14,121,122,123,126],{},"Configure the ",[18,124,125],{},"ci.collect"," block to match your build artifact type:",[31,128,129,139],{},[34,130,131,134,135,138],{},[37,132,133],{},"Static sites:"," Use ",[18,136,137],{},"staticDistDir"," to point to the build output.",[34,140,141,134,144,147,148,151],{},[37,142,143],{},"Dynamic\u002FSSR:",[18,145,146],{},"startServerCommand"," to spin up a local preview, then target ",[18,149,150],{},"http:\u002F\u002Flocalhost:PORT",".",[23,153,155],{"id":154},"step-2-defining-exact-metric-thresholds-budgets","Step 2: Defining Exact Metric Thresholds & Budgets",[14,157,158,159,161,162,165,166,169,170,173,174,177],{},"Assertions act as pipeline gates. Budgets catch asset bloat before it impacts metrics. Configure both in ",[18,160,20],{},". Use ",[18,163,164],{},"maxNumericValue"," for millisecond\u002Fnumeric metrics and ",[18,167,168],{},"minScore"," for composite categories. Set severity to ",[18,171,172],{},"error"," for hard blocks and ",[18,175,176],{},"warn"," for advisory logging.",[14,179,180],{},"Apply these exact numeric thresholds:",[31,182,183,191,199,207],{},[34,184,185,46,188],{},[37,186,187],{},"LCP:",[18,189,190],{},"\u003C 2500ms",[34,192,193,46,196],{},[37,194,195],{},"CLS:",[18,197,198],{},"\u003C 0.1",[34,200,201,46,204],{},[37,202,203],{},"INP:",[18,205,206],{},"\u003C 200ms",[34,208,209,46,212],{},[37,210,211],{},"TBT:",[18,213,206],{},[14,215,216,217,220,221,224,225,228,229,232,233,237],{},"Enforce payload limits to prevent cumulative degradation. Set ",[18,218,219],{},"maxBytes"," for ",[18,222,223],{},"script",", ",[18,226,227],{},"image",", and ",[18,230,231],{},"document"," resources. Align these CI gates with your real-user monitoring strategy. When CI assertions mirror production ",[73,234,236],{"href":235},"\u002Fcore-web-vitals-measurement\u002F","Core Web Vitals & Measurement"," baselines, you eliminate the gap between lab and field data.",[239,240,245],"pre",{"className":241,"code":242,"language":243,"meta":244,"style":244},"language-json shiki shiki-themes github-dark-high-contrast github-dark-high-contrast github-light-high-contrast","{\n \"ci\": {\n \"collect\": {\n \"numberOfRuns\": 3,\n \"settings\": {\n \"preset\": \"desktop\",\n \"throttlingMethod\": \"simulate\"\n },\n \"url\": [\"https:\u002F\u002Fpreview.example.com\"]\n },\n \"assert\": {\n \"assertions\": {\n \"categories:performance\": [\"error\", {\"minScore\": 0.9}],\n \"interactive\": [\"error\", {\"maxNumericValue\": 3800}],\n \"largest-contentful-paint\": [\"error\", {\"maxNumericValue\": 2500}],\n \"cumulative-layout-shift\": [\"error\", {\"maxNumericValue\": 0.1}]\n }\n },\n \"upload\": {\n \"target\": \"temporary-public-storage\"\n }\n }\n}\n","json","",[18,246,247,256,266,274,290,298,312,323,329,344,349,357,365,390,412,433,455,461,466,474,485,490,495],{"__ignoreMap":244},[248,249,252],"span",{"class":250,"line":251},"line",1,[248,253,255],{"class":254},"s3sCt","{\n",[248,257,259,263],{"class":250,"line":258},2,[248,260,262],{"class":261},"sj_b3"," \"ci\"",[248,264,265],{"class":254},": {\n",[248,267,269,272],{"class":250,"line":268},3,[248,270,271],{"class":261}," \"collect\"",[248,273,265],{"class":254},[248,275,277,280,283,287],{"class":250,"line":276},4,[248,278,279],{"class":261}," \"numberOfRuns\"",[248,281,282],{"class":254},": ",[248,284,286],{"class":285},"s5hCx","3",[248,288,289],{"class":254},",\n",[248,291,293,296],{"class":250,"line":292},5,[248,294,295],{"class":261}," \"settings\"",[248,297,265],{"class":254},[248,299,301,304,306,310],{"class":250,"line":300},6,[248,302,303],{"class":261}," \"preset\"",[248,305,282],{"class":254},[248,307,309],{"class":308},"sJdzJ","\"desktop\"",[248,311,289],{"class":254},[248,313,315,318,320],{"class":250,"line":314},7,[248,316,317],{"class":261}," \"throttlingMethod\"",[248,319,282],{"class":254},[248,321,322],{"class":308},"\"simulate\"\n",[248,324,326],{"class":250,"line":325},8,[248,327,328],{"class":254}," },\n",[248,330,332,335,338,341],{"class":250,"line":331},9,[248,333,334],{"class":261}," \"url\"",[248,336,337],{"class":254},": [",[248,339,340],{"class":308},"\"https:\u002F\u002Fpreview.example.com\"",[248,342,343],{"class":254},"]\n",[248,345,347],{"class":250,"line":346},10,[248,348,328],{"class":254},[248,350,352,355],{"class":250,"line":351},11,[248,353,354],{"class":261}," \"assert\"",[248,356,265],{"class":254},[248,358,360,363],{"class":250,"line":359},12,[248,361,362],{"class":261}," \"assertions\"",[248,364,265],{"class":254},[248,366,368,371,373,376,379,382,384,387],{"class":250,"line":367},13,[248,369,370],{"class":261}," \"categories:performance\"",[248,372,337],{"class":254},[248,374,375],{"class":308},"\"error\"",[248,377,378],{"class":254},", {",[248,380,381],{"class":261},"\"minScore\"",[248,383,282],{"class":254},[248,385,386],{"class":285},"0.9",[248,388,389],{"class":254},"}],\n",[248,391,393,396,398,400,402,405,407,410],{"class":250,"line":392},14,[248,394,395],{"class":261}," \"interactive\"",[248,397,337],{"class":254},[248,399,375],{"class":308},[248,401,378],{"class":254},[248,403,404],{"class":261},"\"maxNumericValue\"",[248,406,282],{"class":254},[248,408,409],{"class":285},"3800",[248,411,389],{"class":254},[248,413,415,418,420,422,424,426,428,431],{"class":250,"line":414},15,[248,416,417],{"class":261}," \"largest-contentful-paint\"",[248,419,337],{"class":254},[248,421,375],{"class":308},[248,423,378],{"class":254},[248,425,404],{"class":261},[248,427,282],{"class":254},[248,429,430],{"class":285},"2500",[248,432,389],{"class":254},[248,434,436,439,441,443,445,447,449,452],{"class":250,"line":435},16,[248,437,438],{"class":261}," \"cumulative-layout-shift\"",[248,440,337],{"class":254},[248,442,375],{"class":308},[248,444,378],{"class":254},[248,446,404],{"class":261},[248,448,282],{"class":254},[248,450,451],{"class":285},"0.1",[248,453,454],{"class":254},"}]\n",[248,456,458],{"class":250,"line":457},17,[248,459,460],{"class":254}," }\n",[248,462,464],{"class":250,"line":463},18,[248,465,328],{"class":254},[248,467,469,472],{"class":250,"line":468},19,[248,470,471],{"class":261}," \"upload\"",[248,473,265],{"class":254},[248,475,477,480,482],{"class":250,"line":476},20,[248,478,479],{"class":261}," \"target\"",[248,481,282],{"class":254},[248,483,484],{"class":308},"\"temporary-public-storage\"\n",[248,486,488],{"class":250,"line":487},21,[248,489,460],{"class":254},[248,491,493],{"class":250,"line":492},22,[248,494,460],{"class":254},[248,496,498],{"class":250,"line":497},23,[248,499,500],{"class":254},"}\n",[23,502,504],{"id":503},"step-3-ci-pipeline-integration-assertion-workflows","Step 3: CI Pipeline Integration & Assertion Workflows",[14,506,507,508,511],{},"Pipeline integration requires deterministic execution order and explicit exit code handling. The ",[18,509,510],{},"@lhci\u002Fcli"," package provides three core commands:",[31,513,514,520,529],{},[34,515,516,519],{},[18,517,518],{},"lhci autorun",": Collects, uploads, and asserts in a single pass.",[34,521,522,525,526,528],{},[18,523,524],{},"lhci assert",": Evaluates the ",[18,527,20],{}," rules against the latest run. Exits with code 1 on failure.",[34,530,531,534],{},[18,532,533],{},"lhci upload",": Pushes results to a dashboard for historical tracking.",[14,536,537,538,541],{},"Configure your CI YAML to run assertions immediately after the build step. Map the exit code to a GitHub Actions status check or GitLab pipeline stage. Use ",[18,539,540],{},"--target=latest"," to compare against the main branch baseline rather than absolute thresholds alone. Enable PR comment generation to surface exact metric deltas. This shifts debugging left, allowing authors to fix regressions before merge.",[239,543,547],{"className":544,"code":545,"language":546,"meta":244,"style":244},"language-yaml shiki shiki-themes github-dark-high-contrast github-dark-high-contrast github-light-high-contrast","name: Lighthouse CI\non: [pull_request]\njobs:\n lighthouse:\n runs-on: ubuntu-latest\n steps:\n - uses: actions\u002Fcheckout@v4\n - name: Build & Serve\n run: npm run build && npx serve -s build -l 3000 &\n - name: Run Lighthouse CI\n run: |\n npm install -g @lhci\u002Fcli\n lhci autorun --config=.\u002Flighthouserc.json\n lhci assert\n","yaml",[18,548,549,559,571,579,586,596,603,616,627,637,648,658,663,668],{"__ignoreMap":244},[248,550,551,554,556],{"class":250,"line":251},[248,552,553],{"class":261},"name",[248,555,282],{"class":254},[248,557,558],{"class":308},"Lighthouse CI\n",[248,560,561,564,566,569],{"class":250,"line":258},[248,562,563],{"class":285},"on",[248,565,337],{"class":254},[248,567,568],{"class":308},"pull_request",[248,570,343],{"class":254},[248,572,573,576],{"class":250,"line":268},[248,574,575],{"class":261},"jobs",[248,577,578],{"class":254},":\n",[248,580,581,584],{"class":250,"line":276},[248,582,583],{"class":261}," lighthouse",[248,585,578],{"class":254},[248,587,588,591,593],{"class":250,"line":292},[248,589,590],{"class":261}," runs-on",[248,592,282],{"class":254},[248,594,595],{"class":308},"ubuntu-latest\n",[248,597,598,601],{"class":250,"line":300},[248,599,600],{"class":261}," steps",[248,602,578],{"class":254},[248,604,605,608,611,613],{"class":250,"line":314},[248,606,607],{"class":254}," - ",[248,609,610],{"class":261},"uses",[248,612,282],{"class":254},[248,614,615],{"class":308},"actions\u002Fcheckout@v4\n",[248,617,618,620,622,624],{"class":250,"line":325},[248,619,607],{"class":254},[248,621,553],{"class":261},[248,623,282],{"class":254},[248,625,626],{"class":308},"Build & Serve\n",[248,628,629,632,634],{"class":250,"line":331},[248,630,631],{"class":261}," run",[248,633,282],{"class":254},[248,635,636],{"class":308},"npm run build && npx serve -s build -l 3000 &\n",[248,638,639,641,643,645],{"class":250,"line":346},[248,640,607],{"class":254},[248,642,553],{"class":261},[248,644,282],{"class":254},[248,646,647],{"class":308},"Run Lighthouse CI\n",[248,649,650,652,654],{"class":250,"line":351},[248,651,631],{"class":261},[248,653,282],{"class":254},[248,655,657],{"class":656},"sCJTb","|\n",[248,659,660],{"class":250,"line":359},[248,661,662],{"class":308}," npm install -g @lhci\u002Fcli\n",[248,664,665],{"class":250,"line":367},[248,666,667],{"class":308}," lhci autorun --config=.\u002Flighthouserc.json\n",[248,669,670],{"class":250,"line":392},[248,671,672],{"class":308}," lhci assert\n",[23,674,676],{"id":675},"step-4-debugging-false-positives-flaky-runs","Step 4: Debugging False Positives & Flaky Runs",[14,678,679],{},"Flaky runs stem from environmental noise or unoptimized rendering paths. Follow this diagnostic workflow:",[681,682,683,700,717],"ol",{},[34,684,685,688,689,692,693,696,697,151],{},[37,686,687],{},"Capture CI artifacts:"," Run ",[18,690,691],{},"lhci autorun --collect.settings.outputTrace"," to generate ",[18,694,695],{},".trace.json"," and ",[18,698,699],{},".devtoolslog.json",[34,701,702,705,706,709,710,696,713,716],{},[37,703,704],{},"Analyze in DevTools:"," Open ",[18,707,708],{},"chrome:\u002F\u002Finspect"," and load the trace into the Performance panel. Filter by ",[18,711,712],{},"Layout",[18,714,715],{},"Scripting"," to isolate main-thread blocks.",[34,718,719],{},[37,720,721],{},"Identify variance sources:",[31,723,724,736,753],{},[34,725,726,729,730,732,733,151],{},[37,727,728],{},"Layout thrashing:"," Look for rapid ",[18,731,712],{}," events during hydration. Defer non-critical CSS or use ",[18,734,735],{},"content-visibility",[34,737,738,741,742,745,746,749,750,151],{},[37,739,740],{},"Third-party interference:"," Check for long tasks originating from external domains. Use ",[18,743,744],{},"rel=\"preconnect\""," or load scripts with ",[18,747,748],{},"async","\u002F",[18,751,752],{},"defer",[34,754,755,758,759,151],{},[37,756,757],{},"Node.js OOM:"," If the runner crashes silently, increase memory allocation via ",[18,760,761],{},"NODE_OPTIONS=\"--max-old-space-size=4096\"",[681,763,764],{"start":276},[34,765,766,769],{},[37,767,768],{},"Validate locally:"," Reproduce the exact CI environment using the headless command below.",[239,771,775],{"className":772,"code":773,"language":774,"meta":244,"style":244},"language-bash shiki shiki-themes github-dark-high-contrast github-dark-high-contrast github-light-high-contrast","npx lighthouse http:\u002F\u002Flocalhost:3000 --preset=desktop --throttling-method=simulate --output=json --output-path=.\u002Fci-trace.json --chrome-flags='--headless'\n","bash",[18,776,777],{"__ignoreMap":244},[248,778,779,783,785,788,791,794,797,800,803],{"class":250,"line":251},[248,780,782],{"class":781},"spFnL","npx",[248,784,583],{"class":308},[248,786,787],{"class":308}," http:\u002F\u002Flocalhost:3000",[248,789,790],{"class":285}," --preset=desktop",[248,792,793],{"class":285}," --throttling-method=simulate",[248,795,796],{"class":285}," --output=json",[248,798,799],{"class":285}," --output-path=.\u002Fci-trace.json",[248,801,802],{"class":285}," --chrome-flags=",[248,804,805],{"class":308},"'--headless'\n",[23,807,809],{"id":808},"step-5-maintenance-scaling-for-monorepos","Step 5: Maintenance & Scaling for Monorepos",[14,811,812,813,815],{},"Monorepos require scalable testing strategies. Avoid hardcoding URLs in ",[18,814,20],{},". Inject dynamic preview URLs via CI environment variables at runtime. Implement route-based gating:",[31,817,818,826],{},[34,819,820,46,823,825],{},[37,821,822],{},"Critical paths (homepage, checkout):",[18,824,172],{}," severity, strict budgets.",[34,827,828,46,831,833],{},[37,829,830],{},"Secondary routes:",[18,832,176],{}," severity, relaxed thresholds.",[14,835,836,837,696,839,841,842,845,846,848,849,851,852,854,855,857],{},"Cache the ",[18,838,20],{},[18,840,510],{}," binary across workflows to reduce pipeline overhead. Configure Slack or Teams webhooks using the ",[18,843,844],{},"--upload.serverBaseUrl"," to trigger alerts only when ",[18,847,172],{}," assertions fail. Tighten budgets incrementally. Start new thresholds at ",[18,850,176],{},", monitor trend lines for two sprints, then promote to ",[18,853,172],{},". Reduce ",[18,856,164],{}," by 5–10% per release cycle to enforce continuous optimization without breaking builds.",[23,859,861],{"id":860},"common-mistakes","Common Mistakes",[31,863,864,871,877,884,891],{},[34,865,866,867,870],{},"Relying on ",[18,868,869],{},"numberOfRuns: 1",", which guarantees metric variance and false PR failures.",[34,872,873,874,876],{},"Using ",[18,875,49],{}," in CI, which causes inconsistent CPU throttling across runners.",[34,878,879,880,883],{},"Setting ",[18,881,882],{},"minScore: 1.0"," for performance, which is mathematically impossible due to third-party script variance.",[34,885,886,887,890],{},"Failing to configure ",[18,888,889],{},"--preset"," or environment flags, causing Lighthouse to default to mobile throttling on desktop CI agents.",[34,892,893],{},"Ignoring budgets configuration, allowing bundle bloat to pass even if CWV thresholds are met.",[23,895,897],{"id":896},"faq","FAQ",[14,899,900,903,904,906,907,67,910,913,914,916],{},[37,901,902],{},"How do I prevent Lighthouse CI from failing on legitimate third-party script updates?","\nUse assertions with ",[18,905,164],{}," for specific metrics instead of relying solely on the overall performance score. Implement budgets to isolate third-party impact, and use ",[18,908,909],{},"--ignore-skip",[18,911,912],{},"--skip"," flags in ",[18,915,20],{}," to exclude non-critical routes from strict gating.",[14,918,919,922,923,925,926,929],{},[37,920,921],{},"Why does Lighthouse CI report different scores than Chrome DevTools on my local machine?","\nDevTools uses live network\u002FCPU conditions, while CI uses simulated throttling (",[18,924,114],{},"). Align them by running ",[18,927,928],{},"npx lighthouse --preset=desktop --throttling-method=simulate"," locally. Ensure your CI runner has at least 2 vCPUs and 4GB RAM to prevent host-level CPU starvation.",[14,931,932,935,936,938,939,942,943,945,946,151],{},[37,933,934],{},"Can I run Lighthouse CI against authenticated routes without exposing credentials?","\nYes. Use ",[18,937,118],{}," to inject cookies or local storage before navigation, or configure ",[18,940,941],{},"ci.collect.startServerCommand"," to run a mock auth proxy. Never hardcode tokens in ",[18,944,20],{},"; use CI environment variables and pass them via ",[18,947,948],{},"--chrome-flags='--cookie=\"session=...\"'",[14,950,951,954,955,957,958,960,961,963,964,966],{},[37,952,953],{},"How do I gradually tighten performance budgets without breaking the pipeline?","\nStart with ",[18,956,176],{}," severity for new thresholds and run them for 2-3 sprints. Monitor the ",[18,959,533],{}," dashboard for trend lines. Once metrics stabilize, switch to ",[18,962,172],{}," and lower the ",[18,965,164],{}," by 5-10% increments per release cycle.",[968,969,970],"style",{},"html pre.shiki code .s3sCt, html code.shiki .s3sCt{--shiki-default:#F0F3F6;--shiki-dark:#F0F3F6;--shiki-light:#0E1116}html pre.shiki code .sj_b3, html code.shiki .sj_b3{--shiki-default:#72F088;--shiki-dark:#72F088;--shiki-light:#024C1A}html pre.shiki code .s5hCx, html code.shiki .s5hCx{--shiki-default:#91CBFF;--shiki-dark:#91CBFF;--shiki-light:#023B95}html pre.shiki code .sJdzJ, html code.shiki .sJdzJ{--shiki-default:#ADDCFF;--shiki-dark:#ADDCFF;--shiki-light:#032563}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sCJTb, html code.shiki .sCJTb{--shiki-default:#FF9492;--shiki-dark:#FF9492;--shiki-light:#A0111F}html pre.shiki code .spFnL, html code.shiki .spFnL{--shiki-default:#FFB757;--shiki-dark:#FFB757;--shiki-light:#702C00}",{"title":244,"searchDepth":258,"depth":258,"links":972},[973,974,975,976,977,978,979,980],{"id":25,"depth":258,"text":26},{"id":80,"depth":258,"text":81},{"id":154,"depth":258,"text":155},{"id":503,"depth":258,"text":504},{"id":675,"depth":258,"text":676},{"id":808,"depth":258,"text":809},{"id":860,"depth":258,"text":861},{"id":896,"depth":258,"text":897},"Frontend pipelines frequently suffer from silent performance regressions when Lighthouse CI is treated as a passive reporting tool. This guide targets a single, high-impact workflow: configuring Lighthouse CI with strict metric thresholds, deterministic environment controls, and automated assertion logic. We will bypass theoretical overviews and focus on exact lighthouserc.json configurations. You will learn CI\u002FCD integration patterns and rapid diagnostic steps for resolving flaky runs.","md",{},true,"\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fbest-lighthouse-ci-setup-for-frontend-pipelines",{"title":5,"description":981},"core-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fbest-lighthouse-ci-setup-for-frontend-pipelines\u002Findex","-TkmbXKWjaCbyioHaG8KdVQtv588iceGplgro-2sijU",[990,993],{"title":76,"path":991,"stem":992,"children":-1},"\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds","core-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Findex",{"title":994,"path":995,"stem":996,"children":-1},"JavaScript Bundle Optimization & Code Splitting","\u002Fjavascript-bundle-optimization-code-splitting","javascript-bundle-optimization-code-splitting\u002Findex",1777925998198]