[{"data":1,"prerenderedAt":1925},["ShallowReactive",2],{"page:\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed":3,"all-docs-nav":1387},{"id":4,"title":5,"body":6,"breadcrumb":1364,"dateModified":1371,"datePublished":1371,"description":1372,"extension":1373,"faq":1374,"meta":1380,"navigation":1381,"path":1382,"seo":1383,"slug":12,"stem":1384,"type":1385,"__hash__":1386},"content\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Findex.md","Resource Hints and Navigation Speed",{"type":7,"value":8,"toc":1340},"minimark",[9,13,25,61,214,219,222,225,229,238,308,325,329,334,450,464,472,577,581,588,596,679,694,766,770,773,824,832,836,839,854,871,875,889,911,915,918,948,952,955,1026,1029,1033,1052,1056,1076,1080,1086,1164,1167,1171,1222,1226,1245,1249,1254,1257,1261,1264,1268,1271,1275,1278,1282,1285,1289,1336],[10,11,5],"h1",{"id":12},"resource-hints-and-navigation-speed",[14,15,16,17,21,22,24],"p",{},"A static page's HTML arrives fast — it is a file on a CDN edge. What happens next decides how fast the page feels: the browser discovers the stylesheet, then the font the stylesheet references, then the hero image the CSS lays out, each one a round trip after the last. And when the reader clicks a link, the whole sequence starts again from nothing. Resource hints and navigation APIs attack both problems: they let you tell the browser what it will need ",[18,19,20],"em",{},"before"," it discovers it, and they let the next page start loading ",[18,23,20],{}," the click.",[14,26,27,28,32,33,32,36,32,39,32,42,45,46,49,50,55,56,60],{},"This topic covers the hints that matter for static sites — ",[29,30,31],"code",{},"preconnect",", ",[29,34,35],{},"dns-prefetch",[29,37,38],{},"preload",[29,40,41],{},"modulepreload",[29,43,44],{},"prefetch"," and ",[29,47,48],{},"fetchpriority"," — the Speculation Rules API for prerendering likely next pages, and cross-document view transitions that make multi-page navigation feel like an app. It sits inside ",[51,52,54],"a",{"href":53},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002F","Performance Optimization & Core Web Vitals for SSGs",", next to the LCP work in ",[51,57,59],{"href":58},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002F","Largest Contentful Paint Optimization for Static Sites",".",[62,63,64,210],"figure",{},[65,66,73,74,73,78,73,82,73,89],"svg",{"viewBox":67,"role":68,"ariaLabelledBy":69,"xmlns":72},"0 0 780 300","img",[70,71],"rhn-map-title","rhn-map-desc","http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","\n  ",[75,76,77],"title",{"id":70},"Which hint acts on which part of the load",[79,80,81],"desc",{"id":71},"A timeline split into the current page and the next page. For the current page, dns-prefetch and preconnect warm connections to other origins, preload and fetchpriority raise the priority of late-discovered critical resources. For the next page, prefetch downloads its resources at idle priority, speculation rules prerender the whole page, and view transitions animate the swap.",[83,84],"rect",{"x":85,"y":85,"width":86,"height":87,"fill":88},"0","780","300","#ffffff",[90,91,93,94,93,102,93,112,93,118,93,126,93,131,93,137,93,140,93,143,93,146,93,149,93,152,93,156,93,158,93,160,93,163,93,167,93,171,93,175,93,179,93,181,93,184,93,186,93,189,93,192,93,195,93,205,73],"g",{"style":92},"font-family:system-ui, sans-serif;font-size:12px","\n    ",[95,96,101],"text",{"x":97,"y":98,"fill":99,"style":100},"390","28","#1f2937","font-size:16px;font-weight:700;text-anchor:middle","Hints for this page, hints for the next one",[83,103],{"x":104,"y":105,"width":106,"height":107,"rx":108,"fill":109,"opacity":110,"stroke":109,"style":111},"30","50","400","200","12","#1982c4","0.08","stroke-width:1.5px",[95,113,117],{"x":114,"y":115,"fill":99,"style":116},"230","76","font-size:14px;font-weight:700;text-anchor:middle","Current page load",[83,119],{"x":105,"y":120,"width":121,"height":122,"rx":123,"fill":124,"stroke":125,"style":111},"94","170","40","8","#f8fafc","#d9e2ef",[95,127,35],{"x":128,"y":129,"fill":99,"style":130},"135","112","font-weight:700;text-anchor:middle",[95,132,136],{"x":128,"y":133,"fill":134,"style":135},"126","#556071","font-size:11px;text-anchor:middle","resolve early",[83,138],{"x":139,"y":120,"width":121,"height":122,"rx":123,"fill":124,"stroke":125,"style":111},"240",[95,141,31],{"x":142,"y":129,"fill":99,"style":130},"325",[95,144,145],{"x":142,"y":133,"fill":134,"style":135},"DNS + TCP + TLS early",[83,147],{"x":105,"y":148,"width":121,"height":122,"rx":123,"fill":124,"stroke":125,"style":111},"150",[95,150,38],{"x":128,"y":151,"fill":99,"style":130},"168",[95,153,155],{"x":128,"y":154,"fill":134,"style":135},"182","late-found critical file",[83,157],{"x":139,"y":148,"width":121,"height":122,"rx":123,"fill":124,"stroke":125,"style":111},[95,159,48],{"x":142,"y":151,"fill":99,"style":130},[95,161,162],{"x":142,"y":154,"fill":134,"style":135},"raise the LCP image",[95,164,166],{"x":114,"y":165,"fill":134,"style":135},"226","goal: shorter LCP",[83,168],{"x":169,"y":105,"width":87,"height":107,"rx":108,"fill":170,"opacity":110,"stroke":170,"style":111},"450","#6a4c93",[95,172,174],{"x":173,"y":115,"fill":99,"style":116},"600","Next navigation",[83,176],{"x":177,"y":120,"width":178,"height":122,"rx":123,"fill":124,"stroke":125,"style":111},"470","260",[95,180,44],{"x":173,"y":129,"fill":99,"style":130},[95,182,183],{"x":173,"y":133,"fill":134,"style":135},"idle-priority download",[83,185],{"x":177,"y":148,"width":178,"height":122,"rx":123,"fill":124,"stroke":125,"style":111},[95,187,188],{"x":173,"y":151,"fill":99,"style":130},"speculation rules",[95,190,191],{"x":173,"y":154,"fill":134,"style":135},"prerender whole page",[95,193,194],{"x":173,"y":165,"fill":134,"style":135},"goal: next click near 0 ms",[83,196],{"x":104,"y":197,"width":198,"height":199,"rx":200,"fill":201,"opacity":202,"stroke":203,"style":204},"262","720","26","6","#8ac926","0.14","#5a8a16","stroke-width:1px",[95,206,209],{"x":97,"y":207,"fill":99,"style":208},"280","text-anchor:middle","view transitions: animate the swap between pages without a client-side router",[211,212,213],"figcaption",{},"Hints on the left shorten this page's critical path; everything on the right is spent on making the next click cheap.",[215,216,218],"h2",{"id":217},"why-static-sites-benefit-more-than-most","Why Static Sites Benefit More Than Most",[14,220,221],{},"Three properties make hints unusually effective on static sites. First, the HTML is known at build time, so the generator can compute exactly which font, image and stylesheet each page needs and emit precise hints — no guessing at runtime. Second, pages have no server-side side effects, so prerendering a page the reader never visits costs only bandwidth; nothing is logged, charged or mutated. Third, most static sites are multi-page apps, where every navigation is a full document load, so the gap between \"click\" and \"painted\" is the largest cost readers pay repeatedly — and the one speculation rules remove.",[14,223,224],{},"The flip side is that static generators make it easy to emit hints everywhere. A layout that preloads four fonts, two stylesheets and the logo on every page turns hints into noise that competes with the one resource each page actually needs first. The discipline is to hint little and precisely.",[215,226,228],{"id":227},"connection-hints-preconnect-and-dns-prefetch","Connection Hints: preconnect and dns-prefetch",[14,230,231,232,234,235,237],{},"A request to a new origin needs DNS resolution, a TCP connection and a TLS handshake before the first byte — typically 100–300 ms on mobile networks, more for distant servers. ",[29,233,31],{}," does that work early for an origin you know the page will use; ",[29,236,35],{}," does only the DNS step and is cheaper.",[239,240,245],"pre",{"className":241,"code":242,"language":243,"meta":244,"style":244},"language-html shiki shiki-themes github-light github-dark","\u003Clink rel=\"preconnect\" href=\"https:\u002F\u002Fimages.example-cdn.com\" crossorigin>\n\u003Clink rel=\"dns-prefetch\" href=\"https:\u002F\u002Fplausible.io\">\n","html","",[29,246,247,285],{"__ignoreMap":244},[248,249,252,256,260,264,267,271,274,276,279,282],"span",{"class":250,"line":251},"line",1,[248,253,255],{"class":254},"sVt8B","\u003C",[248,257,259],{"class":258},"s9eBZ","link",[248,261,263],{"class":262},"sScJk"," rel",[248,265,266],{"class":254},"=",[248,268,270],{"class":269},"sZZnC","\"preconnect\"",[248,272,273],{"class":262}," href",[248,275,266],{"class":254},[248,277,278],{"class":269},"\"https:\u002F\u002Fimages.example-cdn.com\"",[248,280,281],{"class":262}," crossorigin",[248,283,284],{"class":254},">\n",[248,286,288,290,292,294,296,299,301,303,306],{"class":250,"line":287},2,[248,289,255],{"class":254},[248,291,259],{"class":258},[248,293,263],{"class":262},[248,295,266],{"class":254},[248,297,298],{"class":269},"\"dns-prefetch\"",[248,300,273],{"class":262},[248,302,266],{"class":254},[248,304,305],{"class":269},"\"https:\u002F\u002Fplausible.io\"",[248,307,284],{"class":254},[14,309,310,311,313,314,316,317,319,320,324],{},"On a static site that self-hosts fonts and scripts, most critical resources are same-origin and need no connection hint at all. The typical legitimate use is an image CDN serving the LCP image, which should get a ",[29,312,31],{},"; analytics and other late, non-critical third parties get at most a ",[29,315,35],{},". Measured on a blog with an external image CDN, adding ",[29,318,31],{}," cut LCP by 140 ms on simulated 4G; adding preconnects for three more origins used later in the page added 30 ms back, because the extra handshakes competed for the radio. ",[51,321,323],{"href":322},"\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"," has the full measurements.",[215,326,328],{"id":327},"priority-hints-preload-modulepreload-and-fetchpriority","Priority Hints: preload, modulepreload and fetchpriority",[14,330,331,333],{},[29,332,38],{}," tells the browser to fetch a resource immediately at high priority, before the parser would discover it. It is valuable for exactly one class of resource: something critical that is discovered late. On static sites that usually means a web font referenced from CSS, a background-image hero set in CSS, or the entry module of a JavaScript island.",[239,335,337],{"className":241,"code":336,"language":243,"meta":244,"style":244},"\u003Clink rel=\"preload\" href=\"\u002Ffonts\u002Finter-var-latin.woff2\" as=\"font\" type=\"font\u002Fwoff2\" crossorigin>\n\u003Clink rel=\"modulepreload\" href=\"\u002F_astro\u002FSearch.a1b2c3.js\">\n\u003Cimg src=\"\u002Fimg\u002Fhero-1200.avif\" fetchpriority=\"high\" width=\"1200\" height=\"630\" alt=\"…\">\n",[29,338,339,379,401],{"__ignoreMap":244},[248,340,341,343,345,347,349,352,354,356,359,362,364,367,370,372,375,377],{"class":250,"line":251},[248,342,255],{"class":254},[248,344,259],{"class":258},[248,346,263],{"class":262},[248,348,266],{"class":254},[248,350,351],{"class":269},"\"preload\"",[248,353,273],{"class":262},[248,355,266],{"class":254},[248,357,358],{"class":269},"\"\u002Ffonts\u002Finter-var-latin.woff2\"",[248,360,361],{"class":262}," as",[248,363,266],{"class":254},[248,365,366],{"class":269},"\"font\"",[248,368,369],{"class":262}," type",[248,371,266],{"class":254},[248,373,374],{"class":269},"\"font\u002Fwoff2\"",[248,376,281],{"class":262},[248,378,284],{"class":254},[248,380,381,383,385,387,389,392,394,396,399],{"class":250,"line":287},[248,382,255],{"class":254},[248,384,259],{"class":258},[248,386,263],{"class":262},[248,388,266],{"class":254},[248,390,391],{"class":269},"\"modulepreload\"",[248,393,273],{"class":262},[248,395,266],{"class":254},[248,397,398],{"class":269},"\"\u002F_astro\u002FSearch.a1b2c3.js\"",[248,400,284],{"class":254},[248,402,404,406,408,411,413,416,419,421,424,427,429,432,435,437,440,443,445,448],{"class":250,"line":403},3,[248,405,255],{"class":254},[248,407,68],{"class":258},[248,409,410],{"class":262}," src",[248,412,266],{"class":254},[248,414,415],{"class":269},"\"\u002Fimg\u002Fhero-1200.avif\"",[248,417,418],{"class":262}," fetchpriority",[248,420,266],{"class":254},[248,422,423],{"class":269},"\"high\"",[248,425,426],{"class":262}," width",[248,428,266],{"class":254},[248,430,431],{"class":269},"\"1200\"",[248,433,434],{"class":262}," height",[248,436,266],{"class":254},[248,438,439],{"class":269},"\"630\"",[248,441,442],{"class":262}," alt",[248,444,266],{"class":254},[248,446,447],{"class":269},"\"…\"",[248,449,284],{"class":254},[14,451,452,455,456,459,460,60],{},[29,453,454],{},"fetchpriority=\"high\""," on the LCP ",[29,457,458],{},"\u003Cimg>"," is often better than a preload: the image is already in the HTML, so it is discovered early, but browsers initially load images at low priority until layout confirms they are in the viewport. Raising the priority removed 300–500 ms of that delay on the hero templates measured in ",[51,461,463],{"href":462},"\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",[14,465,466,467,471],{},"The failure mode is excess. Every preload competes with every other high-priority request. A page that preloads six resources effectively preloads none, and preloads for resources the page never uses waste bandwidth outright. ",[51,468,470],{"href":469},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads\u002F","Auditing Unused Preloads"," shows how to find and remove them across a whole site.",[62,473,474,574],{},[65,475,73,480,73,483,73,486,73,489],{"viewBox":476,"role":68,"ariaLabelledBy":477,"xmlns":72},"0 0 780 290",[478,479],"rhn-pre-title","rhn-pre-desc",[75,481,482],{"id":478},"Waterfall with and without a font preload",[79,484,485],{"id":479},"Two waterfalls. Without a preload, the browser fetches HTML, then CSS, then discovers the font inside the CSS and fetches it last, so text renders at about 1.4 seconds. With a preload, the font request starts alongside the CSS right after the HTML, and text renders at about 0.9 seconds.",[83,487],{"x":85,"y":85,"width":86,"height":488,"fill":88},"290",[90,490,93,491,93,494,93,499,93,504,93,510,93,513,93,516,93,520,93,526,93,533,93,539,93,542,93,545,93,548,93,551,93,554,93,557,93,560,93,565,93,570,73],{"style":92},[95,492,493],{"x":97,"y":98,"fill":99,"style":100},"A preload moves one late discovery to the front",[95,495,498],{"x":104,"y":496,"fill":99,"style":497},"62","font-weight:700","Without preload",[95,500,503],{"x":104,"y":501,"fill":134,"style":502},"88","font-size:11px","HTML",[83,505],{"x":506,"y":115,"width":506,"height":507,"rx":508,"fill":109,"opacity":509,"stroke":109,"style":204},"120","16","3","0.3",[95,511,512],{"x":104,"y":129,"fill":134,"style":502},"CSS",[83,514],{"x":139,"y":515,"width":148,"height":507,"rx":508,"fill":170,"opacity":509,"stroke":170,"style":204},"100",[95,517,519],{"x":104,"y":518,"fill":134,"style":502},"136","font",[83,521],{"x":97,"y":522,"width":107,"height":507,"rx":508,"fill":523,"opacity":524,"stroke":525,"style":204},"124","#ffca3a","0.45","#a97b00",[250,527],{"x1":528,"y1":529,"x2":528,"y2":530,"stroke":531,"style":532},"590","70","146","#d83b41","stroke-width:2px",[95,534,538],{"x":535,"y":518,"fill":536,"style":537},"598","#b32b30","font-size:11px;font-weight:700","text 1.4 s",[95,540,541],{"x":104,"y":154,"fill":99,"style":497},"With preload",[95,543,503],{"x":104,"y":544,"fill":134,"style":502},"208",[83,546],{"x":506,"y":547,"width":506,"height":507,"rx":508,"fill":109,"opacity":509,"stroke":109,"style":204},"196",[95,549,512],{"x":104,"y":550,"fill":134,"style":502},"232",[83,552],{"x":139,"y":553,"width":148,"height":507,"rx":508,"fill":170,"opacity":509,"stroke":170,"style":204},"220",[95,555,519],{"x":104,"y":556,"fill":134,"style":502},"256",[83,558],{"x":139,"y":559,"width":107,"height":507,"rx":508,"fill":523,"opacity":524,"stroke":525,"style":204},"244",[250,561],{"x1":562,"y1":563,"x2":562,"y2":564,"stroke":203,"style":532},"440","190","266",[95,566,569],{"x":567,"y":556,"fill":568,"style":537},"448","#3f6410","text 0.9 s",[95,571,573],{"x":97,"y":572,"fill":134,"style":135},"284","Chrome DevTools, simulated fast 4G, self-hosted variable font 48 KB",[211,575,576],{},"The saving is one round trip: the font no longer waits for the CSS to arrive and be parsed.",[215,578,580],{"id":579},"next-page-hints-prefetch-and-speculation-rules","Next-Page Hints: prefetch and Speculation Rules",[14,582,583,584,587],{},"For navigation, ",[29,585,586],{},"\u003Clink rel=\"prefetch\">"," downloads a URL at idle priority into the HTTP cache so the next page's HTML (and optionally its assets) is local when the reader clicks. It is widely supported, cheap, and a good default for \"the obvious next page\" — the next article in a series, the first result of a list.",[14,589,590,591,595],{},"The Speculation Rules API goes further: it can ",[592,593,594],"strong",{},"prerender"," the next page entirely — fetch it, run its scripts, lay it out and paint it in a hidden tab — so that activation on click is near-instant. On static pages with no side effects it is the single most dramatic navigation improvement available.",[239,597,599],{"className":241,"code":598,"language":243,"meta":244,"style":244},"\u003Cscript type=\"speculationrules\">\n{\n  \"prerender\": [{\n    \"where\": { \"and\": [\n      { \"href_matches\": \"\u002F*\" },\n      { \"not\": { \"selector_matches\": \"[rel~=nofollow], [data-no-prerender]\" } }\n    ]},\n    \"eagerness\": \"moderate\"\n  }]\n}\n\u003C\u002Fscript>\n",[29,600,601,617,622,627,633,639,645,651,657,663,669],{"__ignoreMap":244},[248,602,603,605,608,610,612,615],{"class":250,"line":251},[248,604,255],{"class":254},[248,606,607],{"class":258},"script",[248,609,369],{"class":262},[248,611,266],{"class":254},[248,613,614],{"class":269},"\"speculationrules\"",[248,616,284],{"class":254},[248,618,619],{"class":250,"line":287},[248,620,621],{"class":254},"{\n",[248,623,624],{"class":250,"line":403},[248,625,626],{"class":254},"  \"prerender\": [{\n",[248,628,630],{"class":250,"line":629},4,[248,631,632],{"class":254},"    \"where\": { \"and\": [\n",[248,634,636],{"class":250,"line":635},5,[248,637,638],{"class":254},"      { \"href_matches\": \"\u002F*\" },\n",[248,640,642],{"class":250,"line":641},6,[248,643,644],{"class":254},"      { \"not\": { \"selector_matches\": \"[rel~=nofollow], [data-no-prerender]\" } }\n",[248,646,648],{"class":250,"line":647},7,[248,649,650],{"class":254},"    ]},\n",[248,652,654],{"class":250,"line":653},8,[248,655,656],{"class":254},"    \"eagerness\": \"moderate\"\n",[248,658,660],{"class":250,"line":659},9,[248,661,662],{"class":254},"  }]\n",[248,664,666],{"class":250,"line":665},10,[248,667,668],{"class":254},"}\n",[248,670,672,675,677],{"class":250,"line":671},11,[248,673,674],{"class":254},"\u003C\u002F",[248,676,607],{"class":258},[248,678,284],{"class":254},[14,680,681,684,685,689,690,60],{},[29,682,683],{},"\"eagerness\": \"moderate\""," prerenders a link after the pointer rests on it for about 200 ms (or on pointer-down on touch devices). On a docs site this made the median navigation — click to LCP of the next page — fall from 620 ms to 40 ms in Chrome, measured with RUM over two weeks. Browsers without support ignore the script. The details, including memory limits and analytics handling, are in ",[51,686,688],{"href":687},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Finstant-navigation-with-speculation-rules\u002F","Instant Navigation with Speculation Rules","; Astro's built-in equivalent is covered in ",[51,691,693],{"href":692},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fprefetching-links-in-astro\u002F","Prefetching Links in Astro",[62,695,696,763],{},[65,697,73,702,73,705,73,708,73,710],{"viewBox":698,"role":68,"ariaLabelledBy":699,"xmlns":72},"0 0 780 280",[700,701],"rhn-nav-title","rhn-nav-desc",[75,703,704],{"id":700},"Click to next-page LCP with three strategies",[79,706,707],{"id":701},"Bars of median time from click to LCP of the next page. No hints: 620 milliseconds. Prefetch on hover: 290 milliseconds. Speculation rules prerender with moderate eagerness: 40 milliseconds.",[83,709],{"x":85,"y":85,"width":86,"height":207,"fill":88},[90,711,93,712,93,715,93,718,93,722,93,729,93,734,93,738,93,742,93,747,93,751,93,755,93,760,73],{"style":92},[95,713,714],{"x":97,"y":98,"fill":99,"style":100},"Median click-to-LCP of the next page (Chrome, RUM)",[250,716],{"x1":114,"y1":717,"x2":114,"y2":553,"stroke":125,"style":111},"46",[95,719,721],{"x":122,"y":720,"fill":99,"style":497},"82","No hints",[83,723],{"x":114,"y":724,"width":725,"height":104,"rx":726,"fill":727,"opacity":728,"stroke":531,"style":204},"64","465","5","#ff595e","0.25",[95,730,733],{"x":731,"y":732,"fill":99,"style":497},"705","84","620 ms",[95,735,737],{"x":122,"y":736,"fill":99,"style":497},"142","Prefetch on hover",[83,739],{"x":114,"y":522,"width":740,"height":104,"rx":726,"fill":523,"opacity":741,"stroke":525,"style":204},"218","0.35",[95,743,746],{"x":744,"y":745,"fill":99,"style":497},"458","144","290 ms",[95,748,750],{"x":122,"y":749,"fill":99,"style":497},"202","Prerender (moderate)",[83,752],{"x":114,"y":753,"width":104,"height":104,"rx":726,"fill":201,"opacity":754,"stroke":203,"style":204},"184","0.4",[95,756,759],{"x":757,"y":758,"fill":568,"style":497},"270","204","40 ms",[95,761,762],{"x":97,"y":197,"fill":134,"style":135},"Docs site, ~140,000 navigations per strategy over two weeks, web-vitals navigationType breakdown",[211,764,765],{},"Prefetch removes the network wait; prerender also removes parsing, layout and paint, which is why it approaches zero.",[215,767,769],{"id":768},"cross-document-view-transitions","Cross-Document View Transitions",[14,771,772],{},"Single-page apps animate between routes; multi-page static sites traditionally flash white. Cross-document view transitions close that gap with CSS alone: opt in on both pages, and the browser snapshots the old page, loads the new one, and animates between them.",[239,774,778],{"className":775,"code":776,"language":777,"meta":244,"style":244},"language-css shiki shiki-themes github-light github-dark","@view-transition { navigation: auto; }\n.site-header { view-transition-name: header; }\n@media (prefers-reduced-motion: reduce) {\n  @view-transition { navigation: none; }\n}\n","css",[29,779,780,789,804,812,820],{"__ignoreMap":244},[248,781,782,786],{"class":250,"line":251},[248,783,785],{"class":784},"szBVR","@view-transition",[248,787,788],{"class":254}," { navigation: auto; }\n",[248,790,791,794,797,801],{"class":250,"line":287},[248,792,793],{"class":262},".site-header",[248,795,796],{"class":254}," { ",[248,798,800],{"class":799},"sj4cs","view-transition-name",[248,802,803],{"class":254},": header; }\n",[248,805,806,809],{"class":250,"line":403},[248,807,808],{"class":784},"@media",[248,810,811],{"class":254}," (prefers-reduced-motion: reduce) {\n",[248,813,814,817],{"class":250,"line":629},[248,815,816],{"class":784},"  @view-transition",[248,818,819],{"class":254}," { navigation: none; }\n",[248,821,822],{"class":250,"line":635},[248,823,668],{"class":254},[14,825,826,827,831],{},"Combined with speculation rules, a prerendered page plus a 200 ms cross-fade makes a static site feel like an app without shipping a router. The transition starts after the new page's first frame is ready, so it does not delay LCP. ",[51,828,830],{"href":829},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fview-transitions-on-multi-page-static-sites\u002F","View Transitions on Multi-Page Static Sites"," covers naming elements, avoiding layout shift during the animation and measuring its effect.",[215,833,835],{"id":834},"the-backforward-cache-free-instant-navigations","The Back\u002FForward Cache: Free Instant Navigations",[14,837,838],{},"The fastest navigation of all is one the browser does not have to perform. When a reader presses Back, a page stored in the back\u002Fforward cache (bfcache) is restored from memory in its exact previous state — scroll position, form input, running timers paused — with an LCP near zero. On content sites, back navigations are a large share of all navigations: 18% on the docs site measured here, higher on blogs where readers bounce between an index and articles.",[14,840,841,842,845,846,849,850,853],{},"Static sites are eligible by default, but a few common additions quietly disqualify every page. An ",[29,843,844],{},"unload"," event listener, often added by an old analytics snippet or a consent manager, blocks bfcache in most browsers. A ",[29,847,848],{},"Cache-Control: no-store"," header on HTML blocks it in Chrome. Open ",[29,851,852],{},"BroadcastChannel"," or WebSocket connections can block it too. Chrome DevTools' Application panel has a \"Back\u002Fforward cache\" test that navigates away and back and lists every blocking reason for the current page.",[14,855,856,857,859,860,862,863,866,867,870],{},"On the docs site, removing one ",[29,858,844],{}," handler from a legacy analytics script raised the share of back navigations restored from bfcache from 3% to 89%. Field LCP for back navigations fell from 540 ms to 30 ms, and because back navigations were nearly a fifth of all navigations, the site-wide p75 LCP improved by about 90 ms with no other change. Replace ",[29,861,844],{}," with ",[29,864,865],{},"pagehide"," or ",[29,868,869],{},"visibilitychange",", and check the DevTools panel after adding any third-party script.",[215,872,874],{"id":873},"hints-caching-and-repeat-visits","Hints, Caching and Repeat Visits",[14,876,877,878,880,881,884,885,60],{},"Resource hints and HTTP caching interact in ways that are easy to get wrong. A ",[29,879,38],{}," for a font that is already in the HTTP cache costs almost nothing — the browser satisfies it locally — so preloads are cheap on repeat views as long as the asset URL is stable. That is one more reason to fingerprint asset filenames and serve them with long ",[29,882,883],{},"immutable"," cache lifetimes, as described in ",[51,886,888],{"href":887},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-busting-with-content-hashed-filenames\u002F","Cache Busting with Content-Hashed Filenames",[14,890,891,892,895,896,899,900,902,903,906,907,60],{},"Prefetched and prerendered pages are more fragile. A prefetched HTML document is only reused if the eventual navigation matches the cached response; if the HTML is served with ",[29,893,894],{},"Cache-Control: no-cache"," or a short ",[29,897,898],{},"max-age"," and the prefetch happened long enough ago, the browser may revalidate or refetch. Speculation rules sidestep much of this because the prerendered page is held in memory rather than in the HTTP cache, but they are discarded after a few minutes if unused, and the browser limits how many can exist at once. For static HTML, a short ",[29,901,898],{}," of a few minutes with ",[29,904,905],{},"stale-while-revalidate"," keeps prefetches reusable without delaying content updates noticeably; the trade-offs are in ",[51,908,910],{"href":909},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fstale-while-revalidate-for-static-html\u002F","Stale-While-Revalidate for Static HTML",[215,912,914],{"id":913},"respecting-constrained-devices-and-data-saver","Respecting Constrained Devices and Data Saver",[14,916,917],{},"Next-page hints spend the reader's bandwidth on a guess. On unmetered broadband that is a good trade; on a metered mobile plan or a slow connection it may not be. Browsers already guard some of this — Chrome disables speculation rules when Data Saver or battery saver is on, and when memory is low — but explicit prefetch code you write yourself does not get those guards automatically.",[14,919,920,921,924,925,928,929,866,932,935,936,939,940,943,944,947],{},"If you add custom prefetching, check ",[29,922,923],{},"navigator.connection?.saveData"," and skip prefetches when it is true, and skip them on ",[29,926,927],{},"effectiveType"," values of ",[29,930,931],{},"2g",[29,933,934],{},"slow-2g",". Keep eagerness ",[29,937,938],{},"moderate"," rather than ",[29,941,942],{},"eager",", so that pages are prerendered on signals of intent rather than on page load. And exclude large downloads — PDFs, archives, video pages — from speculation rules with a ",[29,945,946],{},"not"," clause, because prerendering a 40 MB download page on hover is a real cost with little benefit. These guards cost a few lines and make the feature defensible to readers who pay for data.",[215,949,951],{"id":950},"emitting-hints-from-your-generator","Emitting Hints From Your Generator",[14,953,954],{},"Hints should be computed per page at build time, not hard-coded in a layout. Each generator has a natural place for that:",[956,957,958,982,992,1009],"ul",{},[959,960,961,964,965,967,968,971,972,45,974,977,978,981],"li",{},[592,962,963],{},"Astro"," emits ",[29,966,41],{}," for island entry points automatically, and its ",[29,969,970],{},"\u003CImage>"," component accepts ",[29,973,48],{},[29,975,976],{},"loading","; prefetching is a built-in option (",[29,979,980],{},"prefetch: true"," in the config).",[959,983,984,987,988,991],{},[592,985,986],{},"Eleventy"," can emit a page-specific preload from front matter (",[29,989,990],{},"preloadImage: \u002Fimg\u002Fhero.avif",") in the base layout, keeping hints next to the content that needs them.",[959,993,994,997,998,45,1001,1004,1005,1008],{},[592,995,996],{},"Hugo"," can compute the hero image with ",[29,999,1000],{},"resources.Get",[29,1002,1003],{},".Resize",", then emit ",[29,1006,1007],{},"\u003Clink rel=\"preload\" as=\"image\" imagesrcset=\"…\">"," with the exact responsive set in the page's head partial.",[959,1010,1011,1014,1015,1018,1019,1022,1023,1025],{},[592,1012,1013],{},"Next.js static export"," emits preloads for route chunks; the ",[29,1016,1017],{},"next\u002Fimage"," ",[29,1020,1021],{},"priority"," prop adds ",[29,1024,454],{}," and a preload for the LCP image.",[14,1027,1028],{},"The goal is the same everywhere: one precise hint for the page's LCP resource, one for its critical font if it is discovered late, and nothing else in the head by default.",[215,1030,1032],{"id":1031},"a-hint-budget-per-template","A Hint Budget per Template",[14,1034,1035,1036,1038,1039,1041,1042,1044,1045,45,1048,1051],{},"Because hints compete, budget them like bytes. A reasonable starting budget for a content template: at most one ",[29,1037,38],{}," for a font, at most one high-priority image, at most two ",[29,1040,31],{},"s, any number of ",[29,1043,35],{},"es for non-critical third parties, and speculation rules with moderate eagerness. Assert it in CI by parsing the built HTML: count ",[29,1046,1047],{},"rel=\"preload\"",[29,1049,1050],{},"rel=\"preconnect\""," per template and fail when a template exceeds its allowance. On one Hugo site this check caught a theme update that added preloads for all six font weights to every page — which had raised LCP by 280 ms on the text-heavy templates.",[215,1053,1055],{"id":1054},"measuring-whether-hints-help","Measuring Whether Hints Help",[14,1057,1058,1059,1062,1063,1066,1067,32,1070,32,1072,1075],{},"Hints change timing, so verify each one with numbers rather than intuition. For current-page hints, compare lab LCP with and without the hint using the median of five Lighthouse runs, and confirm in the waterfall that the hinted resource actually started earlier. For next-page hints, lab tools do not help: measure in the field. The ",[29,1060,1061],{},"web-vitals"," library reports ",[29,1064,1065],{},"navigationType"," (",[29,1068,1069],{},"navigate",[29,1071,594],{},[29,1073,1074],{},"back-forward"," and so on), so RUM data can compare LCP for prerendered navigations against normal ones directly. On the docs site above, 71% of internal navigations in Chrome were prerendered after enabling speculation rules, and those had a median LCP of 40 ms against 610 ms for the rest.",[215,1077,1079],{"id":1078},"measured-impact","Measured Impact",[14,1081,1082,1083,1085],{},"A 900-page documentation site on Eleventy applied the approach in this topic over one month: removed four unnecessary preloads per page, kept one font preload and ",[29,1084,48],{}," on hero images, added speculation rules with moderate eagerness, fixed a bfcache blocker, and enabled cross-document view transitions. Field numbers are p75 from RUM, mobile and desktop combined, over comparable four-week windows.",[1087,1088,1089,1105],"table",{},[1090,1091,1092],"thead",{},[1093,1094,1095,1099,1102],"tr",{},[1096,1097,1098],"th",{},"Measure",[1096,1100,1101],{},"Before",[1096,1103,1104],{},"After",[1106,1107,1108,1120,1131,1142,1153],"tbody",{},[1093,1109,1110,1114,1117],{},[1111,1112,1113],"td",{},"Preload and preconnect tags per page (median)",[1111,1115,1116],{},"7",[1111,1118,1119],{},"2",[1093,1121,1122,1125,1128],{},[1111,1123,1124],{},"LCP p75, first navigation",[1111,1126,1127],{},"1.9 s",[1111,1129,1130],{},"1.6 s",[1093,1132,1133,1136,1139],{},[1111,1134,1135],{},"LCP p75, internal navigations",[1111,1137,1138],{},"1.1 s",[1111,1140,1141],{},"0.3 s",[1093,1143,1144,1147,1150],{},[1111,1145,1146],{},"Back navigations restored from bfcache",[1111,1148,1149],{},"3%",[1111,1151,1152],{},"89%",[1093,1154,1155,1158,1161],{},[1111,1156,1157],{},"Pages per session",[1111,1159,1160],{},"3.4",[1111,1162,1163],{},"3.9",[14,1165,1166],{},"The pages-per-session change is the one to be careful interpreting — it coincided with other content work — but readers clearly were not deterred by faster navigation.",[215,1168,1170],{"id":1169},"common-pitfalls","Common Pitfalls",[956,1172,1173,1179,1189,1195,1204,1216],{},[959,1174,1175,1178],{},[592,1176,1177],{},"Preloading everything."," More than two or three preloads per page and they cancel each other out. Hint only late-discovered critical resources.",[959,1180,1181,1188],{},[592,1182,1183,1184,1187],{},"Forgetting ",[29,1185,1186],{},"crossorigin"," on font preloads."," Fonts load in CORS mode; without the attribute the preload is not reused and the font downloads twice.",[959,1190,1191,1194],{},[592,1192,1193],{},"Preconnecting to origins used late."," Connections close after about ten seconds idle. Preconnect only to origins needed in the first moments of the load.",[959,1196,1197,1200,1201,60],{},[592,1198,1199],{},"Prerendering with side effects."," Analytics that fire on script execution count prerendered pages the reader never sees. Defer them until ",[29,1202,1203],{},"prerenderingchange",[959,1205,1206,1018,1209,1212,1213,1215],{},[592,1207,1208],{},"Eager speculation on huge link lists.",[29,1210,1211],{},"eagerness: \"eager\""," on a page with 200 links prerenders far too much. Use ",[29,1214,938],{}," and exclude large downloads.",[959,1217,1218,1221],{},[592,1219,1220],{},"Hard-coded hints in layouts."," They drift out of date when assets change. Generate them per page at build time.",[215,1223,1225],{"id":1224},"key-takeaways","Key Takeaways",[956,1227,1228,1231,1236,1239,1242],{},[959,1229,1230],{},"Current-page hints shorten the critical path; next-page hints remove navigation latency. Use both, sparingly.",[959,1232,1233,1235],{},[29,1234,454],{}," on the LCP image and one font preload deliver most of the current-page gain.",[959,1237,1238],{},"Speculation rules with moderate eagerness cut click-to-LCP from 620 ms to 40 ms on a static docs site in Chrome.",[959,1240,1241],{},"Cross-document view transitions add app-like navigation to multi-page sites with a few lines of CSS.",[959,1243,1244],{},"Budget hints per template and verify each with the waterfall and field data.",[215,1246,1248],{"id":1247},"faq","FAQ",[1250,1251,1253],"h3",{"id":1252},"what-is-the-difference-between-preload-and-prefetch","What is the difference between preload and prefetch?",[14,1255,1256],{},"Preload fetches a resource the current page needs soon, at high priority. Prefetch fetches something a future navigation will probably need, at the lowest priority, when the browser is idle. Using preload for future pages wastes bandwidth the current page needs.",[1250,1258,1260],{"id":1259},"are-speculation-rules-safe-on-a-static-site","Are speculation rules safe on a static site?",[14,1262,1263],{},"Yes, and static sites are the ideal case. Prerendering a static page has no server-side side effects, so the main costs are bandwidth and memory. Use moderate eagerness so pages are prerendered on hover or pointer-down rather than on load.",[1250,1265,1267],{"id":1266},"how-many-preconnect-hints-should-a-page-have","How many preconnect hints should a page have?",[14,1269,1270],{},"Two or three at most, and only for origins used early in the page load. Each preconnect opens a connection that costs CPU and may be closed unused after about ten seconds.",[1250,1272,1274],{"id":1273},"do-view-transitions-slow-pages-down","Do view transitions slow pages down?",[14,1276,1277],{},"Not measurably when used for simple cross-document transitions. The transition runs after the new page has rendered its first frame, so it does not delay LCP. Keep animations short and respect prefers-reduced-motion.",[1250,1279,1281],{"id":1280},"can-resource-hints-hurt-performance","Can resource hints hurt performance?",[14,1283,1284],{},"Yes. Preloading resources that are not used, or preloading too many, competes with critical resources for bandwidth. Lighthouse flags unused preloads, and field LCP often improves when excess hints are removed.",[215,1286,1288],{"id":1287},"related","Related",[956,1290,1291,1299,1304,1309,1314,1319,1324,1331],{},[959,1292,1293,1018,1296,1298],{},[592,1294,1295],{},"Up:",[51,1297,54],{"href":53}," — where hints fit among the other levers.",[959,1300,1301,1303],{},[51,1302,323],{"href":322}," — connection hints, measured.",[959,1305,1306,1308],{},[51,1307,688],{"href":687}," — prerendering the next page.",[959,1310,1311,1313],{},[51,1312,693],{"href":692}," — the framework-native option.",[959,1315,1316,1318],{},[51,1317,830],{"href":829}," — animating navigations without a router.",[959,1320,1321,1323],{},[51,1322,470],{"href":469}," — removing hints that hurt.",[959,1325,1326,1330],{},[51,1327,1329],{"href":1328},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fpreloading-fonts-without-double-downloads\u002F","Preloading Fonts Without Double Downloads"," — the font preload done correctly.",[959,1332,1333,1335],{},[51,1334,59],{"href":58}," — the metric most hints serve.",[1337,1338,1339],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}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 .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":244,"searchDepth":287,"depth":287,"links":1341},[1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1363],{"id":217,"depth":287,"text":218},{"id":227,"depth":287,"text":228},{"id":327,"depth":287,"text":328},{"id":579,"depth":287,"text":580},{"id":768,"depth":287,"text":769},{"id":834,"depth":287,"text":835},{"id":873,"depth":287,"text":874},{"id":913,"depth":287,"text":914},{"id":950,"depth":287,"text":951},{"id":1031,"depth":287,"text":1032},{"id":1054,"depth":287,"text":1055},{"id":1078,"depth":287,"text":1079},{"id":1169,"depth":287,"text":1170},{"id":1224,"depth":287,"text":1225},{"id":1247,"depth":287,"text":1248,"children":1357},[1358,1359,1360,1361,1362],{"id":1252,"depth":403,"text":1253},{"id":1259,"depth":403,"text":1260},{"id":1266,"depth":403,"text":1267},{"id":1273,"depth":403,"text":1274},{"id":1280,"depth":403,"text":1281},{"id":1287,"depth":287,"text":1288},[1365,1368,1369],{"name":1366,"item":1367},"Home","\u002F",{"name":54,"item":53},{"name":5,"item":1370},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002F","2026-09-18","Use preconnect, preload, prefetch, speculation rules and view transitions to make static-site pages start faster and next-page clicks feel instant.","md",[1375,1376,1377,1378,1379],{"q":1253,"a":1256},{"q":1260,"a":1263},{"q":1267,"a":1270},{"q":1274,"a":1277},{"q":1281,"a":1284},{},true,"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed",{"title":5,"description":1372},"performance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Findex","guide","dOD88RD0vQAJQNCVk8nJxIIZaZBEejyESSLCsx_g6_4",[1388,1391,1394,1397,1400,1403,1406,1409,1412,1415,1418,1421,1424,1427,1430,1433,1436,1439,1442,1445,1448,1451,1454,1457,1460,1463,1466,1469,1472,1475,1478,1481,1484,1487,1490,1493,1496,1499,1502,1505,1508,1511,1514,1517,1520,1523,1526,1529,1532,1535,1538,1541,1544,1547,1550,1552,1555,1558,1561,1564,1566,1569,1572,1575,1578,1581,1584,1587,1590,1593,1596,1598,1601,1604,1607,1610,1613,1616,1619,1622,1625,1628,1631,1634,1637,1640,1643,1646,1649,1652,1654,1657,1659,1662,1665,1668,1671,1674,1677,1680,1683,1685,1686,1688,1690,1692,1694,1697,1700,1703,1706,1709,1712,1715,1718,1721,1724,1727,1730,1733,1736,1739,1742,1745,1748,1751,1754,1757,1760,1763,1766,1769,1772,1775,1778,1781,1784,1787,1790,1793,1796,1799,1802,1805,1808,1811,1814,1817,1820,1823,1826,1829,1832,1835,1838,1841,1844,1847,1850,1853,1856,1859,1862,1865,1868,1871,1874,1877,1880,1883,1886,1889,1892,1895,1898,1901,1904,1907,1910,1913,1916,1919,1922],{"path":1389,"title":1390},"\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":1392,"title":1393},"\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":1395,"title":1396},"\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":1398,"title":1399},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites","Astro vs Eleventy for Documentation Sites",{"path":1401,"title":1402},"\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":1404,"title":1405},"\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":1407,"title":1408},"\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":1410,"title":1411},"\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":1413,"title":1414},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress","Docs Frameworks: Docusaurus, Starlight and VitePress",{"path":1416,"title":1417},"\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":1419,"title":1420},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmigrating-from-mkdocs-to-starlight","Migrating from MkDocs to Starlight",{"path":1422,"title":1423},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fversioned-documentation-with-docusaurus","Versioned Documentation with Docusaurus",{"path":1425,"title":1426},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fvitepress-for-library-documentation","VitePress for Library Documentation",{"path":1428,"title":1429},"\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":1431,"title":1432},"\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":1434,"title":1435},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories","Hugo Build Times for Large Repositories",{"path":1437,"title":1438},"\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":1440,"title":1441},"\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":1443,"title":1444},"\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":1446,"title":1447},"\u002Fchoosing-the-right-static-site-generator-for-production","Choosing the Right Static Site Generator for Production",{"path":1449,"title":1450},"\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":1452,"title":1453},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem","Jekyll Plugin Ecosystem",{"path":1455,"title":1456},"\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":1458,"title":1459},"\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":1461,"title":1462},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fspeeding-up-slow-jekyll-builds","Speeding Up Slow Jekyll Builds",{"path":1464,"title":1465},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fupgrading-jekyll-and-ruby-versions-safely","Upgrading Jekyll and Ruby Versions Safely",{"path":1467,"title":1468},"\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":1470,"title":1471},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators","Migrating Between Static Site Generators",{"path":1473,"title":1474},"\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":1476,"title":1477},"\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":1479,"title":1480},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-gatsby-to-astro","Migrating from Gatsby to Astro",{"path":1482,"title":1483},"\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":1485,"title":1486},"\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":1488,"title":1489},"\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":1491,"title":1492},"\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":1494,"title":1495},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites","Next.js Static Export for Content Sites",{"path":1497,"title":1498},"\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":1500,"title":1501},"\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":1503,"title":1504},"\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":1506,"title":1507},"\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":1509,"title":1510},"\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":1512,"title":1513},"\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":1515,"title":1516},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites","Search for Static Sites",{"path":1518,"title":1519},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Findexing-hugo-sites-with-pagefind","Indexing Hugo Sites with Pagefind",{"path":1521,"title":1522},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fmultilingual-search-on-static-sites","Multilingual Search on Static Sites",{"path":1524,"title":1525},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fpagefind-vs-algolia-docsearch","Pagefind vs Algolia DocSearch",{"path":1527,"title":1528},"\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":1530,"title":1531},"\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":1533,"title":1534},"\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":1536,"title":1537},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fevaluating-ssg-accessibility-defaults","Evaluating SSG Accessibility Defaults",{"path":1539,"title":1540},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix","SSG Framework Selection Matrix",{"path":1542,"title":1543},"\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":1545,"title":1546},"\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":1548,"title":1549},"\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":1551,"title":888},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-busting-with-content-hashed-filenames",{"path":1553,"title":1554},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs","CDN Caching Rules for SSGs",{"path":1556,"title":1557},"\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":1559,"title":1560},"\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":1562,"title":1563},"\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":1565,"title":910},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fstale-while-revalidate-for-static-html",{"path":1567,"title":1568},"\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":1570,"title":1571},"\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":1573,"title":1574},"\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":1576,"title":1577},"\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":1579,"title":1580},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites","Cumulative Layout Shift Fixes for Static Sites",{"path":1582,"title":1583},"\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":1585,"title":1586},"\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":1588,"title":1589},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Ffont-display-optional-vs-swap","font-display: optional vs swap",{"path":1591,"title":1592},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites","Font Loading Strategies for Static Sites",{"path":1594,"title":1595},"\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":1597,"title":1329},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fpreloading-fonts-without-double-downloads",{"path":1599,"title":1600},"\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":1602,"title":1603},"\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":1605,"title":1606},"\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":1608,"title":1609},"\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":1611,"title":1612},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro","Image Optimization Pipelines in Astro",{"path":1614,"title":1615},"\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":1617,"title":1618},"\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":1620,"title":1621},"\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":1623,"title":1624},"\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":1626,"title":1627},"\u002Fperformance-optimization-core-web-vitals-for-ssgs","Core Web Vitals Optimization for SSGs",{"path":1629,"title":1630},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fastro-islands-vs-full-hydration-performance","Astro Islands vs Full Hydration Performance",{"path":1632,"title":1633},"\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":1635,"title":1636},"\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":1638,"title":1639},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering","JavaScript Hydration & Partial Rendering",{"path":1641,"title":1642},"\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":1644,"title":1645},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Freplacing-react-islands-with-web-components","Replacing React Islands with Web Components",{"path":1647,"title":1648},"\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":1650,"title":1651},"\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":1653,"title":59},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites",{"path":1655,"title":1656},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Fmeasuring-lcp-subparts-with-devtools","Measuring LCP Subparts with DevTools",{"path":1658,"title":463},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Foptimizing-lcp-on-astro-with-priority-hints",{"path":1660,"title":1661},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Freducing-lcp-from-hero-images-on-static-sites","Reducing LCP from Hero Images on Static Sites",{"path":1663,"title":1664},"\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":1666,"title":1667},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci","Performance Budgets and Lighthouse CI",{"path":1669,"title":1670},"\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":1672,"title":1673},"\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":1675,"title":1676},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fsetting-up-lighthouse-ci-for-a-static-site","Setting Up Lighthouse CI for a Static Site",{"path":1678,"title":1679},"\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":1681,"title":1682},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fwriting-a-performance-budget-that-fails-builds","Writing a Performance Budget That Fails Builds",{"path":1684,"title":470},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads",{"path":1382,"title":5},{"path":1687,"title":688},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Finstant-navigation-with-speculation-rules",{"path":1689,"title":323},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fpreconnect-vs-dns-prefetch-on-static-sites",{"path":1691,"title":693},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fprefetching-links-in-astro",{"path":1693,"title":830},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fview-transitions-on-multi-page-static-sites",{"path":1695,"title":1696},"\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":1698,"title":1699},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites","Third-Party Script Performance on Static Sites",{"path":1701,"title":1702},"\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":1704,"title":1705},"\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":1707,"title":1708},"\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":1710,"title":1711},"\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":1713,"title":1714},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fautomating-eleventy-deployments-with-cloudflare-pages","Automating Eleventy Deployments on Cloudflare Pages",{"path":1716,"title":1717},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fconfiguring-redirects-on-cloudflare-pages","Configuring Redirects on Cloudflare Pages",{"path":1719,"title":1720},"\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":1722,"title":1723},"\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":1725,"title":1726},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup","Cloudflare Pages Edge Caching Setup",{"path":1728,"title":1729},"\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":1731,"title":1732},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fchecking-links-in-pull-requests","Checking Links in Pull Requests",{"path":1734,"title":1735},"\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":1737,"title":1738},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Feditorial-checks-with-vale-in-ci","Editorial Checks with Vale in CI",{"path":1740,"title":1741},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams","Content Workflows for Documentation Teams",{"path":1743,"title":1744},"\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":1746,"title":1747},"\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":1749,"title":1750},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fbuilding-astro-sites-with-github-actions","Building Astro Sites with GitHub Actions",{"path":1752,"title":1753},"\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":1755,"title":1756},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fdeploying-to-github-pages-with-actions","Deploying to GitHub Pages with Actions",{"path":1758,"title":1759},"\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":1761,"title":1762},"\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":1764,"title":1765},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds","GitHub Actions for Automated SSG Builds",{"path":1767,"title":1768},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fmatrix-builds-for-multi-site-monorepos","Matrix Builds for Multi-Site Monorepos",{"path":1770,"title":1771},"\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":1773,"title":1774},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fenabling-incremental-builds-in-eleventy","Enabling Incremental Builds in Eleventy",{"path":1776,"title":1777},"\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":1779,"title":1780},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs","Incremental Builds and Build Caching for SSGs",{"path":1782,"title":1783},"\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":1785,"title":1786},"\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":1788,"title":1789},"\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":1791,"title":1792},"\u002Fproduction-ready-deployment-cicd-workflows","Production-Ready Deployment & CI\u002FCD for SSGs",{"path":1794,"title":1795},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Falerting-on-cache-hit-ratio-drops","Alerting on Cache Hit Ratio Drops",{"path":1797,"title":1798},"\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":1800,"title":1801},"\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":1803,"title":1804},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production","Monitoring Static Sites in Production",{"path":1806,"title":1807},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Flogging-404s-at-the-edge","Logging 404s at the Edge",{"path":1809,"title":1810},"\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":1812,"title":1813},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fconfiguring-vercel-for-hugo-and-eleventy","Configuring Vercel for Hugo and Eleventy",{"path":1815,"title":1816},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies","Netlify vs Vercel Deployment Strategies",{"path":1818,"title":1819},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fnetlify-build-hooks-for-content-updates","Netlify Build Hooks for Content Updates",{"path":1821,"title":1822},"\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":1824,"title":1825},"\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":1827,"title":1828},"\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":1830,"title":1831},"\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":1833,"title":1834},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fcleaning-up-stale-preview-deployments","Cleaning Up Stale Preview Deployments",{"path":1836,"title":1837},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests","Preview Environments for Pull Requests",{"path":1839,"title":1840},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpassword-protecting-preview-deployments","Password-Protecting Preview Deployments",{"path":1842,"title":1843},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpreviewing-headless-cms-drafts","Previewing Headless CMS Drafts",{"path":1845,"title":1846},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fvisual-regression-testing-on-preview-deploys","Visual Regression Testing on Preview Deploys",{"path":1848,"title":1849},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fatomic-deploys-vs-incremental-uploads","Atomic Deploys vs Incremental Uploads",{"path":1851,"title":1852},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fcanary-releases-for-static-sites","Canary Releases for Static Sites",{"path":1854,"title":1855},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Ffeature-flags-on-static-sites","Feature Flags on Static Sites",{"path":1857,"title":1858},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites","Rollbacks and Deploy Safety for Static Sites",{"path":1860,"title":1861},"\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":1863,"title":1864},"\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":1866,"title":1867},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fauditing-npm-dependencies-in-ssg-pipelines","Auditing npm Dependencies in SSG Pipelines",{"path":1869,"title":1870},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fenabling-hsts-and-preload-safely","Enabling HSTS and Preload Safely",{"path":1872,"title":1873},"\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":1875,"title":1876},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites","Security Headers and Hardening for Static Sites",{"path":1878,"title":1879},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecuring-deploy-credentials-with-github-oidc","Securing Deploy Credentials with GitHub OIDC",{"path":1881,"title":1882},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsubresource-integrity-for-third-party-assets","Subresource Integrity for Third-Party Assets",{"path":1884,"title":1885},"\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":1887,"title":1888},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fclean-urls-and-trailing-slashes-on-s3","Clean URLs and Trailing Slashes on S3",{"path":1890,"title":1891},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fcloudfront-functions-for-redirects","CloudFront Functions for Redirects",{"path":1893,"title":1894},"\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":1896,"title":1897},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites","Self-Hosting Static Sites on S3, Nginx and Caddy",{"path":1899,"title":1900},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-caddy","Serving a Static Site with Caddy",{"path":1902,"title":1903},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-nginx","Serving a Static Site with Nginx",{"path":1905,"title":1906},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fzero-downtime-deploys-with-symlink-swaps","Zero-Downtime Deploys with Symlink Swaps",{"path":1908,"title":1909},"\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":1911,"title":1912},"\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":1914,"title":1915},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites","Serverless Functions for Static Sites",{"path":1917,"title":1918},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fnetlify-functions-vs-cloudflare-workers","Netlify Functions vs Cloudflare Workers",{"path":1920,"title":1921},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fprotecting-a-static-site-behind-authentication","Protecting a Static Site Behind Authentication",{"path":1923,"title":1924},"\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",1789722846728]