[{"data":1,"prerenderedAt":2100},["ShallowReactive",2],{"page:\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads":3,"all-docs-nav":1560},{"id":4,"title":5,"body":6,"breadcrumb":1536,"dateModified":1545,"datePublished":1545,"description":1546,"extension":1547,"faq":1548,"meta":1553,"navigation":1554,"path":1555,"seo":1556,"slug":12,"stem":1557,"type":1558,"__hash__":1559},"content\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads\u002Findex.md","Auditing Unused Preloads",{"type":7,"value":8,"toc":1518},"minimark",[9,13,21,30,35,64,68,79,166,174,177,181,184,349,526,530,533,585,606,617,621,624,1071,1074,1159,1163,1166,1254,1345,1348,1352,1366,1370,1433,1437,1440,1444,1449,1452,1456,1459,1463,1466,1470,1473,1477,1514],[10,11,5],"h1",{"id":12},"auditing-unused-preloads",[14,15,16,20],"p",{},[17,18,19],"code",{},"\u003Clink rel=\"preload\">"," is the sharpest tool in the resource-hint kit and the one most often misused. A preload says \"fetch this now, at high priority, before you discover you need it.\" Used for the one late-discovered critical resource on a page — usually a web font or a CSS background hero — it can take hundreds of milliseconds off LCP. Used for anything else, it takes bandwidth away from the resources that actually decide LCP, and on a static site with shared layouts, one bad preload is repeated on every page.",[14,22,23,24,29],{},"This guide audits every preload on a 600-page Hugo site, classifies each one, removes the harmful ones and adds a CI check so they do not come back. It is part of ",[25,26,28],"a",{"href":27},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002F","Resource Hints and Navigation Speed",".",[31,32,34],"h2",{"id":33},"prerequisites","Prerequisites",[36,37,38,54,57],"ul",{},[39,40,41,42,45,46,49,50,53],"li",{},"The built site's HTML output (",[17,43,44],{},"public\u002F"," for Hugo, ",[17,47,48],{},"dist\u002F"," for Astro, ",[17,51,52],{},"_site\u002F"," for Eleventy).",[39,55,56],{},"Chrome DevTools, for confirming the effect on individual templates.",[39,58,59,60,29],{},"Lighthouse or Lighthouse CI to measure LCP before and after — see ",[25,61,63],{"href":62},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fsetting-up-lighthouse-ci-for-a-static-site\u002F","Setting Up Lighthouse CI for a Static Site",[31,65,67],{"id":66},"step-1-inventory-every-preload-in-the-build","Step 1: Inventory Every Preload in the Build",[14,69,70,71,74,75,78],{},"Because a static site's HTML is all on disk, the inventory is a script, not a crawl. Collect every ",[17,72,73],{},"preload"," and ",[17,76,77],{},"modulepreload"," tag, grouped by template:",[80,81,86],"pre",{"className":82,"code":83,"language":84,"meta":85,"style":85},"language-bash shiki shiki-themes github-light github-dark","# count preload hrefs across all built pages\ngrep -rhoE '\u003Clink[^>]+rel=\"(module)?preload\"[^>]*>' public --include=index.html \\\n  | grep -oE 'href=\"[^\"]+\"' | sort | uniq -c | sort -rn | head -20\n","bash","",[17,87,88,97,121],{"__ignoreMap":85},[89,90,93],"span",{"class":91,"line":92},"line",1,[89,94,96],{"class":95},"sJ8bj","# count preload hrefs across all built pages\n",[89,98,100,104,108,112,115,118],{"class":91,"line":99},2,[89,101,103],{"class":102},"sScJk","grep",[89,105,107],{"class":106},"sj4cs"," -rhoE",[89,109,111],{"class":110},"sZZnC"," '\u003Clink[^>]+rel=\"(module)?preload\"[^>]*>'",[89,113,114],{"class":110}," public",[89,116,117],{"class":106}," --include=index.html",[89,119,120],{"class":106}," \\\n",[89,122,124,128,131,134,137,140,143,145,148,151,153,155,158,160,163],{"class":91,"line":123},3,[89,125,127],{"class":126},"szBVR","  |",[89,129,130],{"class":102}," grep",[89,132,133],{"class":106}," -oE",[89,135,136],{"class":110}," 'href=\"[^\"]+\"'",[89,138,139],{"class":126}," |",[89,141,142],{"class":102}," sort",[89,144,139],{"class":126},[89,146,147],{"class":102}," uniq",[89,149,150],{"class":106}," -c",[89,152,139],{"class":126},[89,154,142],{"class":102},[89,156,157],{"class":106}," -rn",[89,159,139],{"class":126},[89,161,162],{"class":102}," head",[89,164,165],{"class":106}," -20\n",[80,167,172],{"className":168,"code":170,"language":171,"meta":85},[169],"language-text","    612 href=\"\u002Ffonts\u002Finter-400.woff2\"\n    612 href=\"\u002Ffonts\u002Finter-500.woff2\"\n    612 href=\"\u002Ffonts\u002Finter-600.woff2\"\n    612 href=\"\u002Ffonts\u002Finter-700.woff2\"\n    612 href=\"\u002Ffonts\u002Fjetbrains-mono-400.woff2\"\n    612 href=\"\u002Fcss\u002Fsyntax.css\"\n    604 href=\"\u002Fimg\u002Fhero-default.jpg\"\n     38 href=\"\u002Fimg\u002Fposts\u002F…\u002Fhero.avif\"\n","text",[17,173,170],{"__ignoreMap":85},[14,175,176],{},"Every page preloaded five font files, a syntax-highlighting stylesheet and a default hero image. The theme had added them; nobody on the team had written them.",[31,178,180],{"id":179},"step-2-classify-each-preload","Step 2: Classify Each Preload",[14,182,183],{},"For each distinct preload, answer three questions: is it used on this template at all, is it needed for first render, and is it discovered late without the hint?",[185,186,187,209],"table",{},[188,189,190],"thead",{},[191,192,193,197,200,203,206],"tr",{},[194,195,196],"th",{},"Preload",[194,198,199],{},"Used?",[194,201,202],{},"Needed for first render?",[194,204,205],{},"Discovered late?",[194,207,208],{},"Verdict",[210,211,212,235,258,274,291,312,329],"tbody",{},[191,213,214,220,223,226,229],{},[215,216,217],"td",{},[17,218,219],{},"inter-400.woff2",[215,221,222],{},"all pages",[215,224,225],{},"yes (body text)",[215,227,228],{},"yes (in CSS)",[215,230,231],{},[232,233,234],"strong",{},"keep",[191,236,237,246,249,252,255],{},[215,238,239,242,243],{},[17,240,241],{},"inter-500",", ",[17,244,245],{},"inter-600",[215,247,248],{},"some pages",[215,250,251],{},"no",[215,253,254],{},"yes",[215,256,257],{},"remove",[191,259,260,265,267,270,272],{},[215,261,262],{},[17,263,264],{},"inter-700.woff2",[215,266,222],{},[215,268,269],{},"only for headings below the fold on some templates",[215,271,254],{},[215,273,257],{},[191,275,276,281,284,287,289],{},[215,277,278],{},[17,279,280],{},"jetbrains-mono-400",[215,282,283],{},"pages with code (41%)",[215,285,286],{},"rarely above the fold",[215,288,254],{},[215,290,257],{},[191,292,293,298,301,303,310],{},[215,294,295],{},[17,296,297],{},"syntax.css",[215,299,300],{},"pages with code",[215,302,251],{},[215,304,305,306,309],{},"no (it is a ",[17,307,308],{},"\u003Clink>"," already)",[215,311,257],{},[191,313,314,319,322,325,327],{},[215,315,316],{},[17,317,318],{},"hero-default.jpg",[215,320,321],{},"0 pages (replaced by per-post heroes)",[215,323,324],{},"—",[215,326,324],{},[215,328,257],{},[191,330,331,337,340,343,346],{},[215,332,333,334],{},"per-post ",[17,335,336],{},"hero.avif",[215,338,339],{},"its own page",[215,341,342],{},"yes (LCP element)",[215,344,345],{},"yes (CSS background)",[215,347,348],{},"keep, but only on that page",[350,351,352,522],"figure",{},[353,354,361,362,361,366,361,370,361,377,361,508],"svg",{"viewBox":355,"role":356,"ariaLabelledBy":357,"xmlns":360},"0 0 760 290","img",[358,359],"aup-class-title","aup-class-desc","http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","\n  ",[363,364,365],"title",{"id":358},"Decision tree for each preload",[367,368,369],"desc",{"id":359},"Three questions in sequence. Is the resource used on this page? If not, remove it: it is wasted bytes. Is it needed for first render? If not, remove it: it competes with the LCP resource. Is it discovered late without the hint? If not, remove it: the hint is redundant. Only a resource that passes all three keeps its preload.",[371,372],"rect",{"x":373,"y":373,"width":374,"height":375,"fill":376},"0","760","290","#ffffff",[378,379,381,382,381,389,381,399,381,405,381,408,381,411,381,414,381,418,381,425,381,428,381,434,381,436,381,438,381,441,381,446,381,448,381,451,381,457,381,461,381,486,381,489,381,492,381,497,381,500,381,503,361],"g",{"style":380},"font-family:system-ui, sans-serif;font-size:12px","\n    ",[171,383,388],{"x":384,"y":385,"fill":386,"style":387},"380","28","#1f2937","font-size:16px;font-weight:700;text-anchor:middle","Three questions; a preload must pass all of them",[371,390],{"x":391,"y":392,"width":393,"height":394,"rx":395,"fill":396,"stroke":397,"style":398},"40","56","200","50","8","#f8fafc","#d9e2ef","stroke-width:1.5px",[171,400,404],{"x":401,"y":402,"fill":386,"style":403},"140","86","font-weight:700;text-anchor:middle","used on this page?",[371,406],{"x":407,"y":392,"width":393,"height":394,"rx":395,"fill":396,"stroke":397,"style":398},"280",[171,409,410],{"x":384,"y":402,"fill":386,"style":403},"needed for first render?",[371,412],{"x":413,"y":392,"width":393,"height":394,"rx":395,"fill":396,"stroke":397,"style":398},"520",[171,415,417],{"x":416,"y":402,"fill":386,"style":403},"620","discovered late?",[371,419],{"x":391,"y":420,"width":393,"height":421,"rx":395,"fill":422,"opacity":423,"stroke":424,"style":398},"160","54","#ff595e","0.14","#d83b41",[171,426,257],{"x":401,"y":427,"fill":386,"style":403},"184",[171,429,433],{"x":401,"y":430,"fill":431,"style":432},"202","#556071","font-size:11px;text-anchor:middle","wasted bytes",[371,435],{"x":407,"y":420,"width":393,"height":421,"rx":395,"fill":422,"opacity":423,"stroke":424,"style":398},[171,437,257],{"x":384,"y":427,"fill":386,"style":403},[171,439,440],{"x":384,"y":430,"fill":431,"style":432},"competes with LCP",[371,442],{"x":413,"y":420,"width":393,"height":421,"rx":395,"fill":443,"opacity":444,"stroke":445,"style":398},"#ffca3a","0.26","#a97b00",[171,447,257],{"x":416,"y":427,"fill":386,"style":403},[171,449,450],{"x":416,"y":430,"fill":431,"style":432},"redundant hint",[371,452],{"x":413,"y":453,"width":393,"height":391,"rx":395,"fill":454,"opacity":455,"stroke":456,"style":398},"234","#8ac926","0.2","#5a8a16",[171,458,460],{"x":416,"y":459,"fill":386,"style":403},"259","keep the preload",[378,462,465,466,465,471,465,474,465,477,465,480,465,483,381],{"stroke":431,"fill":463,"style":464},"none","stroke-width:2px","\n      ",[467,468],"path",{"d":469,"style":470},"M242 81 L276 81","marker-end:url(#aup-arrow)",[467,472],{"d":473,"style":470},"M482 81 L516 81",[467,475],{"d":476,"style":470},"M140 108 L140 156",[467,478],{"d":479,"style":470},"M380 108 L380 156",[467,481],{"d":482,"style":470},"M620 108 L620 156",[467,484],{"d":485,"style":470},"M720 81 L740 81 L740 254 L724 254",[171,487,254],{"x":459,"y":488,"fill":431,"style":432},"74",[171,490,254],{"x":491,"y":488,"fill":431,"style":432},"499",[171,493,251],{"x":494,"y":495,"fill":431,"style":496},"152","138","font-size:11px",[171,498,251],{"x":499,"y":495,"fill":431,"style":496},"392",[171,501,251],{"x":502,"y":495,"fill":431,"style":496},"632",[171,504,254],{"x":505,"y":506,"fill":431,"style":507},"752","170","font-size:11px;text-anchor:end",[509,510,381,511,361],"defs",{},[512,513,465,519,381],"marker",{"id":514,"viewBox":515,"refX":395,"refY":516,"markerWidth":517,"markerHeight":517,"orient":518},"aup-arrow","0 0 10 10","5","7","auto-start-reverse",[467,520],{"d":521,"fill":431},"M0 0 L10 5 L0 10 z",[523,524,525],"figcaption",{},"Of eight distinct preloads on the site, two survived: the body font on every page, and each post's own hero on its own page.",[31,527,529],{"id":528},"step-3-fix-at-the-template-level","Step 3: Fix at the Template Level",[14,531,532],{},"Remove the theme's blanket preloads by overriding its head partial, then emit the two legitimate ones precisely:",[80,534,538],{"className":535,"code":536,"language":537,"meta":85,"style":85},"language-go-html-template shiki shiki-themes github-light github-dark","{{\u002F* layouts\u002Fpartials\u002Fhead\u002Fpreloads.html *\u002F}}\n\u003Clink rel=\"preload\" href=\"\u002Ffonts\u002Finter-400.woff2\" as=\"font\" type=\"font\u002Fwoff2\" crossorigin>\n{{ with .Params.hero }}\n  {{ with $.Resources.GetMatch . }}\n    {{ $img := .Resize \"1200x webp q78\" }}\n    \u003Clink rel=\"preload\" as=\"image\" href=\"{{ $img.RelPermalink }}\" fetchpriority=\"high\">\n  {{ end }}\n{{ end }}\n","go-html-template",[17,539,540,545,550,555,561,567,573,579],{"__ignoreMap":85},[89,541,542],{"class":91,"line":92},[89,543,544],{},"{{\u002F* layouts\u002Fpartials\u002Fhead\u002Fpreloads.html *\u002F}}\n",[89,546,547],{"class":91,"line":99},[89,548,549],{},"\u003Clink rel=\"preload\" href=\"\u002Ffonts\u002Finter-400.woff2\" as=\"font\" type=\"font\u002Fwoff2\" crossorigin>\n",[89,551,552],{"class":91,"line":123},[89,553,554],{},"{{ with .Params.hero }}\n",[89,556,558],{"class":91,"line":557},4,[89,559,560],{},"  {{ with $.Resources.GetMatch . }}\n",[89,562,564],{"class":91,"line":563},5,[89,565,566],{},"    {{ $img := .Resize \"1200x webp q78\" }}\n",[89,568,570],{"class":91,"line":569},6,[89,571,572],{},"    \u003Clink rel=\"preload\" as=\"image\" href=\"{{ $img.RelPermalink }}\" fetchpriority=\"high\">\n",[89,574,576],{"class":91,"line":575},7,[89,577,578],{},"  {{ end }}\n",[89,580,582],{"class":91,"line":581},8,[89,583,584],{},"{{ end }}\n",[14,586,587,588,591,592,595,596,598,599,601,602,29],{},"The per-post hero preload now exists only on pages that have a hero, points at the exact processed file the page renders, and carries ",[17,589,590],{},"fetchpriority=\"high\""," so the browser treats it as the LCP candidate it is. For heroes rendered as ",[17,593,594],{},"\u003Cimg>"," elements rather than CSS backgrounds, drop the preload entirely and put ",[17,597,590],{}," on the ",[17,600,594],{}," — the image is already discoverable in the HTML, as shown in ",[25,603,605],{"href":604},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Freducing-lcp-from-hero-images-on-static-sites\u002F","Reducing LCP from Hero Images on Static Sites",[14,607,608,609,612,613,29],{},"Font preloads need the ",[17,610,611],{},"crossorigin"," attribute even on the same origin, because fonts are fetched in CORS mode; without it the preload is not matched and the font downloads twice. That detail is covered in ",[25,614,616],{"href":615},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fpreloading-fonts-without-double-downloads\u002F","Preloading Fonts Without Double Downloads",[31,618,620],{"id":619},"step-4-guard-it-in-ci","Step 4: Guard It in CI",[14,622,623],{},"A theme update reintroduced two font preloads three weeks after the clean-up. A build check now counts preloads per page and verifies each preloaded URL is referenced elsewhere in the same page:",[80,625,629],{"className":626,"code":627,"language":628,"meta":85,"style":85},"language-js shiki shiki-themes github-light github-dark","\u002F\u002F scripts\u002Fcheck-preloads.mjs\nimport { globSync, readFileSync } from 'node:fs';\nconst MAX = 2;\nlet bad = 0;\nfor (const f of globSync('public\u002F**\u002Findex.html')) {\n  const html = readFileSync(f, 'utf8');\n  const pre = [...html.matchAll(\u002F\u003Clink[^>]+rel=\"preload\"[^>]+href=\"([^\"]+)\"\u002Fg)].map((m) => m[1]);\n  if (pre.length > MAX) { console.log(`${f}: ${pre.length} preloads`); bad++; }\n  const body = html.replace(\u002F\u003Clink[^>]+rel=\"preload\"[^>]*>\u002Fg, '');\n  for (const href of pre) {\n    const name = href.split('\u002F').pop();\n    if (!body.includes(name)) { console.log(`${f}: preload ${href} not referenced`); bad++; }\n  }\n}\nprocess.exit(bad ? 1 : 0);\n","js",[17,630,631,636,654,670,686,714,736,836,887,942,960,991,1034,1040,1046],{"__ignoreMap":85},[89,632,633],{"class":91,"line":92},[89,634,635],{"class":95},"\u002F\u002F scripts\u002Fcheck-preloads.mjs\n",[89,637,638,641,645,648,651],{"class":91,"line":99},[89,639,640],{"class":126},"import",[89,642,644],{"class":643},"sVt8B"," { globSync, readFileSync } ",[89,646,647],{"class":126},"from",[89,649,650],{"class":110}," 'node:fs'",[89,652,653],{"class":643},";\n",[89,655,656,659,662,665,668],{"class":91,"line":123},[89,657,658],{"class":126},"const",[89,660,661],{"class":106}," MAX",[89,663,664],{"class":126}," =",[89,666,667],{"class":106}," 2",[89,669,653],{"class":643},[89,671,672,675,678,681,684],{"class":91,"line":557},[89,673,674],{"class":126},"let",[89,676,677],{"class":643}," bad ",[89,679,680],{"class":126},"=",[89,682,683],{"class":106}," 0",[89,685,653],{"class":643},[89,687,688,691,694,696,699,702,705,708,711],{"class":91,"line":563},[89,689,690],{"class":126},"for",[89,692,693],{"class":643}," (",[89,695,658],{"class":126},[89,697,698],{"class":106}," f",[89,700,701],{"class":126}," of",[89,703,704],{"class":102}," globSync",[89,706,707],{"class":643},"(",[89,709,710],{"class":110},"'public\u002F**\u002Findex.html'",[89,712,713],{"class":643},")) {\n",[89,715,716,719,722,724,727,730,733],{"class":91,"line":569},[89,717,718],{"class":126},"  const",[89,720,721],{"class":106}," html",[89,723,664],{"class":126},[89,725,726],{"class":102}," readFileSync",[89,728,729],{"class":643},"(f, ",[89,731,732],{"class":110},"'utf8'",[89,734,735],{"class":643},");\n",[89,737,738,740,743,745,748,751,754,757,759,762,766,769,772,775,778,781,783,785,787,789,792,794,796,799,801,804,806,808,811,814,817,821,824,827,830,833],{"class":91,"line":575},[89,739,718],{"class":126},[89,741,742],{"class":106}," pre",[89,744,664],{"class":126},[89,746,747],{"class":643}," [",[89,749,750],{"class":126},"...",[89,752,753],{"class":643},"html.",[89,755,756],{"class":102},"matchAll",[89,758,707],{"class":643},[89,760,761],{"class":110},"\u002F",[89,763,765],{"class":764},"sA_wV","\u003Clink",[89,767,768],{"class":106},"[",[89,770,771],{"class":126},"^",[89,773,774],{"class":106},">]",[89,776,777],{"class":126},"+",[89,779,780],{"class":764},"rel=\"preload\"",[89,782,768],{"class":106},[89,784,771],{"class":126},[89,786,774],{"class":106},[89,788,777],{"class":126},[89,790,791],{"class":764},"href=\"(",[89,793,768],{"class":106},[89,795,771],{"class":126},[89,797,798],{"class":106},"\"]",[89,800,777],{"class":126},[89,802,803],{"class":764},")\"",[89,805,761],{"class":110},[89,807,378],{"class":126},[89,809,810],{"class":643},")].",[89,812,813],{"class":102},"map",[89,815,816],{"class":643},"((",[89,818,820],{"class":819},"s4XuR","m",[89,822,823],{"class":643},") ",[89,825,826],{"class":126},"=>",[89,828,829],{"class":643}," m[",[89,831,832],{"class":106},"1",[89,834,835],{"class":643},"]);\n",[89,837,838,841,844,847,850,852,855,858,860,863,866,869,871,873,875,878,881,884],{"class":91,"line":581},[89,839,840],{"class":126},"  if",[89,842,843],{"class":643}," (pre.",[89,845,846],{"class":106},"length",[89,848,849],{"class":126}," >",[89,851,661],{"class":106},[89,853,854],{"class":643},") { console.",[89,856,857],{"class":102},"log",[89,859,707],{"class":643},[89,861,862],{"class":110},"`${",[89,864,865],{"class":643},"f",[89,867,868],{"class":110},"}: ${",[89,870,80],{"class":643},[89,872,29],{"class":110},[89,874,846],{"class":106},[89,876,877],{"class":110},"} preloads`",[89,879,880],{"class":643},"); bad",[89,882,883],{"class":126},"++",[89,885,886],{"class":643},"; }\n",[89,888,890,892,895,897,900,903,905,907,909,911,913,915,917,919,921,923,925,928,931,933,935,937,940],{"class":91,"line":889},9,[89,891,718],{"class":126},[89,893,894],{"class":106}," body",[89,896,664],{"class":126},[89,898,899],{"class":643}," html.",[89,901,902],{"class":102},"replace",[89,904,707],{"class":643},[89,906,761],{"class":110},[89,908,765],{"class":764},[89,910,768],{"class":106},[89,912,771],{"class":126},[89,914,774],{"class":106},[89,916,777],{"class":126},[89,918,780],{"class":764},[89,920,768],{"class":106},[89,922,771],{"class":126},[89,924,774],{"class":106},[89,926,927],{"class":126},"*",[89,929,930],{"class":764},">",[89,932,761],{"class":110},[89,934,378],{"class":126},[89,936,242],{"class":643},[89,938,939],{"class":110},"''",[89,941,735],{"class":643},[89,943,945,948,950,952,955,957],{"class":91,"line":944},10,[89,946,947],{"class":126},"  for",[89,949,693],{"class":643},[89,951,658],{"class":126},[89,953,954],{"class":106}," href",[89,956,701],{"class":126},[89,958,959],{"class":643}," pre) {\n",[89,961,963,966,969,971,974,977,979,982,985,988],{"class":91,"line":962},11,[89,964,965],{"class":126},"    const",[89,967,968],{"class":106}," name",[89,970,664],{"class":126},[89,972,973],{"class":643}," href.",[89,975,976],{"class":102},"split",[89,978,707],{"class":643},[89,980,981],{"class":110},"'\u002F'",[89,983,984],{"class":643},").",[89,986,987],{"class":102},"pop",[89,989,990],{"class":643},"();\n",[89,992,994,997,999,1002,1005,1008,1011,1013,1015,1017,1019,1022,1025,1028,1030,1032],{"class":91,"line":993},12,[89,995,996],{"class":126},"    if",[89,998,693],{"class":643},[89,1000,1001],{"class":126},"!",[89,1003,1004],{"class":643},"body.",[89,1006,1007],{"class":102},"includes",[89,1009,1010],{"class":643},"(name)) { console.",[89,1012,857],{"class":102},[89,1014,707],{"class":643},[89,1016,862],{"class":110},[89,1018,865],{"class":643},[89,1020,1021],{"class":110},"}: preload ${",[89,1023,1024],{"class":643},"href",[89,1026,1027],{"class":110},"} not referenced`",[89,1029,880],{"class":643},[89,1031,883],{"class":126},[89,1033,886],{"class":643},[89,1035,1037],{"class":91,"line":1036},13,[89,1038,1039],{"class":643},"  }\n",[89,1041,1043],{"class":91,"line":1042},14,[89,1044,1045],{"class":643},"}\n",[89,1047,1049,1052,1055,1058,1061,1064,1067,1069],{"class":91,"line":1048},15,[89,1050,1051],{"class":643},"process.",[89,1053,1054],{"class":102},"exit",[89,1056,1057],{"class":643},"(bad ",[89,1059,1060],{"class":126},"?",[89,1062,1063],{"class":106}," 1",[89,1065,1066],{"class":126}," :",[89,1068,683],{"class":106},[89,1070,735],{"class":643},[14,1072,1073],{},"Checking that the filename appears elsewhere in the page catches preloads for resources the page never uses — though for fonts referenced only from CSS, add the stylesheet's font list to the check, or exempt the known font file by name.",[350,1075,1076,1156],{},[353,1077,361,1082,361,1085,361,1088,361,1091],{"viewBox":1078,"role":356,"ariaLabelledBy":1079,"xmlns":360},"0 0 760 240",[1080,1081],"aup-ci-title","aup-ci-desc",[363,1083,1084],{"id":1080},"Preload count over time with and without the CI check",[367,1086,1087],{"id":1081},"A step line of preload tags per page. It starts at 7, drops to 2 after the clean-up, and without a check rises back to 4 three weeks later when a theme update adds two font preloads. With the check, the theme update's pull request fails and the count stays at 2.",[371,1089],{"x":373,"y":373,"width":374,"height":1090,"fill":376},"240",[378,1092,381,1093,381,1096,381,1100,381,1102,381,1106,381,1109,381,1111,381,1116,381,1120,381,1124,381,1128,381,1135,381,1140,381,1145,381,1151,361],{"style":380},[171,1094,1095],{"x":384,"y":385,"fill":386,"style":387},"Preloads per page: clean-up, then a theme update",[91,1097],{"x1":1098,"y1":393,"x2":1099,"y2":393,"stroke":431,"style":398},"80","720",[91,1101],{"x1":1098,"y1":394,"x2":1098,"y2":393,"stroke":431,"style":398},[171,1103,373],{"x":1104,"y":1105,"fill":431,"style":507},"72","204",[171,1107,1108],{"x":1104,"y":401,"fill":431,"style":507},"4",[171,1110,395],{"x":1104,"y":1104,"fill":431,"style":507},[1112,1113],"polyline",{"points":1114,"fill":463,"stroke":424,"style":1115},"80,88 250,88 250,168 480,168 480,136 720,136","stroke-width:2.5px;stroke-dasharray:6 4",[1112,1117],{"points":1118,"fill":463,"stroke":456,"style":1119},"250,170 720,170","stroke-width:2.5px",[171,1121,1123],{"x":1122,"y":1098,"fill":386,"style":432},"165","7 (theme defaults)",[171,1125,1127],{"x":1126,"y":420,"fill":386,"style":432},"365","2 after clean-up",[171,1129,1134],{"x":1130,"y":1131,"fill":1132,"style":1133},"600","128","#b32b30","font-size:11px;font-weight:700;text-anchor:middle","no check: back to 4",[171,1136,1139],{"x":1130,"y":1137,"fill":1138,"style":1133},"188","#3f6410","with check: PR fails, stays 2",[91,1141],{"x1":1142,"y1":394,"x2":1142,"y2":393,"stroke":1143,"style":1144},"480","#6a4c93","stroke-width:1.5px;stroke-dasharray:4 4",[171,1146,1150],{"x":1147,"y":1148,"fill":1143,"style":1149},"486","62","font-size:11px;font-weight:700","theme update",[171,1152,1155],{"x":1153,"y":1154,"fill":431,"style":432},"400","226","six weeks of builds on the 600-page Hugo site",[523,1157,1158],{},"Without a guard, clean-ups decay; the check turned the theme update into a failed pull request instead of a slower site.",[31,1160,1162],{"id":1161},"measured-impact","Measured Impact",[14,1164,1165],{},"The post template and the docs template, Lighthouse 12 mobile, median of five runs, preview deploy:",[185,1167,1168,1187],{},[188,1169,1170],{},[191,1171,1172,1175,1178,1181,1184],{},[194,1173,1174],{},"Measure",[194,1176,1177],{},"Post before",[194,1179,1180],{},"Post after",[194,1182,1183],{},"Docs before",[194,1185,1186],{},"Docs after",[210,1188,1189,1203,1220,1237],{},[191,1190,1191,1194,1196,1199,1201],{},[215,1192,1193],{},"Preload tags",[215,1195,517],{},[215,1197,1198],{},"2",[215,1200,517],{},[215,1202,832],{},[191,1204,1205,1208,1211,1214,1217],{},[215,1206,1207],{},"Bytes fetched at high priority before LCP",[215,1209,1210],{},"412 KB",[215,1212,1213],{},"138 KB",[215,1215,1216],{},"318 KB",[215,1218,1219],{},"46 KB",[191,1221,1222,1225,1228,1231,1234],{},[215,1223,1224],{},"LCP",[215,1226,1227],{},"2.34 s",[215,1229,1230],{},"1.71 s",[215,1232,1233],{},"1.86 s",[215,1235,1236],{},"1.22 s",[191,1238,1239,1242,1245,1248,1251],{},[215,1240,1241],{},"FCP",[215,1243,1244],{},"1.48 s",[215,1246,1247],{},"1.19 s",[215,1249,1250],{},"1.44 s",[215,1252,1253],{},"1.12 s",[350,1255,1256,1342],{},[353,1257,361,1262,361,1265,361,1268,361,1271],{"viewBox":1258,"role":356,"ariaLabelledBy":1259,"xmlns":360},"0 0 760 270",[1260,1261],"aup-bytes-title","aup-bytes-desc",[363,1263,1264],{"id":1260},"High-priority bytes before LCP and the resulting LCP",[367,1266,1267],{"id":1261},"Two paired comparisons. On the post template, high-priority bytes before LCP fell from 412 to 138 kilobytes and LCP fell from 2.34 to 1.71 seconds. On the docs template, bytes fell from 318 to 46 kilobytes and LCP fell from 1.86 to 1.22 seconds.",[371,1269],{"x":373,"y":373,"width":374,"height":1270,"fill":376},"270",[378,1272,381,1273,381,1276,381,1282,381,1290,381,1295,381,1298,381,1303,381,1307,381,1310,381,1315,381,1319,381,1324,381,1328,381,1331,381,1334,381,1338,361],{"style":380},[171,1274,1275],{"x":384,"y":385,"fill":386,"style":387},"Fewer bytes competing, earlier LCP",[171,1277,1281],{"x":1278,"y":1279,"fill":386,"style":1280},"30","76","font-weight:700","Post",[371,1283],{"x":1284,"y":1285,"width":1286,"height":1287,"rx":1108,"fill":422,"opacity":1288,"stroke":424,"style":1289},"120","60","412","20","0.25","stroke-width:1px",[171,1291,1294],{"x":1292,"y":1293,"fill":386},"540","75","412 KB · LCP 2.34 s",[371,1296],{"x":1284,"y":402,"width":495,"height":1287,"rx":1108,"fill":454,"opacity":1297,"stroke":456,"style":1289},"0.35",[171,1299,1302],{"x":1300,"y":1301,"fill":1138,"style":1280},"266","101","138 KB · LCP 1.71 s",[171,1304,1306],{"x":1278,"y":1305,"fill":386,"style":1280},"156","Docs",[371,1308],{"x":1284,"y":401,"width":1309,"height":1287,"rx":1108,"fill":422,"opacity":1288,"stroke":424,"style":1289},"318",[171,1311,1314],{"x":1312,"y":1313,"fill":386},"446","155","318 KB · LCP 1.86 s",[371,1316],{"x":1284,"y":1317,"width":1318,"height":1287,"rx":1108,"fill":454,"opacity":1297,"stroke":456,"style":1289},"166","46",[171,1320,1323],{"x":1321,"y":1322,"fill":1138,"style":1280},"174","181","46 KB · LCP 1.22 s",[371,1325],{"x":1284,"y":1326,"width":1327,"height":1327,"fill":422,"opacity":1288,"stroke":424,"style":1289},"216","12",[171,1329,1330],{"x":495,"y":1154,"fill":431,"style":496},"before: theme's blanket preloads",[371,1332],{"x":1333,"y":1326,"width":1327,"height":1327,"fill":454,"opacity":1297,"stroke":456,"style":1289},"360",[171,1335,1337],{"x":1336,"y":1154,"fill":431,"style":496},"378","after: one font + the page's own hero",[171,1339,1341],{"x":384,"y":1340,"fill":431,"style":432},"258","Lighthouse 12 mobile, simulated 4G, median of 5; bar length = KB fetched at high priority before LCP",[523,1343,1344],{},"Removing preloads made both templates faster: the LCP resource no longer shared the connection with six things it did not need.",[14,1346,1347],{},"In the field, over the following four weeks, the site's mobile LCP p75 from CrUX moved from 2.3 s to 1.8 s. It is the rare performance fix that consists entirely of deleting code.",[31,1349,1351],{"id":1350},"reading-the-evidence-in-devtools","Reading the Evidence in DevTools",[14,1353,1354,1355,1357,1358,1361,1362,29],{},"Before deleting a preload, it is worth confirming its effect on one page so the change can be explained in review. Three views make the case. The Console lists \"The resource … was preloaded using link preload but not used within a few seconds\" for truly unused preloads — ",[17,1356,318],{}," produced that warning on every page. The Network panel, sorted by start time with the Priority column shown, reveals used-but-unnecessary preloads: on the post template, four font files and a stylesheet started at ",[17,1359,1360],{},"Highest"," priority in the same 50 ms window as the hero image, and the hero's download stretched from 280 to 610 ms as they shared bandwidth. And the Performance panel's LCP breakdown shows the \"resource load duration\" subpart shrinking once the competition is removed — from 560 ms to 230 ms on this template, which accounts for most of the LCP gain. The same breakdown is walked through in ",[25,1363,1365],{"href":1364},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Fmeasuring-lcp-subparts-with-devtools\u002F","Measuring LCP Subparts with DevTools",[31,1367,1369],{"id":1368},"pitfalls-rollback","Pitfalls & Rollback",[36,1371,1372,1378,1406,1412,1421,1427],{},[39,1373,1374,1377],{},[232,1375,1376],{},"Deleting the one preload that matters."," Keep the late-discovered critical font; removing it can reintroduce invisible text or a font swap shift. Measure after every removal.",[39,1379,1380,1386,1387,1389,1390,1392,1393,1396,1397,74,1399,1402,1403,29],{},[232,1381,1382,1383,29],{},"Preloading responsive images without ",[17,1384,1385],{},"imagesrcset"," A preload with a single ",[17,1388,1024],{}," fetches one size; if the page's ",[17,1391,594],{}," picks another from ",[17,1394,1395],{},"srcset",", the preload is wasted. Use ",[17,1398,1385],{},[17,1400,1401],{},"imagesizes",", or rely on ",[17,1404,1405],{},"fetchpriority",[39,1407,1408,1411],{},[232,1409,1410],{},"Auditing one page only."," Preloads come from shared partials, so an audit of the homepage alone misses template-specific ones. Scan every built page, grouped by template.",[39,1413,1414,1417,1418,1420],{},[232,1415,1416],{},"Framework preloads you did not write."," Bundlers emit ",[17,1419,77],{}," for route chunks. Those are usually right; audit them only if a template preloads chunks it never executes.",[39,1422,1423,1426],{},[232,1424,1425],{},"Blanket fixes in the layout."," A preload that is right for one template is wrong for another. Emit hints per template from data the page already has.",[39,1428,1429,1432],{},[232,1430,1431],{},"Rollback:"," preloads are single tags in partials. Restoring one is a one-line revert, and the CI check's allowance can be raised per template if a new, justified preload is needed.",[31,1434,1436],{"id":1435},"conclusion","Conclusion",[14,1438,1439],{},"Preloads are cheap to add and easy to forget, and themes add them for you. Auditing the built HTML found seven preloads on every page of a 600-page site; two were justified, five competed with the LCP image or fetched files the page never used. Removing them cut high-priority bytes before LCP by two thirds and LCP by 0.6 seconds on both templates tested, and a ten-line CI check has kept them from creeping back since.",[31,1441,1443],{"id":1442},"faq","FAQ",[1445,1446,1448],"h3",{"id":1447},"what-counts-as-an-unused-preload","What counts as an unused preload?",[14,1450,1451],{},"A preloaded resource that the page does not use within about three seconds of the load event. Chrome logs a console warning for each one, and the resource was downloaded at high priority for nothing.",[1445,1453,1455],{"id":1454},"can-a-preload-be-used-but-still-harmful","Can a preload be used but still harmful?",[14,1457,1458],{},"Yes. A preload for a resource that is needed but not critical, such as a below-the-fold image or a second font weight, still competes with the LCP resource for bandwidth. Used-but-unnecessary preloads delayed LCP more than unused ones on the site in this guide.",[1445,1460,1462],{"id":1461},"where-do-unwanted-preloads-come-from","Where do unwanted preloads come from?",[14,1464,1465],{},"Most often from themes and plugins that preload every font weight or a hero image on every template, from framework defaults that preload route chunks, and from hand-written hints that outlived the asset they pointed to.",[1445,1467,1469],{"id":1468},"how-do-i-stop-preloads-creeping-back","How do I stop preloads creeping back?",[14,1471,1472],{},"Parse the built HTML in CI, count preload tags per template, and fail the build when a template exceeds its allowance or preloads a resource the page does not reference. It takes a few seconds and catches theme updates immediately.",[31,1474,1476],{"id":1475},"related","Related",[36,1478,1479,1488,1493,1500,1507],{},[39,1480,1481,1484,1485,1487],{},[232,1482,1483],{},"Parent:"," ",[25,1486,28],{"href":27}," — when each hint is appropriate.",[39,1489,1490,1492],{},[25,1491,616],{"href":615}," — the one preload most sites should keep.",[39,1494,1495,1499],{},[25,1496,1498],{"href":1497},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fpreconnect-vs-dns-prefetch-on-static-sites\u002F","Preconnect vs DNS-Prefetch on Static Sites"," — auditing connection hints the same way.",[39,1501,1502,1506],{},[25,1503,1505],{"href":1504},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Foptimizing-lcp-on-astro-with-priority-hints\u002F","Optimizing LCP on Astro with Priority Hints"," — fetchpriority as an alternative to preload.",[39,1508,1509,1513],{},[25,1510,1512],{"href":1511},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fwriting-a-performance-budget-that-fails-builds\u002F","Writing a Performance Budget That Fails Builds"," — budgeting hints alongside bytes.",[1515,1516,1517],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}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 pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sA_wV, html code.shiki .sA_wV{--shiki-default:#032F62;--shiki-dark:#DBEDFF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":85,"searchDepth":99,"depth":99,"links":1519},[1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1535],{"id":33,"depth":99,"text":34},{"id":66,"depth":99,"text":67},{"id":179,"depth":99,"text":180},{"id":528,"depth":99,"text":529},{"id":619,"depth":99,"text":620},{"id":1161,"depth":99,"text":1162},{"id":1350,"depth":99,"text":1351},{"id":1368,"depth":99,"text":1369},{"id":1435,"depth":99,"text":1436},{"id":1442,"depth":99,"text":1443,"children":1530},[1531,1532,1533,1534],{"id":1447,"depth":123,"text":1448},{"id":1454,"depth":123,"text":1455},{"id":1461,"depth":123,"text":1462},{"id":1468,"depth":123,"text":1469},{"id":1475,"depth":99,"text":1476},[1537,1539,1542,1543],{"name":1538,"item":761},"Home",{"name":1540,"item":1541},"Performance Optimization & Core Web Vitals for SSGs","\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002F",{"name":28,"item":27},{"name":5,"item":1544},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads\u002F","2026-09-18","Find preloads that waste bandwidth or compete with the LCP resource across a whole static site, remove them safely, and stop new ones creeping back in.","md",[1549,1550,1551,1552],{"q":1448,"a":1451},{"q":1455,"a":1458},{"q":1462,"a":1465},{"q":1469,"a":1472},{},true,"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads",{"title":5,"description":1546},"performance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads\u002Findex","article","lEgajAf1FgXzek-5NudDQm1tJYZXtNESTMFm-h8UkJU",[1561,1564,1567,1570,1573,1576,1579,1582,1585,1588,1591,1594,1597,1600,1603,1606,1609,1612,1615,1618,1621,1624,1627,1630,1633,1636,1639,1642,1645,1648,1651,1654,1657,1660,1663,1666,1669,1672,1675,1678,1681,1684,1687,1690,1693,1696,1699,1702,1705,1708,1711,1714,1717,1720,1723,1726,1729,1732,1735,1738,1741,1744,1747,1750,1753,1756,1759,1762,1765,1768,1771,1773,1776,1779,1782,1785,1788,1791,1794,1797,1800,1803,1806,1809,1812,1815,1818,1821,1824,1827,1830,1832,1834,1836,1839,1842,1845,1848,1850,1853,1855,1856,1858,1861,1863,1866,1869,1872,1875,1878,1881,1884,1887,1890,1893,1896,1899,1902,1905,1908,1911,1914,1917,1920,1923,1926,1929,1932,1935,1938,1941,1944,1947,1950,1953,1956,1959,1962,1965,1968,1971,1974,1977,1980,1983,1986,1989,1992,1995,1998,2001,2004,2007,2010,2013,2016,2019,2022,2025,2028,2031,2034,2037,2040,2043,2046,2049,2052,2055,2058,2061,2064,2067,2070,2073,2076,2079,2082,2085,2088,2091,2094,2097],{"path":1562,"title":1563},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fastro-vs-eleventy-build-times-at-10000-pages","Astro vs Eleventy Build Times at 10,000 Pages",{"path":1565,"title":1566},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fchoosing-between-astro-and-eleventy-for-large-docs","Astro vs Eleventy for Large Docs (1000+ Pages)",{"path":1568,"title":1569},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fcontent-collections-vs-eleventy-data-cascade","Content Collections vs the Eleventy Data Cascade",{"path":1571,"title":1572},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites","Astro vs Eleventy for Documentation Sites",{"path":1574,"title":1575},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fshortcodes-vs-components-for-docs-authors","Shortcodes vs Components for Docs Authors",{"path":1577,"title":1578},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fsidebar-navigation-in-astro-and-eleventy","Sidebar Navigation in Astro and Eleventy",{"path":1580,"title":1581},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fcustomizing-starlight-without-forking-the-theme","Customizing Starlight Without Forking the Theme",{"path":1583,"title":1584},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fdocusaurus-vs-starlight-for-product-documentation","Docusaurus vs Starlight for Product Documentation",{"path":1586,"title":1587},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress","Docs Frameworks: Docusaurus, Starlight and VitePress",{"path":1589,"title":1590},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmdx-vs-markdoc-for-docs-content","MDX vs Markdoc for Docs Content",{"path":1592,"title":1593},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmigrating-from-mkdocs-to-starlight","Migrating from MkDocs to Starlight",{"path":1595,"title":1596},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fversioned-documentation-with-docusaurus","Versioned Documentation with Docusaurus",{"path":1598,"title":1599},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fvitepress-for-library-documentation","VitePress for Library Documentation",{"path":1601,"title":1602},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fhow-to-benchmark-hugo-vs-astro-build-speeds","How to Benchmark Hugo vs Astro Build Speeds",{"path":1604,"title":1605},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fhugo-partialcached-for-faster-builds","Hugo partialCached for Faster Builds",{"path":1607,"title":1608},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories","Hugo Build Times for Large Repositories",{"path":1610,"title":1611},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fprofiling-hugo-templates-with-template-metrics","Profiling Hugo Templates With Template Metrics",{"path":1613,"title":1614},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Freducing-hugo-memory-usage-on-ci-runners","Reducing Hugo Memory Usage on CI Runners",{"path":1616,"title":1617},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fspeeding-up-hugo-builds-with-render-hooks-and-caching","Speeding Up Hugo Builds with Render Hooks & Caching",{"path":1619,"title":1620},"\u002Fchoosing-the-right-static-site-generator-for-production","Choosing the Right Static Site Generator for Production",{"path":1622,"title":1623},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Feleventy-vs-jekyll-for-markdown-heavy-blogs","Eleventy vs Jekyll for Markdown-Heavy Blogs",{"path":1625,"title":1626},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem","Jekyll Plugin Ecosystem",{"path":1628,"title":1629},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Freplacing-jekyll-plugins-when-migrating-to-eleventy","Replacing Jekyll Plugins When Migrating to Eleventy",{"path":1631,"title":1632},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Frunning-jekyll-on-github-pages-without-plugins","Running Jekyll on GitHub Pages Without Plugins",{"path":1634,"title":1635},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fspeeding-up-slow-jekyll-builds","Speeding Up Slow Jekyll Builds",{"path":1637,"title":1638},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fupgrading-jekyll-and-ruby-versions-safely","Upgrading Jekyll and Ruby Versions Safely",{"path":1640,"title":1641},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fconverting-front-matter-at-scale-during-migration","Converting Front Matter at Scale During Migration",{"path":1643,"title":1644},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators","Migrating Between Static Site Generators",{"path":1646,"title":1647},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fkeeping-redirects-working-after-an-ssg-migration","Keeping Redirects Working After an SSG Migration",{"path":1649,"title":1650},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-a-docs-site-from-jekyll-to-hugo","Migrating a Docs Site From Jekyll to Hugo",{"path":1652,"title":1653},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-gatsby-to-astro","Migrating from Gatsby to Astro",{"path":1655,"title":1656},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-hugo-to-astro-without-breaking-urls","Migrating From Hugo to Astro Without Breaking URLs",{"path":1658,"title":1659},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-wordpress-to-a-static-site-generator","Migrating WordPress to a Static Site Generator",{"path":1661,"title":1662},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fporting-shortcodes-and-includes-between-generators","Porting Shortcodes and Includes Between Generators",{"path":1664,"title":1665},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fhandling-dynamic-routes-in-nextjs-static-export","Handling Dynamic Routes in Next.js Static Export",{"path":1667,"title":1668},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites","Next.js Static Export for Content Sites",{"path":1670,"title":1671},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fmigrating-from-gatsby-to-nextjs-static-export","Migrating from Gatsby to Next.js Static Export",{"path":1673,"title":1674},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fnextjs-app-router-static-export-limitations","Next.js App Router Static Export Limitations",{"path":1676,"title":1677},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fnextjs-static-export-vs-astro-for-marketing-sites","Next.js Static Export vs Astro for Marketing",{"path":1679,"title":1680},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Foptimizing-images-in-nextjs-static-export","Optimizing Images in Next.js Static Export",{"path":1682,"title":1683},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fadding-pagefind-to-an-astro-site","Adding Pagefind to an Astro Site",{"path":1685,"title":1686},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fbuilding-a-lunr-index-at-build-time-in-eleventy","Building a Lunr Index at Build Time in Eleventy",{"path":1688,"title":1689},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites","Search for Static Sites",{"path":1691,"title":1692},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Findexing-hugo-sites-with-pagefind","Indexing Hugo Sites with Pagefind",{"path":1694,"title":1695},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fmultilingual-search-on-static-sites","Multilingual Search on Static Sites",{"path":1697,"title":1698},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fpagefind-vs-algolia-docsearch","Pagefind vs Algolia DocSearch",{"path":1700,"title":1701},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fsearch-index-size-budgets-for-large-docs","Search Index Size Budgets for Large Docs",{"path":1703,"title":1704},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fbest-ssg-for-technical-writers-without-coding-experience","Best SSG for Non-Developer Technical Writers",{"path":1706,"title":1707},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fchoosing-an-ssg-for-api-reference-documentation","Choosing an SSG for API Reference Documentation",{"path":1709,"title":1710},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fevaluating-ssg-accessibility-defaults","Evaluating SSG Accessibility Defaults",{"path":1712,"title":1713},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix","SSG Framework Selection Matrix",{"path":1715,"title":1716},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fpicking-an-ssg-for-a-multi-language-documentation-site","Picking an SSG for a Multi-Language Docs Site",{"path":1718,"title":1719},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fssg-selection-checklist-for-engineering-teams","SSG Selection Checklist for Engineering Teams",{"path":1721,"title":1722},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Ftotal-cost-of-ownership-for-static-site-generators","Total Cost of Ownership for Static Site Generators",{"path":1724,"title":1725},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-busting-with-content-hashed-filenames","Cache Busting with Content-Hashed Filenames",{"path":1727,"title":1728},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs","CDN Caching Rules for SSGs",{"path":1730,"title":1731},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fpurging-the-cdn-cache-after-a-static-deploy","Purging the CDN Cache After a Static Deploy",{"path":1733,"title":1734},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fsetting-cache-control-headers-on-cloudflare-pages","Cache-Control Headers on Cloudflare Pages",{"path":1736,"title":1737},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fsetting-up-proper-cache-headers-on-netlify","Proper Cache Headers on Netlify for SSGs",{"path":1739,"title":1740},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fstale-while-revalidate-for-static-html","Stale-While-Revalidate for Static HTML",{"path":1742,"title":1743},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Feliminating-layout-shift-from-web-fonts","Eliminating Layout Shift From Web Fonts",{"path":1745,"title":1746},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Ffixing-cls-from-cookie-banners","Fixing CLS from Cookie Banners",{"path":1748,"title":1749},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Ffixing-cls-from-late-loading-embeds","Fixing CLS From Late-Loading Embeds",{"path":1751,"title":1752},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Ffixing-cls-from-sticky-headers-and-anchor-links","Fixing CLS from Sticky Headers and Anchor Links",{"path":1754,"title":1755},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites","Cumulative Layout Shift Fixes for Static Sites",{"path":1757,"title":1758},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Fmeasuring-cls-in-the-field-with-web-vitals-js","Measuring CLS in the Field With web-vitals.js",{"path":1760,"title":1761},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Freserving-space-for-images-and-embeds-to-stop-layout-shift","Reserving Space for Images and Embeds",{"path":1763,"title":1764},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Ffont-display-optional-vs-swap","font-display: optional vs swap",{"path":1766,"title":1767},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites","Font Loading Strategies for Static Sites",{"path":1769,"title":1770},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fmetric-matched-fallback-fonts-with-size-adjust","Metric-Matched Fallback Fonts with size-adjust",{"path":1772,"title":616},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fpreloading-fonts-without-double-downloads",{"path":1774,"title":1775},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fself-hosting-google-fonts-to-eliminate-layout-shift","Self-Host Google Fonts to Eliminate Layout Shift",{"path":1777,"title":1778},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fsubsetting-variable-fonts-for-faster-first-render","Subsetting Variable Fonts for Faster First Render",{"path":1780,"title":1781},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fbuilding-an-image-cdn-pipeline-for-static-sites","Building an Image CDN Pipeline for Static Sites",{"path":1783,"title":1784},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fgenerating-open-graph-images-at-build-time","Generating Open Graph Images at Build Time",{"path":1786,"title":1787},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro","Image Optimization Pipelines in Astro",{"path":1789,"title":1790},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Flazy-loading-images-without-hurting-lcp","Lazy-Loading Images Without Hurting LCP",{"path":1792,"title":1793},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Foptimizing-webp-images-in-hugo-without-plugins","Optimizing WebP Images in Hugo Without Plugins",{"path":1795,"title":1796},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fresponsive-images-with-srcset-in-eleventy","Responsive Images with srcset in Eleventy",{"path":1798,"title":1799},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fserving-avif-with-fallbacks-on-static-sites","Serving AVIF With Fallbacks on Static Sites",{"path":1801,"title":1802},"\u002Fperformance-optimization-core-web-vitals-for-ssgs","Core Web Vitals Optimization for SSGs",{"path":1804,"title":1805},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fastro-islands-vs-full-hydration-performance","Astro Islands vs Full Hydration Performance",{"path":1807,"title":1808},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fdeferring-hydration-with-client-visible-in-astro","Deferring Hydration with client:visible in Astro",{"path":1810,"title":1811},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fhow-to-reduce-bundle-size-in-eleventy-builds","How to Reduce Bundle Size in Eleventy Builds",{"path":1813,"title":1814},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering","JavaScript Hydration & Partial Rendering",{"path":1816,"title":1817},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fmeasuring-inp-on-static-sites-with-real-user-monitoring","Measuring INP on Static Sites with RUM",{"path":1819,"title":1820},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Freplacing-react-islands-with-web-components","Replacing React Islands with Web Components",{"path":1822,"title":1823},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Feliminating-render-blocking-css-on-static-sites","Eliminating Render-Blocking CSS on Static Sites",{"path":1825,"title":1826},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Ffixing-lcp-on-text-heavy-documentation-pages","Fixing LCP on Text-Heavy Documentation Pages",{"path":1828,"title":1829},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites","Largest Contentful Paint Optimization for Static Sites",{"path":1831,"title":1365},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Fmeasuring-lcp-subparts-with-devtools",{"path":1833,"title":1505},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Foptimizing-lcp-on-astro-with-priority-hints",{"path":1835,"title":605},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Freducing-lcp-from-hero-images-on-static-sites",{"path":1837,"title":1838},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fcomparing-lab-and-field-data-with-crux","Comparing Lab and Field Data with CrUX",{"path":1840,"title":1841},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci","Performance Budgets and Lighthouse CI",{"path":1843,"title":1844},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Freducing-lighthouse-score-variance-in-ci","Reducing Lighthouse Score Variance in CI",{"path":1846,"title":1847},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Frunning-webpagetest-scripts-against-preview-deploys","Running WebPageTest Scripts Against Preview Deploys",{"path":1849,"title":63},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fsetting-up-lighthouse-ci-for-a-static-site",{"path":1851,"title":1852},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Ftracking-bundle-size-per-pull-request","Tracking Bundle Size per Pull Request",{"path":1854,"title":1512},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fwriting-a-performance-budget-that-fails-builds",{"path":1555,"title":5},{"path":1857,"title":28},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed",{"path":1859,"title":1860},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Finstant-navigation-with-speculation-rules","Instant Navigation with Speculation Rules",{"path":1862,"title":1498},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fpreconnect-vs-dns-prefetch-on-static-sites",{"path":1864,"title":1865},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fprefetching-links-in-astro","Prefetching Links in Astro",{"path":1867,"title":1868},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fview-transitions-on-multi-page-static-sites","View Transitions on Multi-Page Static Sites",{"path":1870,"title":1871},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Fauditing-third-party-scripts-with-lighthouse","Auditing Third-Party Scripts With Lighthouse",{"path":1873,"title":1874},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites","Third-Party Script Performance on Static Sites",{"path":1876,"title":1877},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Flazy-loading-youtube-embeds-on-static-sites","Lazy-Loading YouTube Embeds on Static Sites",{"path":1879,"title":1880},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Floading-google-tag-manager-without-hurting-inp","Loading Google Tag Manager Without Hurting INP",{"path":1882,"title":1883},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Frunning-third-party-scripts-in-a-web-worker-with-partytown","Running Third-Party Scripts in a Web Worker with Partytown",{"path":1885,"title":1886},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Fself-hosting-analytics-to-cut-third-party-requests","Self-Hosting Analytics to Cut Third-Party Requests",{"path":1888,"title":1889},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fautomating-eleventy-deployments-with-cloudflare-pages","Automating Eleventy Deployments on Cloudflare Pages",{"path":1891,"title":1892},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fconfiguring-redirects-on-cloudflare-pages","Configuring Redirects on Cloudflare Pages",{"path":1894,"title":1895},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fcustom-domains-and-tls-on-cloudflare-pages","Custom Domains and TLS on Cloudflare Pages",{"path":1897,"title":1898},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fdeploying-hugo-to-cloudflare-pages-and-workers","Deploying Hugo to Cloudflare Pages and Workers",{"path":1900,"title":1901},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup","Cloudflare Pages Edge Caching Setup",{"path":1903,"title":1904},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fmigrating-from-cloudflare-pages-to-workers-static-assets","Migrating from Cloudflare Pages to Workers Static Assets",{"path":1906,"title":1907},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fchecking-links-in-pull-requests","Checking Links in Pull Requests",{"path":1909,"title":1910},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fdocs-as-code-review-workflow-for-writers","Docs-as-Code Review Workflow for Writers",{"path":1912,"title":1913},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Feditorial-checks-with-vale-in-ci","Editorial Checks with Vale in CI",{"path":1915,"title":1916},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams","Content Workflows for Documentation Teams",{"path":1918,"title":1919},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fscheduling-content-publication-with-cron-triggered-builds","Scheduling Content Publication With Cron-Triggered Builds",{"path":1921,"title":1922},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fwiring-a-headless-cms-to-a-static-build","Wiring a Headless CMS to a Static Build",{"path":1924,"title":1925},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fbuilding-astro-sites-with-github-actions","Building Astro Sites with GitHub Actions",{"path":1927,"title":1928},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fcaching-node-modules-in-github-actions-for-faster-ssg-builds","Caching node_modules in GitHub Actions",{"path":1930,"title":1931},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fdeploying-to-github-pages-with-actions","Deploying to GitHub Pages with Actions",{"path":1933,"title":1934},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fdeploying-to-multiple-environments-from-one-workflow","Deploying to Multiple Environments From One Workflow",{"path":1936,"title":1937},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fhow-to-set-up-github-actions-for-hugo-deployments","GitHub Actions for Hugo Deployments",{"path":1939,"title":1940},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds","GitHub Actions for Automated SSG Builds",{"path":1942,"title":1943},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fmatrix-builds-for-multi-site-monorepos","Matrix Builds for Multi-Site Monorepos",{"path":1945,"title":1946},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fcaching-hugo-builds-in-github-actions","Caching Hugo Builds in GitHub Actions",{"path":1948,"title":1949},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fenabling-incremental-builds-in-eleventy","Enabling Incremental Builds in Eleventy",{"path":1951,"title":1952},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fincremental-builds-in-astro-with-the-content-layer","Incremental Builds in Astro with the Content Layer",{"path":1954,"title":1955},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs","Incremental Builds and Build Caching for SSGs",{"path":1957,"title":1958},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fmeasuring-build-time-regressions-in-ci","Measuring Build-Time Regressions in CI",{"path":1960,"title":1961},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fremote-caching-with-turborepo-for-ssg-monorepos","Remote Caching with Turborepo for SSG Monorepos",{"path":1963,"title":1964},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fsharing-build-cache-across-ci-runners","Sharing Build Cache Across CI Runners",{"path":1966,"title":1967},"\u002Fproduction-ready-deployment-cicd-workflows","Production-Ready Deployment & CI\u002FCD for SSGs",{"path":1969,"title":1970},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Falerting-on-cache-hit-ratio-drops","Alerting on Cache Hit Ratio Drops",{"path":1972,"title":1973},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fbuilding-a-core-web-vitals-dashboard-from-rum-data","Building a Core Web Vitals Dashboard from RUM Data",{"path":1975,"title":1976},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fcrawling-for-broken-links-on-a-schedule","Crawling for Broken Links on a Schedule",{"path":1978,"title":1979},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production","Monitoring Static Sites in Production",{"path":1981,"title":1982},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Flogging-404s-at-the-edge","Logging 404s at the Edge",{"path":1984,"title":1985},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fuptime-and-synthetic-checks-for-static-sites","Uptime and Synthetic Checks for Static Sites",{"path":1987,"title":1988},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fconfiguring-vercel-for-hugo-and-eleventy","Configuring Vercel for Hugo and Eleventy",{"path":1990,"title":1991},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies","Netlify vs Vercel Deployment Strategies",{"path":1993,"title":1994},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fnetlify-build-hooks-for-content-updates","Netlify Build Hooks for Content Updates",{"path":1996,"title":1997},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fnetlify-redirects-and-rewrites-for-static-sites","Netlify Redirects and Rewrites for Static Sites",{"path":1999,"title":2000},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fsetting-up-deploy-previews-on-netlify-for-every-pull-request","Netlify Deploy Previews for Every Pull Request",{"path":2002,"title":2003},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fvercel-isr-vs-static-generation-for-ssgs","Vercel ISR vs Static Generation for SSGs",{"path":2005,"title":2006},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fautomating-preview-deploy-pipelines-with-github-actions","Automating Preview Deploy Pipelines with GitHub Actions",{"path":2008,"title":2009},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fcleaning-up-stale-preview-deployments","Cleaning Up Stale Preview Deployments",{"path":2011,"title":2012},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests","Preview Environments for Pull Requests",{"path":2014,"title":2015},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpassword-protecting-preview-deployments","Password-Protecting Preview Deployments",{"path":2017,"title":2018},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpreviewing-headless-cms-drafts","Previewing Headless CMS Drafts",{"path":2020,"title":2021},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fvisual-regression-testing-on-preview-deploys","Visual Regression Testing on Preview Deploys",{"path":2023,"title":2024},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fatomic-deploys-vs-incremental-uploads","Atomic Deploys vs Incremental Uploads",{"path":2026,"title":2027},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fcanary-releases-for-static-sites","Canary Releases for Static Sites",{"path":2029,"title":2030},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Ffeature-flags-on-static-sites","Feature Flags on Static Sites",{"path":2032,"title":2033},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites","Rollbacks and Deploy Safety for Static Sites",{"path":2035,"title":2036},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Frolling-back-a-bad-static-deploy-in-under-a-minute","Rolling Back a Bad Static Deploy in Under a Minute",{"path":2038,"title":2039},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Frunning-smoke-tests-against-a-preview-url","Running Smoke Tests Against a Preview URL",{"path":2041,"title":2042},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fauditing-npm-dependencies-in-ssg-pipelines","Auditing npm Dependencies in SSG Pipelines",{"path":2044,"title":2045},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fenabling-hsts-and-preload-safely","Enabling HSTS and Preload Safely",{"path":2047,"title":2048},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fhash-based-csp-for-inline-scripts-in-astro","Hash-Based CSP for Inline Scripts in Astro",{"path":2050,"title":2051},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites","Security Headers and Hardening for Static Sites",{"path":2053,"title":2054},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecuring-deploy-credentials-with-github-oidc","Securing Deploy Credentials with GitHub OIDC",{"path":2056,"title":2057},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsubresource-integrity-for-third-party-assets","Subresource Integrity for Third-Party Assets",{"path":2059,"title":2060},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fwriting-a-content-security-policy-for-a-static-site","Writing a Content Security Policy for a Static Site",{"path":2062,"title":2063},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fclean-urls-and-trailing-slashes-on-s3","Clean URLs and Trailing Slashes on S3",{"path":2065,"title":2066},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fcloudfront-functions-for-redirects","CloudFront Functions for Redirects",{"path":2068,"title":2069},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fdeploying-a-static-site-to-s3-and-cloudfront","Deploying a Static Site to S3 and CloudFront",{"path":2071,"title":2072},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites","Self-Hosting Static Sites on S3, Nginx and Caddy",{"path":2074,"title":2075},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-caddy","Serving a Static Site with Caddy",{"path":2077,"title":2078},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-nginx","Serving a Static Site with Nginx",{"path":2080,"title":2081},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fzero-downtime-deploys-with-symlink-swaps","Zero-Downtime Deploys with Symlink Swaps",{"path":2083,"title":2084},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fadding-a-contact-form-with-cloudflare-workers","Adding a Contact Form with Cloudflare Workers",{"path":2086,"title":2087},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fhandling-form-submissions-on-a-static-site","Handling Form Submissions on a Static Site",{"path":2089,"title":2090},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites","Serverless Functions for Static Sites",{"path":2092,"title":2093},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fnetlify-functions-vs-cloudflare-workers","Netlify Functions vs Cloudflare Workers",{"path":2095,"title":2096},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fprotecting-a-static-site-behind-authentication","Protecting a Static Site Behind Authentication",{"path":2098,"title":2099},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fproxying-third-party-apis-from-an-edge-function","Proxying Third-Party APIs from an Edge Function",1789722847845]