[{"data":1,"prerenderedAt":2769},["ShallowReactive",2],{"page:\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization":3,"all-docs-nav":1636,"filed:\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization":2768},{"id":4,"title":5,"body":6,"breadcrumb":1613,"dateModified":1621,"datePublished":1621,"description":1622,"extension":1623,"faq":1624,"meta":1630,"navigation":698,"path":1631,"seo":1632,"slug":12,"stem":1633,"type":1634,"__hash__":1635},"content\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Findex.md","CSS and JavaScript Asset Optimization",{"type":7,"value":8,"toc":1593},"minimark",[9,13,17,36,39,213,218,226,229,263,271,342,436,440,443,451,518,637,641,652,667,821,903,907,918,930,1038,1121,1125,1140,1148,1152,1155,1169,1179,1205,1219,1222,1240,1244,1260,1263,1267,1378,1382,1432,1436,1464,1468,1473,1476,1480,1483,1487,1490,1494,1497,1501,1504,1508,1589],[10,11,5],"h1",{"id":12},"css-and-javascript-asset-optimization",[14,15,16],"p",{},"A static site's HTML arrives fast from the edge; what happens next depends on what that HTML references. A 180 KB stylesheet that blocks rendering, a framework runtime shipped to pages that do not use it, fonts and icons loaded as separate files, assets compressed at whatever level the CDN picked — each adds hundreds of milliseconds to first render on a mid-range phone, and together they are why static sites with excellent time to first byte still fail Largest Contentful Paint.",[14,18,19,20,25,26,30,31,35],{},"This guide covers the CSS and JavaScript side of that equation: making critical CSS arrive with the HTML, removing the rules nobody uses, splitting JavaScript so pages load only what they need, minifying and precompressing everything that ships, and choosing an icon strategy that does not cost a request per glyph. It sits within ",[21,22,24],"a",{"href":23},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002F","Performance Optimization & Core Web Vitals for SSGs",", next to ",[21,27,29],{"href":28},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002F","JavaScript Hydration & Partial Rendering",", which decides how much JavaScript a page needs at all, and ",[21,32,34],{"href":33},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002F","Font Loading Strategies for Static Sites",".",[14,37,38],{},"The measurements come from two sites: an Astro marketing and documentation site (410 pages, Tailwind CSS, a handful of React islands) and an Eleventy documentation site (1,300 pages, hand-written CSS, vanilla JavaScript). Lab numbers are Lighthouse 12 mobile runs (Moto G Power, slow 4G) as the median of five, field numbers are p75 from the sites' own web-vitals RUM.",[40,41,42,209],"figure",{},[43,44,51,52,51,56,51,60,51,67,51,194],"svg",{"viewBox":45,"role":46,"ariaLabelledBy":47,"xmlns":50},"0 0 760 466","img",[48,49],"asset-ov-title","asset-ov-desc","http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","\n  ",[53,54,55],"title",{"id":48},"Stages of the asset pipeline from source to browser",[57,58,59],"desc",{"id":49},"Five layers from source to browser. Source CSS and JavaScript are first reduced by removing unused rules and code. The remainder is split into critical and deferred parts. Everything is minified. Files are precompressed with brotli and zstd. Finally the browser receives a small inline critical block, cached hashed files and on-demand chunks.",[61,62],"rect",{"x":63,"y":63,"width":64,"height":65,"fill":66},"0","760","466","#ffffff",[68,69,71,72,71,82,71,89,71,95,71,98,71,104,71,107,71,112,71,115,71,121,71,129,71,135,71,140,71,146,71,150,71,154,71,158,71,162,71,166,71,170,71,174,71,178,71,182,71,186,71,190,51],"g",{"style":70},"font-family:system-ui, sans-serif;font-size:12px","\n    ",[61,73],{"x":74,"y":75,"width":76,"height":77,"rx":78,"fill":79,"stroke":80,"style":81},"40.0","60.0","440.0","57.2","8","#f8fafc","#d9e2ef","stroke-width:1.5px",[83,84],"path",{"d":85,"fill":86,"stroke":87,"style":88},"M260.0 119.2 L260.0 139.2","none","#556071","stroke-width:2px;marker-end:url(#asset-ov-arrow)",[61,90],{"x":74,"y":91,"width":76,"height":77,"rx":78,"fill":92,"opacity":93,"stroke":94,"style":81},"143.2","#ff595e","0.12","#d83b41",[83,96],{"d":97,"fill":86,"stroke":87,"style":88},"M260.0 202.4 L260.0 222.4",[61,99],{"x":74,"y":100,"width":76,"height":77,"rx":78,"fill":101,"opacity":102,"stroke":103,"style":81},"226.4","#ffca3a","0.24","#a97b00",[83,105],{"d":106,"fill":86,"stroke":87,"style":88},"M260.0 285.6 L260.0 305.6",[61,108],{"x":74,"y":109,"width":76,"height":77,"rx":78,"fill":110,"opacity":111,"stroke":110,"style":81},"309.6","#1982c4","0.14",[83,113],{"d":114,"fill":86,"stroke":87,"style":88},"M260.0 368.8 L260.0 388.8",[61,116],{"x":74,"y":117,"width":76,"height":77,"rx":78,"fill":118,"opacity":119,"stroke":120,"style":81},"392.8","#8ac926","0.2","#5a8a16",[122,123,128],"text",{"x":124,"y":125,"fill":126,"style":127},"380.0","30.0","#1f2937","font-size:16px;text-anchor:middle;font-weight:700","Where CSS and JavaScript bytes are spent",[122,130,134],{"x":131,"y":132,"fill":126,"style":133},"260.0","86.4","font-size:13px;text-anchor:middle;font-weight:700","Source CSS and JS",[122,136,139],{"x":131,"y":137,"fill":87,"style":138},"103.3","font-size:11px;text-anchor:middle","framework, components, utilities",[122,141,145],{"x":142,"y":143,"fill":87,"style":144},"504.0","92.6","font-size:11.5px;text-anchor:start","184 KB CSS and 142 KB JS before",[122,147,149],{"x":131,"y":148,"fill":126,"style":133},"169.5","Remove unused",[122,151,153],{"x":131,"y":152,"fill":87,"style":138},"186.4","purge CSS, tree-shake JS",[122,155,157],{"x":142,"y":156,"fill":87,"style":144},"175.8","largest single saving",[122,159,161],{"x":131,"y":160,"fill":126,"style":133},"252.7","Split and schedule",[122,163,165],{"x":131,"y":164,"fill":87,"style":138},"269.6","critical CSS inline, JS per route",[122,167,169],{"x":142,"y":168,"fill":87,"style":144},"259.0","controls render blocking",[122,171,173],{"x":131,"y":172,"fill":126,"style":133},"335.9","Minify",[122,175,177],{"x":131,"y":176,"fill":87,"style":138},"352.8","lightningcss, esbuild, html-minifier",[122,179,181],{"x":142,"y":180,"fill":87,"style":144},"342.2","15-30% before compression",[122,183,185],{"x":131,"y":184,"fill":126,"style":133},"419.1","Precompress",[122,187,189],{"x":131,"y":188,"fill":87,"style":138},"436.0","brotli 11 and zstd 19",[122,191,193],{"x":142,"y":192,"fill":87,"style":144},"425.4","about 17% smaller than CDN defaults",[195,196,71,197,51],"defs",{},[198,199,205,206,71],"marker",{"id":200,"viewBox":201,"refX":78,"refY":202,"markerWidth":203,"markerHeight":203,"orient":204},"asset-ov-arrow","0 0 10 10","5","7","auto-start-reverse","\n      ",[83,207],{"d":208,"fill":87},"M0 0 L10 5 L0 10 z",[210,211,212],"figcaption",{},"Each layer removes or reschedules bytes; the order matters because compression works best on output that is already small and minified.",[214,215,217],"h2",{"id":216},"critical-css-what-blocks-the-first-paint","Critical CSS: What Blocks the First Paint",[14,219,220,221,225],{},"Browsers do not paint until they have the CSS referenced in the ",[222,223,224],"code",{},"\u003Chead>",". On a fast connection a cached stylesheet costs nothing, but on a first visit over slow 4G, a render-blocking stylesheet request adds a full round trip plus transfer time before anything appears — on the Eleventy site, 610 ms of its 1.9 s First Contentful Paint.",[14,227,228],{},"There are three ways to reduce that:",[230,231,232,243,257],"ol",{},[233,234,235,239,240,242],"li",{},[236,237,238],"strong",{},"Make the stylesheet small enough to inline entirely."," Under about 15 KB compressed, inlining the whole stylesheet into each page's ",[222,241,224],{}," removes the request. The Eleventy site's CSS was 11 KB brotli-compressed after cleanup, so it inlined everything and dropped FCP to 1.3 s.",[233,244,245,248,249,252,253,256],{},[236,246,247],{},"Inline only the critical rules"," — the ones needed for above-the-fold content — and load the full stylesheet without blocking. Tools such as ",[222,250,251],{},"beasties"," (the maintained fork of ",[222,254,255],{},"critters",") compute this at build time per page.",[233,258,259,262],{},[236,260,261],{},"Split CSS by template"," so each page type links only its own rules, which Astro does automatically for component styles.",[14,264,265,266,270],{},"Inlining has a cost: the CSS is re-downloaded with every HTML page instead of being cached once. For a site where readers view many pages per session, a cached external file can win on the second page. ",[21,267,269],{"href":268},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Finlining-critical-css-on-static-sites\u002F","Inlining Critical CSS on Static Sites"," measures that trade-off.",[272,273,278],"pre",{"className":274,"code":275,"language":276,"meta":277,"style":277},"language-js shiki shiki-themes github-light github-dark","\u002F\u002F astro.config.mjs — Astro inlines small stylesheets automatically\nexport default defineConfig({\n  build: { inlineStylesheets: 'auto' },   \u002F\u002F inline CSS under vite.build.assetsInlineLimit (4 KB default)\n  vite: { build: { assetsInlineLimit: 8192 } }\n});\n","js","",[222,279,280,289,307,323,336],{"__ignoreMap":277},[281,282,285],"span",{"class":283,"line":284},"line",1,[281,286,288],{"class":287},"sJ8bj","\u002F\u002F astro.config.mjs — Astro inlines small stylesheets automatically\n",[281,290,292,296,299,303],{"class":283,"line":291},2,[281,293,295],{"class":294},"szBVR","export",[281,297,298],{"class":294}," default",[281,300,302],{"class":301},"sScJk"," defineConfig",[281,304,306],{"class":305},"sVt8B","({\n",[281,308,310,313,317,320],{"class":283,"line":309},3,[281,311,312],{"class":305},"  build: { inlineStylesheets: ",[281,314,316],{"class":315},"sZZnC","'auto'",[281,318,319],{"class":305}," },   ",[281,321,322],{"class":287},"\u002F\u002F inline CSS under vite.build.assetsInlineLimit (4 KB default)\n",[281,324,326,329,333],{"class":283,"line":325},4,[281,327,328],{"class":305},"  vite: { build: { assetsInlineLimit: ",[281,330,332],{"class":331},"sj4cs","8192",[281,334,335],{"class":305}," } }\n",[281,337,339],{"class":283,"line":338},5,[281,340,341],{"class":305},"});\n",[40,343,344,433],{},[43,345,51,350,51,353,51,356,51,359,51,426],{"viewBox":346,"role":46,"ariaLabelledBy":347,"xmlns":50},"0 0 760 166",[348,349],"asset-crit-title","asset-crit-desc",[53,351,352],{"id":348},"Timeline of first paint with external and inlined CSS",[57,354,355],{"id":349},"A timeline for the Eleventy site on a slow 4G profile. HTML arrives at 560 milliseconds. With an external stylesheet, the CSS request finishes at 1,170 milliseconds and first contentful paint happens at 1.9 seconds. With the stylesheet inlined, first contentful paint happens at 1.3 seconds, right after the HTML is parsed.",[61,357],{"x":63,"y":63,"width":64,"height":358,"fill":66},"166",[68,360,71,361,71,365,71,369,71,372,71,375,71,378,71,381,71,386,71,389,71,392,71,395,71,401,71,405,71,409,71,412,71,416,71,419,71,423,51],{"style":70},[83,362],{"d":363,"fill":86,"stroke":87,"style":364},"M30.0 99.6 L734.0 99.6","stroke-width:2px;marker-end:url(#asset-crit-arrow)",[366,367],"circle",{"cx":75,"cy":368,"r":203,"fill":110,"stroke":110,"style":81},"99.6",[366,370],{"cx":371,"cy":368,"r":203,"fill":101,"stroke":103,"style":81},"273.3",[366,373],{"cx":374,"cy":368,"r":203,"fill":118,"stroke":120,"style":81},"486.7",[366,376],{"cx":377,"cy":368,"r":203,"fill":92,"stroke":94,"style":81},"700.0",[122,379,380],{"x":124,"y":125,"fill":126,"style":127},"First visit on slow 4G, external versus inlined CSS",[122,382,385],{"x":75,"y":383,"fill":126,"style":384},"83.6","font-size:12px;text-anchor:middle;font-weight:700","HTML received",[122,387,388],{"x":371,"y":383,"fill":126,"style":384},"CSS file loaded",[122,390,391],{"x":374,"y":383,"fill":126,"style":384},"FCP inlined",[122,393,394],{"x":377,"y":383,"fill":126,"style":384},"FCP external",[122,396,400],{"x":75,"y":397,"fill":398,"style":399},"125.6","#166a9e","font-size:11.5px;text-anchor:middle;font-weight:700","560 ms",[122,402,404],{"x":75,"y":403,"fill":87,"style":138},"143.6","both variants",[122,406,408],{"x":371,"y":397,"fill":407,"style":399},"#8a6d0f","1.17 s",[122,410,411],{"x":371,"y":403,"fill":87,"style":138},"external variant",[122,413,415],{"x":374,"y":397,"fill":414,"style":399},"#3f6410","1.3 s",[122,417,418],{"x":374,"y":403,"fill":87,"style":138},"no CSS request",[122,420,422],{"x":377,"y":397,"fill":421,"style":399},"#b32b30","1.9 s",[122,424,425],{"x":377,"y":403,"fill":87,"style":138},"render blocked until CSS",[195,427,71,428,51],{},[198,429,205,431,71],{"id":430,"viewBox":201,"refX":78,"refY":202,"markerWidth":203,"markerHeight":203,"orient":204},"asset-crit-arrow",[83,432],{"d":208,"fill":87},[210,434,435],{},"Lighthouse mobile, median of five runs; the 600 ms gap is almost exactly one round trip plus the CSS transfer on the throttled profile.",[214,437,439],{"id":438},"removing-unused-css","Removing Unused CSS",[14,441,442],{},"The largest CSS saving on most sites is deletion. Utility frameworks generate classes on demand now — Tailwind 3 and 4 scan source files and emit only used utilities — but component libraries, old theme CSS and \"just in case\" stylesheets accumulate rules no page uses. The Astro site shipped 184 KB of CSS, of which Chrome DevTools' Coverage panel reported 81% unused on the home page and 76% on a typical docs page.",[14,444,445,446,450],{},"The fix depends on where the waste comes from. For Tailwind, make sure the content globs cover every template and nothing else, and remove any plugin-generated CSS you do not use. For legacy CSS, a purge step with PurgeCSS, or Lightning CSS with an unused-symbols list, removes selectors that never match the built HTML. The risk is removing classes that are added at runtime by JavaScript, which need a safelist. ",[21,447,449],{"href":448},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fpurging-unused-css-with-tailwind-and-lightningcss\u002F","Purging Unused CSS with Tailwind and Lightning CSS"," covers both.",[452,453,454,470],"table",{},[455,456,457],"thead",{},[458,459,460,464,467],"tr",{},[461,462,463],"th",{},"Measure (Astro site)",[461,465,466],{},"Before",[461,468,469],{},"After purge",[471,472,473,485,496,507],"tbody",{},[458,474,475,479,482],{},[476,477,478],"td",{},"CSS on docs pages (brotli)",[476,480,481],{},"31 KB",[476,483,484],{},"9 KB",[458,486,487,490,493],{},[476,488,489],{},"CSS on docs pages (uncompressed)",[476,491,492],{},"184 KB",[476,494,495],{},"41 KB",[458,497,498,501,504],{},[476,499,500],{},"Unused bytes (DevTools Coverage)",[476,502,503],{},"76%",[476,505,506],{},"18%",[458,508,509,512,515],{},[476,510,511],{},"LCP p75, field",[476,513,514],{},"2.4 s",[476,516,517],{},"2.1 s",[40,519,520,634],{},[43,521,51,526,51,529,51,532,51,535],{"viewBox":522,"role":46,"ariaLabelledBy":523,"xmlns":50},"0 0 760 248",[524,525],"asset-purge-title","asset-purge-desc",[53,527,528],{"id":524},"Stylesheet size before and after purging on the Astro site",[57,530,531],{"id":525},"Paired bars. Uncompressed CSS on docs pages went from 184 kilobytes to 41 kilobytes. Brotli-compressed CSS went from 31 kilobytes to 9 kilobytes. Unused share reported by DevTools Coverage went from 76 percent to 18 percent.",[61,533],{"x":63,"y":63,"width":64,"height":534,"fill":66},"248",[68,536,71,537,71,545,71,549,71,556,71,560,71,564,71,568,71,572,71,576,71,579,71,582,71,587,71,590,71,595,71,601,71,606,71,610,71,615,71,620,71,624,71,629,51],{"style":70},[61,538],{"x":164,"y":539,"width":540,"height":541,"rx":542,"fill":92,"opacity":543,"stroke":94,"style":544},"50.0","14.0","12.0","2","0.3","stroke-width:1px",[61,546],{"x":547,"y":539,"width":540,"height":541,"rx":542,"fill":118,"opacity":548,"stroke":120,"style":544},"398.4","0.4",[61,550],{"x":551,"y":552,"width":553,"height":554,"rx":555,"fill":92,"opacity":543,"stroke":94,"style":544},"230.0","82.0","471.9","16.0","3",[61,557],{"x":551,"y":558,"width":559,"height":554,"rx":555,"fill":118,"opacity":548,"stroke":120,"style":544},"102.0","105.1",[61,561],{"x":551,"y":562,"width":563,"height":554,"rx":555,"fill":92,"opacity":543,"stroke":94,"style":544},"134.0","79.5",[61,565],{"x":551,"y":566,"width":567,"height":554,"rx":555,"fill":118,"opacity":548,"stroke":120,"style":544},"154.0","23.1",[61,569],{"x":551,"y":570,"width":571,"height":554,"rx":555,"fill":92,"opacity":543,"stroke":94,"style":544},"186.0","194.9",[61,573],{"x":551,"y":574,"width":575,"height":554,"rx":555,"fill":118,"opacity":548,"stroke":120,"style":544},"206.0","46.2",[83,577],{"d":578,"fill":86,"stroke":87,"style":81},"M230.0 78.0 L230.0 228.0",[122,580,581],{"x":124,"y":125,"fill":126,"style":127},"CSS weight before and after removing unused rules",[122,583,586],{"x":584,"y":75,"fill":87,"style":585},"289.6","font-size:12px;text-anchor:start","Before purge",[122,588,469],{"x":589,"y":75,"fill":87,"style":585},"418.4",[122,591,594],{"x":592,"y":593,"fill":126,"style":585},"20.0","105.2","CSS uncompressed (KB)",[122,596,600],{"x":597,"y":598,"fill":421,"style":599},"708.9","94.5","font-size:11.5px;text-anchor:start;font-weight:700","184",[122,602,605],{"x":603,"y":604,"fill":414,"style":599},"342.1","114.5","41",[122,607,609],{"x":592,"y":608,"fill":126,"style":585},"157.2","CSS brotli (KB)",[122,611,614],{"x":612,"y":613,"fill":421,"style":599},"316.5","146.5","31",[122,616,619],{"x":617,"y":618,"fill":414,"style":599},"260.1","166.5","9",[122,621,623],{"x":592,"y":622,"fill":126,"style":585},"209.2","Unused share (%)",[122,625,628],{"x":626,"y":627,"fill":421,"style":599},"431.9","198.5","76",[122,630,633],{"x":631,"y":632,"fill":414,"style":599},"283.2","218.5","18",[210,635,636],{},"Measured on the built output with brotli -q 11 and Chrome DevTools Coverage on a representative docs page.",[214,638,640],{"id":639},"splitting-javascript-by-route-and-interaction","Splitting JavaScript by Route and Interaction",[14,642,643,644,647,648,651],{},"On a static site, JavaScript should arrive only where it is used and only when it is needed. Vite-based generators (Astro, VitePress, SvelteKit's static adapter) split bundles automatically along dynamic ",[222,645,646],{},"import()"," boundaries and emit ",[222,649,650],{},"modulepreload"," hints for the chunks each page needs. The two mistakes that undo this are importing a heavy library at the top of a shared layout module, which drags it into every page, and preloading chunks that are only needed after an interaction.",[14,653,654,655,658,659,663,664,35],{},"The Astro site's search dialog imported a 38 KB (compressed) fuzzy-search library at module scope in the header component; every page downloaded it on load, though only 4% of sessions opened search. Moving the import inside the click handler removed it from the initial load of every page, and ",[222,656,657],{},"client:idle"," on the island delayed the remaining header script until after the main content rendered. ",[21,660,662],{"href":661},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fcode-splitting-and-module-preload-in-vite-based-ssgs\u002F","Code Splitting and Module Preload in Vite-Based SSGs"," walks through finding and fixing these with ",[222,665,666],{},"rollup-plugin-visualizer",[272,668,670],{"className":274,"code":669,"language":276,"meta":277,"style":277},"\u002F\u002F Before: loaded on every page\nimport Fuse from 'fuse.js';\n\n\u002F\u002F After: loaded on first open of the search dialog\nbutton.addEventListener('click', async () => {\n  const { default: Fuse } = await import('fuse.js');\n  openSearch(new Fuse(await loadIndex(), { keys: ['title', 'body'] }));\n}, { once: true });\n",[222,671,672,677,694,700,705,734,773,809],{"__ignoreMap":277},[281,673,674],{"class":283,"line":284},[281,675,676],{"class":287},"\u002F\u002F Before: loaded on every page\n",[281,678,679,682,685,688,691],{"class":283,"line":291},[281,680,681],{"class":294},"import",[281,683,684],{"class":305}," Fuse ",[281,686,687],{"class":294},"from",[281,689,690],{"class":315}," 'fuse.js'",[281,692,693],{"class":305},";\n",[281,695,696],{"class":283,"line":309},[281,697,699],{"emptyLinePlaceholder":698},true,"\n",[281,701,702],{"class":283,"line":325},[281,703,704],{"class":287},"\u002F\u002F After: loaded on first open of the search dialog\n",[281,706,707,710,713,716,719,722,725,728,731],{"class":283,"line":338},[281,708,709],{"class":305},"button.",[281,711,712],{"class":301},"addEventListener",[281,714,715],{"class":305},"(",[281,717,718],{"class":315},"'click'",[281,720,721],{"class":305},", ",[281,723,724],{"class":294},"async",[281,726,727],{"class":305}," () ",[281,729,730],{"class":294},"=>",[281,732,733],{"class":305}," {\n",[281,735,737,740,743,747,750,753,756,759,762,765,767,770],{"class":283,"line":736},6,[281,738,739],{"class":294},"  const",[281,741,742],{"class":305}," { ",[281,744,746],{"class":745},"s4XuR","default",[281,748,749],{"class":305},": ",[281,751,752],{"class":331},"Fuse",[281,754,755],{"class":305}," } ",[281,757,758],{"class":294},"=",[281,760,761],{"class":294}," await",[281,763,764],{"class":294}," import",[281,766,715],{"class":305},[281,768,769],{"class":315},"'fuse.js'",[281,771,772],{"class":305},");\n",[281,774,776,779,781,784,787,789,792,795,798,801,803,806],{"class":283,"line":775},7,[281,777,778],{"class":301},"  openSearch",[281,780,715],{"class":305},[281,782,783],{"class":294},"new",[281,785,786],{"class":301}," Fuse",[281,788,715],{"class":305},[281,790,791],{"class":294},"await",[281,793,794],{"class":301}," loadIndex",[281,796,797],{"class":305},"(), { keys: [",[281,799,800],{"class":315},"'title'",[281,802,721],{"class":305},[281,804,805],{"class":315},"'body'",[281,807,808],{"class":305},"] }));\n",[281,810,812,815,818],{"class":283,"line":811},8,[281,813,814],{"class":305},"}, { once: ",[281,816,817],{"class":331},"true",[281,819,820],{"class":305}," });\n",[40,822,823,900],{},[43,824,51,829,51,832,51,835,51,838],{"viewBox":825,"role":46,"ariaLabelledBy":826,"xmlns":50},"0 0 760 210",[827,828],"asset-js-title","asset-js-desc",[53,830,831],{"id":827},"Initial JavaScript bytes on the Astro site after each change",[57,833,834],{"id":828},"Horizontal bars of compressed JavaScript loaded on first view of a docs page. Baseline 142 kilobytes. After lazy-loading the search library 104 kilobytes. After replacing the React theme toggle with a small script 61 kilobytes. After moving the feedback widget to client:visible 44 kilobytes.",[61,836],{"x":63,"y":63,"width":64,"height":837,"fill":66},"210",[68,839,71,840,71,845,71,850,71,854,71,858,71,861,71,864,71,868,71,873,71,877,71,882,71,886,71,891,71,895,51],{"style":70},[61,841],{"x":842,"y":843,"width":844,"height":592,"rx":555,"fill":92,"opacity":543,"stroke":94,"style":544},"240.0","65.0","438.2",[61,846],{"x":842,"y":847,"width":848,"height":592,"rx":555,"fill":101,"opacity":849,"stroke":103,"style":544},"99.0","320.9","0.45",[61,851],{"x":842,"y":852,"width":853,"height":592,"rx":555,"fill":101,"opacity":849,"stroke":103,"style":544},"133.0","188.2",[61,855],{"x":842,"y":856,"width":857,"height":592,"rx":555,"fill":118,"opacity":548,"stroke":120,"style":544},"167.0","135.8",[83,859],{"d":860,"fill":86,"stroke":87,"style":81},"M240.0 60.0 L240.0 192.0",[122,862,863],{"x":124,"y":125,"fill":126,"style":127},"JavaScript on first load of a docs page",[122,865,867],{"x":592,"y":866,"fill":126,"style":585},"79.2","Baseline",[122,869,872],{"x":870,"y":563,"fill":421,"style":871},"686.2","font-size:12px;text-anchor:start;font-weight:700","142 KB",[122,874,876],{"x":592,"y":875,"fill":126,"style":585},"113.2","Search library loaded on click",[122,878,881],{"x":879,"y":880,"fill":126,"style":871},"568.9","113.5","104 KB",[122,883,885],{"x":592,"y":884,"fill":126,"style":585},"147.2","Theme toggle as plain script",[122,887,890],{"x":888,"y":889,"fill":126,"style":871},"436.2","147.5","61 KB",[122,892,894],{"x":592,"y":893,"fill":126,"style":585},"181.2","Feedback widget on client:visible",[122,896,899],{"x":897,"y":898,"fill":414,"style":871},"383.8","181.5","44 KB",[210,901,902],{},"Brotli-compressed bytes from the Lighthouse network requests table, docs page template, median of five runs.",[214,904,906],{"id":905},"minification-and-precompression","Minification and Precompression",[14,908,909,910,913,914,35],{},"Minification removes whitespace, comments and redundant syntax. It is cheap and worth doing for HTML, CSS and JavaScript, but its benefit after compression is modest — on the Eleventy site, minifying HTML saved 22% uncompressed and 7% after brotli. esbuild and Lightning CSS minify JS and CSS in milliseconds; HTML minification is a post-build transform. Details and the settings that break things (collapsing whitespace inside ",[222,911,912],{},"\u003Cpre>",", removing optional closing tags that some tools depend on) are in ",[21,915,917],{"href":916},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fminifying-html-css-and-js-in-eleventy\u002F","Minifying HTML, CSS and JS in Eleventy",[14,919,920,921,924,925,929],{},"Compression matters more. CDNs compress responses on the fly, but at moderate levels chosen for speed: Cloudflare uses brotli around level 4 by default for dynamic compression. Precompressing at build time with brotli at level 11 and zstd at level 19 produced files 14–19% smaller on both sites, and hosts that serve precompressed variants — Caddy, nginx with ",[222,922,923],{},"brotli_static",", Cloudflare Workers static assets and Netlify for some file types — deliver them with no per-request work. ",[21,926,928],{"href":927},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fprecompressing-assets-with-brotli-and-zstd\u002F","Precompressing Assets with Brotli and Zstd"," has the build step and host configuration.",[272,931,935],{"className":932,"code":933,"language":934,"meta":277,"style":277},"language-bash shiki shiki-themes github-light github-dark","# after the build: precompress text assets at maximum levels\nfind dist -type f \\( -name '*.html' -o -name '*.css' -o -name '*.js' -o -name '*.svg' -o -name '*.json' \\) \\\n  -size +1k -print0 | xargs -0 -P \"$(nproc)\" -I{} sh -c 'brotli -q 11 -k -f \"{}\" && zstd -19 -q -k -f \"{}\"'\n","bash",[222,936,937,942,1000],{"__ignoreMap":277},[281,938,939],{"class":283,"line":284},[281,940,941],{"class":287},"# after the build: precompress text assets at maximum levels\n",[281,943,944,947,950,953,956,959,962,965,968,970,973,975,977,980,982,984,987,989,991,994,997],{"class":283,"line":291},[281,945,946],{"class":301},"find",[281,948,949],{"class":315}," dist",[281,951,952],{"class":331}," -type",[281,954,955],{"class":315}," f",[281,957,958],{"class":331}," \\(",[281,960,961],{"class":331}," -name",[281,963,964],{"class":315}," '*.html'",[281,966,967],{"class":331}," -o",[281,969,961],{"class":331},[281,971,972],{"class":315}," '*.css'",[281,974,967],{"class":331},[281,976,961],{"class":331},[281,978,979],{"class":315}," '*.js'",[281,981,967],{"class":331},[281,983,961],{"class":331},[281,985,986],{"class":315}," '*.svg'",[281,988,967],{"class":331},[281,990,961],{"class":331},[281,992,993],{"class":315}," '*.json'",[281,995,996],{"class":331}," \\)",[281,998,999],{"class":331}," \\\n",[281,1001,1002,1005,1008,1011,1014,1017,1020,1023,1026,1029,1032,1035],{"class":283,"line":309},[281,1003,1004],{"class":331},"  -size",[281,1006,1007],{"class":315}," +1k",[281,1009,1010],{"class":331}," -print0",[281,1012,1013],{"class":294}," |",[281,1015,1016],{"class":301}," xargs",[281,1018,1019],{"class":331}," -0",[281,1021,1022],{"class":331}," -P",[281,1024,1025],{"class":315}," \"$(",[281,1027,1028],{"class":301},"nproc",[281,1030,1031],{"class":315},")\"",[281,1033,1034],{"class":331}," -I",[281,1036,1037],{"class":305},"{} sh -c 'brotli -q 11 -k -f \"{}\" && zstd -19 -q -k -f \"{}\"'\n",[40,1039,1040,1118],{},[43,1041,51,1046,51,1049,51,1052,51,1055],{"viewBox":1042,"role":46,"ariaLabelledBy":1043,"xmlns":50},"0 0 760 295",[1044,1045],"asset-comp-title","asset-comp-desc",[53,1047,1048],{"id":1044},"Transfer size of HTML, CSS and JS with different compression settings",[57,1050,1051],{"id":1045},"Vertical bars of total transfer for one Eleventy docs page's HTML, CSS and JS. Uncompressed 212 kilobytes. gzip level 6 on the fly 58 kilobytes. Brotli level 4 on the fly 52 kilobytes. Brotli level 11 precompressed 43 kilobytes.",[61,1053],{"x":63,"y":63,"width":64,"height":1054,"fill":66},"295",[68,1056,71,1057,71,1063,71,1068,71,1073,71,1078,71,1081,71,1084,71,1089,71,1094,71,1099,71,1102,71,1107,71,1110,71,1115,51],{"style":70},[61,1058],{"x":1059,"y":1060,"width":1061,"height":1062,"rx":555,"fill":92,"opacity":543,"stroke":94,"style":544},"80.0","76.0","90.0","170.0",[61,1064],{"x":1065,"y":1066,"width":1061,"height":1067,"rx":555,"fill":101,"opacity":849,"stroke":103,"style":544},"250.0","199.5","46.5",[61,1069],{"x":1070,"y":1071,"width":1061,"height":1072,"rx":555,"fill":110,"opacity":543,"stroke":110,"style":544},"420.0","204.3","41.7",[61,1074],{"x":1075,"y":1076,"width":1061,"height":1077,"rx":555,"fill":118,"opacity":548,"stroke":120,"style":544},"590.0","211.5","34.5",[83,1079],{"d":1080,"fill":86,"stroke":87,"style":81},"M30.0 246.0 L730.0 246.0",[122,1082,1083],{"x":124,"y":125,"fill":126,"style":127},"One docs page, total transfer by compression",[122,1085,1088],{"x":1086,"y":1087,"fill":421,"style":384},"125.0","69.0","212 KB",[122,1090,1093],{"x":1086,"y":1091,"fill":87,"style":1092},"264.0","font-size:11.5px;text-anchor:middle","Uncompressed",[122,1095,1098],{"x":1096,"y":1097,"fill":126,"style":384},"295.0","192.5","58 KB",[122,1100,1101],{"x":1096,"y":1091,"fill":87,"style":1092},"gzip 6 on the fly",[122,1103,1106],{"x":1104,"y":1105,"fill":126,"style":384},"465.0","197.3","52 KB",[122,1108,1109],{"x":1104,"y":1091,"fill":87,"style":1092},"brotli 4 on the fly",[122,1111,1114],{"x":1112,"y":1113,"fill":414,"style":384},"635.0","204.5","43 KB",[122,1116,1117],{"x":1112,"y":1091,"fill":87,"style":1092},"brotli 11 precompressed",[210,1119,1120],{},"Sizes measured with curl --compressed against each configuration and summed across the three requests.",[214,1122,1124],{"id":1123},"icons-without-a-request-per-glyph","Icons Without a Request per Glyph",[14,1126,1127,1128,1131,1132,1135,1136,1139],{},"Icon strategy decides whether a page's chrome costs one request, twenty, or none. Icon fonts are the worst option today: a full Font Awesome WOFF2 is over 100 KB for the dozen glyphs a site uses, it blocks icon rendering until loaded, and it fails for readers who override fonts. Individual SVG files as ",[222,1129,1130],{},"\u003Cimg>"," elements cost a request each. The two good options are inline SVG — each icon's markup embedded in the HTML, zero requests, styleable with ",[222,1133,1134],{},"currentColor"," — and an external SVG sprite referenced with ",[222,1137,1138],{},"\u003Cuse href=\"\u002Ficons.svg#search\">",", one cached request for all icons.",[14,1141,1142,1143,1147],{},"On the Eleventy site, replacing a 108 KB icon font with inline SVGs for 14 icons added 2.1 KB of compressed HTML per page and removed the font request; the header icons now render with the first paint instead of 400 ms later. Inline wins for small, fixed sets; sprites win when pages use many different icons or the HTML size matters more than one request. ",[21,1144,1146],{"href":1145},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fsvg-icon-sprites-vs-inline-icons\u002F","SVG Icon Sprites vs Inline Icons"," compares them in detail.",[214,1149,1151],{"id":1150},"generator-defaults-compared","Generator Defaults Compared",[14,1153,1154],{},"How much of this a generator does for you varies widely, and it is worth knowing before you add tooling that duplicates a built-in feature.",[14,1156,1157,1160,1161,1164,1165,1168],{},[236,1158,1159],{},"Astro"," bundles and minifies CSS and JavaScript with Vite, scopes component styles so each page only links the CSS of the components it renders, inlines small stylesheets with ",[222,1162,1163],{},"build.inlineStylesheets: 'auto'",", and ships zero JavaScript for components without a ",[222,1166,1167],{},"client:*"," directive. What it does not do is remove unused rules inside a stylesheet you import globally, precompress output, or minify HTML (it emits compact HTML but keeps whitespace in some templates).",[14,1170,1171,1174,1175,1178],{},[236,1172,1173],{},"Eleventy"," does none of it by default: it writes the templates' output and copies assets as they are. Everything in this guide is a plugin or a few lines of configuration — Lightning CSS and esbuild in ",[222,1176,1177],{},"eleventy.before",", an HTML transform, a precompression script. The upside is that each step is visible and optional.",[14,1180,1181,1184,1185,1188,1189,1192,1193,1196,1197,1200,1201,1204],{},[236,1182,1183],{},"Hugo"," has Hugo Pipes: ",[222,1186,1187],{},"resources.Get | css.Sass | minify | fingerprint"," handles Sass, minification and content hashing in templates, ",[222,1190,1191],{},"js.Build"," bundles JavaScript with esbuild, and ",[222,1194,1195],{},"--minify"," minifies HTML, CSS, JS, JSON, SVG and XML output in one flag. Unused-CSS removal needs PostCSS with PurgeCSS via ",[222,1198,1199],{},"css.PostCSS",", fed by Hugo's ",[222,1202,1203],{},"build.writeStats"," list of classes used in the built HTML.",[14,1206,1207,1210,1211,1214,1215,35],{},[236,1208,1209],{},"Next.js static export"," minifies JavaScript and CSS, splits JavaScript per route and inlines critical CSS only with the experimental ",[222,1212,1213],{},"optimizeCss"," option. It ships the React runtime on every page, which sets a floor on JavaScript weight that the other generators do not have — see ",[21,1216,1218],{"href":1217},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fnextjs-static-export-vs-astro-for-marketing-sites\u002F","Next.js Static Export vs Astro for Marketing Sites",[14,1220,1221],{},"Whatever the generator, measure the built output rather than trusting defaults. Both sites here had features \"handled by the framework\" that were not doing what the team assumed: the Astro site's global stylesheet was imported in the layout and so shipped whole to every page, and the Eleventy site was still serving an unminified legacy script from a passthrough copy.",[14,1223,1224,1225,721,1228,721,1231,1234,1235,1239],{},"Two further habits help on every generator. Review the dependency list for packages that exist only to add a small visual effect — a scroll-reveal library, a smooth-scroll polyfill, a tooltip package — since CSS now covers most of them natively with ",[222,1226,1227],{},"scroll-behavior",[222,1229,1230],{},"@starting-style",[222,1232,1233],{},"animation-timeline"," and the Popover API. And audit third-party CSS loaded by embeds and widgets, which is invisible in your own build output but shows up in the Coverage panel on the live page; ",[21,1236,1238],{"href":1237},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Fauditing-third-party-scripts-with-lighthouse\u002F","Auditing Third-Party Scripts with Lighthouse"," covers that side.",[214,1241,1243],{"id":1242},"budgets-and-measurement","Budgets and Measurement",[14,1245,1246,1247,1250,1251,1255,1256,35],{},"Asset optimization regresses quietly: one new dependency, one component library upgrade, one extra font weight. Put numbers on it. Both sites enforce per-template budgets in CI with Lighthouse CI's ",[222,1248,1249],{},"budgets.json"," — CSS 15 KB, JavaScript 50 KB on docs templates, compressed — and track compressed bundle size per pull request, as described in ",[21,1252,1254],{"href":1253},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Ftracking-bundle-size-per-pull-request\u002F","Tracking Bundle Size per Pull Request"," and ",[21,1257,1259],{"href":1258},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fper-template-performance-budgets\u002F","Per-Template Performance Budgets",[14,1261,1262],{},"Measure in three places. The build output tells you what you ship (sum of compressed file sizes per template). The Lighthouse network table and DevTools Coverage tell you what loads and what goes unused. Field RUM tells you whether it mattered — on the Astro site, the CSS and JavaScript work together moved LCP p75 from 2.4 s to 1.9 s and INP p75 from 180 ms to 110 ms.",[214,1264,1266],{"id":1265},"measured-impact","Measured Impact",[452,1268,1269,1288],{},[455,1270,1271],{},[458,1272,1273,1276,1279,1282,1285],{},[461,1274,1275],{},"Measure",[461,1277,1278],{},"Astro site before",[461,1280,1281],{},"Astro site after",[461,1283,1284],{},"Eleventy site before",[461,1286,1287],{},"Eleventy site after",[471,1289,1290,1305,1319,1332,1347,1361],{},[458,1291,1292,1295,1297,1299,1302],{},[476,1293,1294],{},"CSS, compressed",[476,1296,481],{},[476,1298,484],{},[476,1300,1301],{},"14 KB",[476,1303,1304],{},"11 KB (inlined)",[458,1306,1307,1310,1312,1314,1317],{},[476,1308,1309],{},"JS on first load, compressed",[476,1311,872],{},[476,1313,899],{},[476,1315,1316],{},"23 KB",[476,1318,484],{},[458,1320,1321,1324,1326,1328,1330],{},[476,1322,1323],{},"Render-blocking requests",[476,1325,542],{},[476,1327,63],{},[476,1329,542],{},[476,1331,63],{},[458,1333,1334,1337,1340,1343,1345],{},[476,1335,1336],{},"FCP, lab (slow 4G)",[476,1338,1339],{},"2.2 s",[476,1341,1342],{},"1.4 s",[476,1344,422],{},[476,1346,415],{},[458,1348,1349,1351,1353,1355,1358],{},[476,1350,511],{},[476,1352,514],{},[476,1354,422],{},[476,1356,1357],{},"1.6 s",[476,1359,1360],{},"1.2 s",[458,1362,1363,1366,1369,1372,1375],{},[476,1364,1365],{},"INP p75, field",[476,1367,1368],{},"180 ms",[476,1370,1371],{},"110 ms",[476,1373,1374],{},"64 ms",[476,1376,1377],{},"58 ms",[214,1379,1381],{"id":1380},"common-pitfalls","Common Pitfalls",[1383,1384,1385,1391,1397,1403,1409,1423],"ul",{},[233,1386,1387,1390],{},[236,1388,1389],{},"Purging runtime classes."," Classes added by JavaScript or from CMS content disappear unless safelisted.",[233,1392,1393,1396],{},[236,1394,1395],{},"Inlining a large stylesheet."," Every page pays for it again; above roughly 15 KB compressed, prefer a cached file.",[233,1398,1399,1402],{},[236,1400,1401],{},"Preloading everything."," Modulepreload for chunks used only after interaction competes with the LCP image.",[233,1404,1405,1408],{},[236,1406,1407],{},"Heavy imports in shared layouts."," One top-level import in a header component lands on every page.",[233,1410,1411,1414,1415,1418,1419,1422],{},[236,1412,1413],{},"Precompressed files without correct headers."," Serving ",[222,1416,1417],{},".br"," files without ",[222,1420,1421],{},"Content-Encoding: br"," breaks the page; let the host's precompressed mechanism do it.",[233,1424,1425,1431],{},[236,1426,1427,1428,1430],{},"Minifying ",[222,1429,912],{}," whitespace."," Collapsing whitespace inside code blocks ruins them.",[214,1433,1435],{"id":1434},"key-takeaways","Key Takeaways",[1383,1437,1438,1441,1444,1449,1452,1455,1458,1461],{},[233,1439,1440],{},"Delete before you optimize: unused CSS and unneeded JavaScript are the biggest wins.",[233,1442,1443],{},"Remove render-blocking CSS requests by inlining small stylesheets or critical rules.",[233,1445,1446,1447,35],{},"Load JavaScript per route and on interaction with dynamic ",[222,1448,646],{},[233,1450,1451],{},"Minify everything, but expect most of the byte savings from compression.",[233,1453,1454],{},"Precompress at maximum levels at build time where the host can serve the variants.",[233,1456,1457],{},"Use inline SVG or a sprite for icons; retire icon fonts.",[233,1459,1460],{},"Enforce per-template budgets in CI so the gains stay.",[233,1462,1463],{},"Measure the built output and the field, not the framework's documentation: defaults are a starting point, and both sites here had \"built-in\" optimizations that were not doing what the team assumed until the numbers showed it.",[214,1465,1467],{"id":1466},"faq","FAQ",[1469,1470,1472],"h3",{"id":1471},"what-is-the-biggest-css-win-on-a-typical-static-site","What is the biggest CSS win on a typical static site?",[14,1474,1475],{},"Usually removing unused CSS and making sure the remaining stylesheet does not block rendering for longer than necessary. On sites built with utility frameworks or large component libraries, unused rules are often more than 80 percent of the stylesheet. After that, inlining the small critical portion can cut first render further on slow connections.",[1469,1477,1479],{"id":1478},"should-a-static-site-inline-all-of-its-css","Should a static site inline all of its CSS?",[14,1481,1482],{},"Only if it is small. Inlining a stylesheet under roughly 15 KB compressed removes a render-blocking request, but every page then carries it and it cannot be cached separately. Larger stylesheets are better served as one cached file, optionally with critical rules inlined.",[1469,1484,1486],{"id":1485},"is-minification-still-worth-doing-when-responses-are-compressed","Is minification still worth doing when responses are compressed?",[14,1488,1489],{},"Yes, but the gain is smaller than it looks. Minification typically removes 15 to 30 percent of uncompressed size, and after brotli the difference shrinks to 5 to 15 percent. It also reduces parse time slightly. It is cheap to add, so keep it, but do not expect it to fix a heavy page.",[1469,1491,1493],{"id":1492},"why-precompress-assets-if-the-cdn-compresses-on-the-fly","Why precompress assets if the CDN compresses on the fly?",[14,1495,1496],{},"CDNs compress at moderate levels to keep latency low. Precompressing at build time with brotli level 11 or zstd at a high level produces files around 15 to 20 percent smaller than on-the-fly compression, at no request-time cost, when the host can serve the precompressed variants.",[1469,1498,1500],{"id":1499},"how-much-javascript-should-a-content-page-ship","How much JavaScript should a content page ship?",[14,1502,1503],{},"As little as the interactive features require. Many documentation and blog pages need none beyond a small theme toggle and search loader, and a budget of 50 KB compressed for all JavaScript on content templates is realistic for most static sites.",[214,1505,1507],{"id":1506},"related","Related",[1383,1509,1510,1519,1524,1529,1534,1539,1544,1549,1556,1561,1568,1575,1582],{},[233,1511,1512,1515,1516,1518],{},[236,1513,1514],{},"Up:"," ",[21,1517,24],{"href":23}," — the whole performance picture.",[233,1520,1521,1523],{},[21,1522,269],{"href":268}," — removing render-blocking CSS.",[233,1525,1526,1528],{},[21,1527,449],{"href":448}," — deleting unused rules safely.",[233,1530,1531,1533],{},[21,1532,662],{"href":661}," — JavaScript per route.",[233,1535,1536,1538],{},[21,1537,917],{"href":916}," — safe minification settings.",[233,1540,1541,1543],{},[21,1542,928],{"href":927}," — maximum compression at build time.",[233,1545,1546,1548],{},[21,1547,1146],{"href":1145}," — icons without icon fonts.",[233,1550,1551,1555],{},[21,1552,1554],{"href":1553},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Feliminating-render-blocking-css-on-static-sites\u002F","Eliminating Render-Blocking CSS on Static Sites"," — the LCP view of the same problem.",[233,1557,1558,1560],{},[21,1559,29],{"href":28}," — how much JavaScript a page needs.",[233,1562,1563,1567],{},[21,1564,1566],{"href":1565},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fkeeping-tailwind-css-output-small-on-static-sites\u002F","Keeping Tailwind CSS Output Small on Static Sites"," — measure what makes Tailwind CSS grow on a static site, from broad sources and safelists to arbitrary values and theme bloat, and keep it under a budget.",[233,1569,1570,1574],{},[21,1571,1573],{"href":1572},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Ffixing-unused-javascript-warnings-on-static-pages\u002F","Fixing Unused JavaScript Warnings on Static Pages"," — trace Lighthouse's reduce unused JavaScript warning on a static site to its sources, from site-wide bundles to hydration and third parties, and fix each.",[233,1576,1577,1581],{},[21,1578,1580],{"href":1579},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Ffixing-missing-tailwind-classes-in-production-builds\u002F","Fixing Missing Tailwind Classes in Production Builds"," — fix styles that work locally but vanish in production with Tailwind: dynamic class names, unscanned files, Markdown content and safelists, plus a CI check.",[233,1583,1584,1588],{},[21,1585,1587],{"href":1586},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Ftailwind-v4-in-astro-without-postcss-plugins\u002F","Tailwind v4 in Astro Without PostCSS Plugins"," — move an Astro site from Tailwind 3 with the PostCSS integration to Tailwind 4 on its Vite plugin: CSS-first config, sources, dark mode and build time, measured.",[1590,1591,1592],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":277,"searchDepth":291,"depth":291,"links":1594},[1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1612],{"id":216,"depth":291,"text":217},{"id":438,"depth":291,"text":439},{"id":639,"depth":291,"text":640},{"id":905,"depth":291,"text":906},{"id":1123,"depth":291,"text":1124},{"id":1150,"depth":291,"text":1151},{"id":1242,"depth":291,"text":1243},{"id":1265,"depth":291,"text":1266},{"id":1380,"depth":291,"text":1381},{"id":1434,"depth":291,"text":1435},{"id":1466,"depth":291,"text":1467,"children":1606},[1607,1608,1609,1610,1611],{"id":1471,"depth":309,"text":1472},{"id":1478,"depth":309,"text":1479},{"id":1485,"depth":309,"text":1486},{"id":1492,"depth":309,"text":1493},{"id":1499,"depth":309,"text":1500},{"id":1506,"depth":291,"text":1507},[1614,1617,1619],{"name":1615,"item":1616},"Home","\u002F",{"name":1618,"item":23},"Core Web Vitals Optimization for SSGs",{"name":5,"item":1620},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002F","2026-09-25","Shrink and schedule the CSS and JavaScript a static site ships: critical CSS, unused-CSS removal, code splitting, minification, precompression and icon strategy.","md",[1625,1626,1627,1628,1629],{"q":1472,"a":1475},{"q":1479,"a":1482},{"q":1486,"a":1489},{"q":1493,"a":1496},{"q":1500,"a":1503},{},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization",{"title":5,"description":1622},"performance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Findex","guide","oiLeK7Yy8M4QUinKRVz22tBU-S7Tqt4fI1P-XLK556g",[1637,1640,1643,1646,1649,1652,1655,1658,1661,1664,1667,1670,1673,1676,1679,1682,1685,1688,1691,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,1925,1928,1931,1934,1937,1940,1943,1946,1949,1952,1955,1958,1961,1964,1967,1970,1973,1976,1979,1982,1985,1988,1991,1994,1997,2000,2003,2006,2009,2012,2015,2018,2021,2024,2027,2030,2033,2036,2039,2042,2045,2048,2051,2054,2057,2060,2063,2066,2069,2072,2075,2078,2080,2082,2084,2085,2087,2089,2091,2093,2095,2097,2099,2102,2105,2108,2111,2114,2117,2120,2123,2126,2129,2132,2135,2138,2141,2144,2146,2149,2152,2155,2158,2161,2164,2167,2170,2173,2176,2179,2182,2185,2188,2191,2194,2197,2200,2203,2205,2208,2211,2214,2217,2220,2223,2225,2228,2231,2234,2237,2239,2242,2245,2248,2251,2254,2257,2260,2263,2266,2269,2272,2275,2278,2280,2283,2286,2289,2292,2294,2297,2300,2303,2306,2309,2312,2315,2318,2321,2324,2327,2330,2333,2336,2339,2342,2345,2348,2351,2354,2357,2360,2363,2366,2369,2372,2375,2378,2381,2384,2387,2390,2393,2396,2399,2402,2405,2408,2411,2414,2417,2420,2423,2426,2429,2432,2435,2438,2441,2444,2447,2450,2453,2456,2459,2462,2465,2468,2471,2474,2477,2480,2483,2486,2489,2492,2495,2498,2501,2504,2507,2510,2513,2516,2519,2522,2525,2528,2531,2534,2537,2540,2543,2546,2549,2552,2555,2558,2561,2564,2567,2570,2573,2576,2579,2582,2585,2588,2591,2594,2597,2600,2603,2606,2609,2612,2615,2618,2621,2624,2627,2630,2633,2636,2639,2642,2645,2648,2651,2654,2657,2660,2663,2666,2669,2672,2675,2678,2681,2684,2687,2690,2693,2696,2699,2702,2705,2708,2711,2714,2717,2720,2723,2726,2729,2732,2735,2738,2741,2744,2747,2750,2753,2756,2759,2762,2765],{"path":1638,"title":1639},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Faccessible-code-blocks-in-documentation-sites","Accessible Code Blocks in Documentation Sites",{"path":1641,"title":1642},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Faccessible-dark-mode-toggles-for-static-sites","Accessible Dark Mode Toggles for Static Sites",{"path":1644,"title":1645},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Faccessible-svg-diagrams-on-static-sites","Accessible SVG Diagrams on Static Sites",{"path":1647,"title":1648},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Fenforcing-alt-text-for-markdown-images-at-build-time","Enforcing Alt Text for Markdown Images at Build Time",{"path":1650,"title":1651},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Ffixing-heading-order-problems-in-markdown-content","Fixing Heading Order Problems in Markdown Content",{"path":1653,"title":1654},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Ffixing-low-color-contrast-flagged-by-lighthouse","Fixing Low Color Contrast Flagged by Lighthouse",{"path":1656,"title":1657},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites","Accessibility for Static Sites",{"path":1659,"title":1660},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Fkeyboard-navigation-and-focus-order-on-static-sites","Keyboard Navigation and Focus Order on Static Sites",{"path":1662,"title":1663},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Faccessibility-for-static-sites\u002Fskip-links-and-landmarks-in-ssg-layouts","Skip Links and Landmarks in SSG Layouts",{"path":1665,"title":1666},"\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":1668,"title":1669},"\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":1671,"title":1672},"\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":1674,"title":1675},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fdev-server-performance-astro-vs-eleventy","Dev Server Performance: Astro vs Eleventy",{"path":1677,"title":1678},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Ffixing-astro-build-errors-after-upgrading-to-astro-5","Fixing Astro Build Errors After Upgrading to Astro 5",{"path":1680,"title":1681},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Ffixing-duplicate-permalink-errors-in-eleventy","Fixing Duplicate Permalink Errors in Eleventy",{"path":1683,"title":1684},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Ffixing-eleventy-out-of-memory-errors-on-large-collections","Fixing Eleventy Out-of-Memory Errors on Large Collections",{"path":1686,"title":1687},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Ffixing-slow-astro-builds-caused-by-large-mdx-collections","Fixing Slow Astro Builds Caused by Large MDX Collections",{"path":1689,"title":1690},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites","Astro vs Eleventy for Documentation Sites",{"path":1692,"title":1693},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Floading-remote-content-with-astro-content-layer-loaders","Loading Remote Content With Astro Content Layer Loaders",{"path":1695,"title":1696},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fmarkdown-pipelines-remark-vs-markdown-it","Markdown Pipelines: remark vs markdown-it",{"path":1698,"title":1699},"\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":1701,"title":1702},"\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":1704,"title":1705},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fsyntax-highlighting-with-shiki-in-astro-and-eleventy","Syntax Highlighting with Shiki in Astro and Eleventy",{"path":1707,"title":1708},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fastro-vs-eleventy-for-documentation-sites\u002Fupgrading-eleventy-2-to-3-with-esm-configuration","Upgrading Eleventy 2 to 3 With ESM Configuration",{"path":1710,"title":1711},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fadding-local-search-to-a-vitepress-site","Adding Local Search to a VitePress Site",{"path":1713,"title":1714},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fcomparing-docs-framework-build-times","Comparing Docs Framework Build Times",{"path":1716,"title":1717},"\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":1719,"title":1720},"\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":1722,"title":1723},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Ffixing-broken-links-reported-by-docusaurus-builds","Fixing Broken Links Reported by Docusaurus Builds",{"path":1725,"title":1726},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fgenerating-api-reference-pages-in-starlight-from-openapi","Generating API Reference Pages in Starlight From OpenAPI",{"path":1728,"title":1729},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress","Docs Frameworks: Docusaurus, Starlight and VitePress",{"path":1731,"title":1732},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Finternationalizing-starlight-docs","Internationalizing Starlight Docs",{"path":1734,"title":1735},"\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":1737,"title":1738},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmigrating-from-mkdocs-to-starlight","Migrating from MkDocs to Starlight",{"path":1740,"title":1741},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fmigrating-mkdocs-documentation-to-vitepress","Migrating MkDocs Documentation to VitePress",{"path":1743,"title":1744},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fspeeding-up-docusaurus-builds-with-rspack","Speeding Up Docusaurus Builds With Rspack",{"path":1746,"title":1747},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fversioned-documentation-with-docusaurus","Versioned Documentation with Docusaurus",{"path":1749,"title":1750},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fversioning-vitepress-documentation-without-a-plugin","Versioning VitePress Documentation Without a Plugin",{"path":1752,"title":1753},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fvitepress-for-library-documentation","VitePress for Library Documentation",{"path":1755,"title":1756},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fdocs-frameworks-docusaurus-starlight-vitepress\u002Fvitepress-vs-starlight-for-vue-and-astro-teams","VitePress vs Starlight for Vue and Astro Teams",{"path":1758,"title":1759},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Ffixing-hugo-builds-that-fail-after-a-version-upgrade","Fixing Hugo Builds That Fail After a Version Upgrade",{"path":1761,"title":1762},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Ffixing-hugo-builds-that-slow-down-after-adding-taxonomies","Fixing Hugo Builds That Slow Down After Adding Taxonomies",{"path":1764,"title":1765},"\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":1767,"title":1768},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fhugo-image-processing-cache-in-ci","Hugo Image Processing Cache in CI",{"path":1770,"title":1771},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fhugo-modules-and-dependency-caching","Hugo Modules and Dependency Caching",{"path":1773,"title":1774},"\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":1776,"title":1777},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories","Hugo Build Times for Large Repositories",{"path":1779,"title":1780},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fparallel-hugo-builds-across-ci-jobs","Parallel Hugo Builds Across CI Jobs",{"path":1782,"title":1783},"\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":1785,"title":1786},"\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":1788,"title":1789},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fsharing-a-theme-across-hugo-sites-with-modules","Sharing a Theme Across Hugo Sites With Modules",{"path":1791,"title":1792},"\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":1794,"title":1795},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fhugo-build-times-for-large-repositories\u002Fsplitting-large-hugo-sites-with-segments","Splitting Large Hugo Sites with Segments",{"path":1797,"title":1798},"\u002Fchoosing-the-right-static-site-generator-for-production","Choosing the Right Static Site Generator for Production",{"path":1800,"title":1801},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Ffixing-hreflang-errors-reported-in-search-console","Fixing Hreflang Errors Reported in Search Console",{"path":1803,"title":1804},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fhreflang-and-language-alternates-on-static-sites","hreflang and Language Alternates on Static Sites",{"path":1806,"title":1807},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fi18n-routing-in-astro","i18n Routing in Astro",{"path":1809,"title":1810},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites","Internationalization for Static Sites",{"path":1812,"title":1813},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Flanguage-detection-and-redirects-at-the-edge","Language Detection and Redirects at the Edge",{"path":1815,"title":1816},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fmultilingual-eleventy-sites-with-the-i18n-plugin","Multilingual Eleventy Sites With the i18n Plugin",{"path":1818,"title":1819},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fmultilingual-sites-with-hugo","Multilingual Sites with Hugo",{"path":1821,"title":1822},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fright-to-left-layouts-on-static-sites","Right-to-Left Layouts on Static Sites",{"path":1824,"title":1825},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Fsubdirectories-vs-subdomains-for-translated-static-sites","Subdirectories vs Subdomains for Translated Static Sites",{"path":1827,"title":1828},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Finternationalization-for-static-sites\u002Ftranslation-workflows-with-git-and-crowdin","Translation Workflows with Git and Crowdin",{"path":1830,"title":1831},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fcustom-domains-and-https-for-jekyll-on-github-pages","Custom Domains and HTTPS for Jekyll on GitHub Pages",{"path":1833,"title":1834},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fdeploying-jekyll-with-github-actions","Deploying Jekyll with GitHub Actions",{"path":1836,"title":1837},"\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":1839,"title":1840},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Ffixing-jekyll-builds-that-break-after-a-ruby-upgrade","Fixing Jekyll Builds That Break After a Ruby Upgrade",{"path":1842,"title":1843},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem","Jekyll Plugin Ecosystem",{"path":1845,"title":1846},"\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":1848,"title":1849},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Frunning-jekyll-in-docker-for-reproducible-builds","Running Jekyll in Docker for Reproducible Builds",{"path":1851,"title":1852},"\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":1854,"title":1855},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fspeeding-up-slow-jekyll-builds","Speeding Up Slow Jekyll Builds",{"path":1857,"title":1858},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fjekyll-plugin-ecosystem\u002Fupgrading-jekyll-and-ruby-versions-safely","Upgrading Jekyll and Ruby Versions Safely",{"path":1860,"title":1861},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fauditing-content-parity-after-a-migration","Auditing Content Parity After a Migration",{"path":1863,"title":1864},"\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":1866,"title":1867},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators","Migrating Between Static Site Generators",{"path":1869,"title":1870},"\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":1872,"title":1873},"\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":1875,"title":1876},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-a-wordpress-export-to-eleventy","Migrating a WordPress Export to Eleventy",{"path":1878,"title":1879},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-docusaurus-to-starlight","Migrating from Docusaurus to Starlight",{"path":1881,"title":1882},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-gatsby-to-astro","Migrating from Gatsby to Astro",{"path":1884,"title":1885},"\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":1887,"title":1888},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Fmigrating-from-nextjs-pages-router-to-astro","Migrating from Next.js Pages Router to Astro",{"path":1890,"title":1891},"\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":1893,"title":1894},"\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":1896,"title":1897},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Frecovering-search-traffic-lost-after-a-generator-migration","Recovering Search Traffic Lost After a Generator Migration",{"path":1899,"title":1900},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fmigrating-between-static-site-generators\u002Freplacing-gatsby-graphql-queries-during-a-migration","Replacing Gatsby GraphQL Queries During a Migration",{"path":1902,"title":1903},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Ffixing-404s-on-refresh-in-nextjs-static-export","Fixing 404s on Refresh in Next.js Static Export",{"path":1905,"title":1906},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fgenerating-sitemaps-and-rss-in-nextjs-static-export","Generating Sitemaps and RSS in Next.js Static Export",{"path":1908,"title":1909},"\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":1911,"title":1912},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites","Next.js Static Export for Content Sites",{"path":1914,"title":1915},"\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":1917,"title":1918},"\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":1920,"title":1921},"\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":1923,"title":1924},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fnextjs-static-export-vs-gatsby-for-existing-react-sites","Next.js Static Export vs Gatsby for Existing React Sites",{"path":1926,"title":1927},"\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":1929,"title":1930},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Ftrailing-slash-and-basepath-in-nextjs-static-export","Trailing Slash and basePath in Next.js Static Export",{"path":1932,"title":1933},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fnextjs-static-export-for-content-sites\u002Fusing-mdx-in-nextjs-static-export","Using MDX in Next.js Static Export",{"path":1935,"title":1936},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Faccessible-search-ui-for-static-sites","Accessible Search UI for Static Sites",{"path":1938,"title":1939},"\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":1941,"title":1942},"\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":1944,"title":1945},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fcustomizing-the-pagefind-ui","Customizing the Pagefind UI",{"path":1947,"title":1948},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Ffixing-missing-results-in-pagefind-indexes","Fixing Missing Results in Pagefind Indexes",{"path":1950,"title":1951},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites","Search for Static Sites",{"path":1953,"title":1954},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Findexing-hugo-sites-with-pagefind","Indexing Hugo Sites with Pagefind",{"path":1956,"title":1957},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fmultilingual-search-on-static-sites","Multilingual Search on Static Sites",{"path":1959,"title":1960},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fpagefind-vs-algolia-docsearch","Pagefind vs Algolia DocSearch",{"path":1962,"title":1963},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fpagefind-vs-lunr-for-small-documentation-sites","Pagefind vs Lunr for Small Documentation Sites",{"path":1965,"title":1966},"\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":1968,"title":1969},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Fself-hosting-typesense-for-a-static-site","Self-Hosting Typesense for a Static Site",{"path":1971,"title":1972},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fsearch-for-static-sites\u002Ftracking-zero-result-searches","Tracking Zero-Result Searches",{"path":1974,"title":1975},"\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":1977,"title":1978},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fchoosing-an-ssg-for-a-marketing-site-with-non-technical-editors","Choosing an SSG for a Marketing Site with Non-Technical Editors",{"path":1980,"title":1981},"\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":1983,"title":1984},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fevaluating-ssg-accessibility-defaults","Evaluating SSG Accessibility Defaults",{"path":1986,"title":1987},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fgatsby-vs-astro-for-content-sites-in-2026","Gatsby vs Astro for Content Sites in 2026",{"path":1989,"title":1990},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix","SSG Framework Selection Matrix",{"path":1992,"title":1993},"\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":1995,"title":1996},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fscoring-ssg-long-term-maintenance-risk","Scoring SSG Long-Term Maintenance Risk",{"path":1998,"title":1999},"\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":2001,"title":2002},"\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":2004,"title":2005},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Fssg-framework-selection-matrix\u002Fwhen-a-static-site-generator-is-the-wrong-choice","When a Static Site Generator Is the Wrong Choice",{"path":2007,"title":2008},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Fadding-json-ld-structured-data-at-build-time","Adding JSON-LD Structured Data at Build Time",{"path":2010,"title":2011},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Fcanonical-urls-and-duplicate-content-on-static-sites","Canonical URLs and Duplicate Content on Static Sites",{"path":2013,"title":2014},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Ffixing-pages-crawled-but-not-indexed-on-static-sites","Fixing Pages Crawled but Not Indexed on Static Sites",{"path":2016,"title":2017},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Ffixing-soft-404s-on-static-hosts","Fixing Soft 404s on Static Hosts",{"path":2019,"title":2020},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Fgenerating-breadcrumb-structured-data-in-astro","Generating Breadcrumb Structured Data in Astro",{"path":2022,"title":2023},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Fgenerating-sitemaps-for-large-static-sites","Generating Sitemaps for Large Static Sites",{"path":2025,"title":2026},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites","Technical SEO for Static Sites",{"path":2028,"title":2029},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Frobots-txt-and-noindex-for-preview-and-staging","robots.txt and noindex for Preview and Staging",{"path":2031,"title":2032},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Frss-and-atom-feeds-for-static-blogs","RSS and Atom Feeds for Static Blogs",{"path":2034,"title":2035},"\u002Fchoosing-the-right-static-site-generator-for-production\u002Ftechnical-seo-for-static-sites\u002Fseo-safe-pagination-and-tag-pages","SEO-Safe Pagination and Tag Pages",{"path":2037,"title":2038},"\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":2040,"title":2041},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-control-headers-for-static-sites-in-nginx","Cache-Control Headers for Static Sites in Nginx",{"path":2043,"title":2044},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-control-headers-on-s3-and-cloudfront","Cache-Control Headers on S3 and CloudFront",{"path":2046,"title":2047},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-control-headers-on-vercel-for-static-sites","Cache-Control Headers on Vercel for Static Sites",{"path":2049,"title":2050},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcache-keys-and-query-strings-on-cdns","Cache Keys and Query Strings on CDNs",{"path":2052,"title":2053},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcaching-404s-and-redirects-at-the-edge","Caching 404s and Redirects at the Edge",{"path":2055,"title":2056},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Fcloudflare-vs-cloudfront-cache-hit-ratios-for-static-sites","Cloudflare vs CloudFront Cache Hit Ratios for Static Sites",{"path":2058,"title":2059},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Ffixing-stale-html-after-deploys-on-cloudflare","Fixing Stale HTML After Deploys on Cloudflare",{"path":2061,"title":2062},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs","CDN Caching Rules for SSGs",{"path":2064,"title":2065},"\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":2067,"title":2068},"\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":2070,"title":2071},"\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":2073,"title":2074},"\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":2076,"title":2077},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcdn-caching-rules-for-ssgs\u002Ftiered-caching-and-origin-shield","Tiered Caching and Origin Shield",{"path":2079,"title":662},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fcode-splitting-and-module-preload-in-vite-based-ssgs",{"path":2081,"title":1580},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Ffixing-missing-tailwind-classes-in-production-builds",{"path":2083,"title":1573},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Ffixing-unused-javascript-warnings-on-static-pages",{"path":1631,"title":5},{"path":2086,"title":269},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Finlining-critical-css-on-static-sites",{"path":2088,"title":1566},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fkeeping-tailwind-css-output-small-on-static-sites",{"path":2090,"title":917},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fminifying-html-css-and-js-in-eleventy",{"path":2092,"title":928},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fprecompressing-assets-with-brotli-and-zstd",{"path":2094,"title":449},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fpurging-unused-css-with-tailwind-and-lightningcss",{"path":2096,"title":1146},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Fsvg-icon-sprites-vs-inline-icons",{"path":2098,"title":1587},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcss-and-javascript-asset-optimization\u002Ftailwind-v4-in-astro-without-postcss-plugins",{"path":2100,"title":2101},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Fcls-from-client-side-rendered-components","CLS from Client-Side Rendered Components",{"path":2103,"title":2104},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Fdebugging-cls-with-the-layout-instability-api","Debugging CLS with the Layout Instability API",{"path":2106,"title":2107},"\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":2109,"title":2110},"\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":2112,"title":2113},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Ffixing-cls-from-dynamic-table-of-contents-widgets","Fixing CLS From Dynamic Table of Contents Widgets",{"path":2115,"title":2116},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Ffixing-cls-from-images-without-dimensions-in-markdown","Fixing CLS From Images Without Dimensions in Markdown",{"path":2118,"title":2119},"\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":2121,"title":2122},"\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":2124,"title":2125},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites","Cumulative Layout Shift Fixes for Static Sites",{"path":2127,"title":2128},"\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":2130,"title":2131},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fcumulative-layout-shift-fixes-for-static-sites\u002Freserving-space-for-ad-and-promo-slots","Reserving Space for Ad and Promo Slots",{"path":2133,"title":2134},"\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":2136,"title":2137},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fauditing-font-payload-per-page","Auditing Font Payload per Page",{"path":2139,"title":2140},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Ffixing-invisible-text-while-web-fonts-load","Fixing Invisible Text While Web Fonts Load",{"path":2142,"title":2143},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Ffont-display-optional-vs-swap","font-display: optional vs swap",{"path":2145,"title":34},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites",{"path":2147,"title":2148},"\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":2150,"title":2151},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fpreloading-fonts-without-double-downloads","Preloading Fonts Without Double Downloads",{"path":2153,"title":2154},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fself-hosted-fonts-vs-google-fonts-for-static-sites","Self-Hosted Fonts vs Google Fonts for Static Sites",{"path":2156,"title":2157},"\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":2159,"title":2160},"\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":2162,"title":2163},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fusing-system-font-stacks-to-skip-webfonts","Using System Font Stacks to Skip Web Fonts",{"path":2165,"title":2166},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Ffont-loading-strategies-for-static-sites\u002Fvariable-fonts-vs-static-weights","Variable Fonts vs Static Weights",{"path":2168,"title":2169},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fart-direction-with-the-picture-element","Art Direction with the Picture Element",{"path":2171,"title":2172},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fblur-up-placeholders-with-lqip","Blur-Up Placeholders with LQIP",{"path":2174,"title":2175},"\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":2177,"title":2178},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fcaching-processed-images-between-builds","Caching Processed Images Between Builds",{"path":2180,"title":2181},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Ffixing-blurry-images-from-astro-assets-resizing","Fixing Blurry Images From astro:assets Resizing",{"path":2183,"title":2184},"\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":2186,"title":2187},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro","Image Optimization Pipelines in Astro",{"path":2189,"title":2190},"\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":2192,"title":2193},"\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":2195,"title":2196},"\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":2198,"title":2199},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fimage-optimization-pipelines-in-astro\u002Fserving-astro-images-through-cloudflare-image-resizing","Serving Astro Images Through Cloudflare Image Resizing",{"path":2201,"title":2202},"\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":2204,"title":1618},"\u002Fperformance-optimization-core-web-vitals-for-ssgs",{"path":2206,"title":2207},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fastro-islands-vs-full-hydration-performance","Astro Islands vs Full Hydration Performance",{"path":2209,"title":2210},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fbreaking-up-long-tasks-on-static-sites","Breaking Up Long Tasks on Static Sites",{"path":2212,"title":2213},"\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":2215,"title":2216},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Ffixing-hydration-mismatch-errors-in-astro-islands","Fixing Hydration Mismatch Errors in Astro Islands",{"path":2218,"title":2219},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Ffixing-poor-inp-on-static-pages-with-heavy-widgets","Fixing Poor INP on Static Pages With Heavy Widgets",{"path":2221,"title":2222},"\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":2224,"title":29},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering",{"path":2226,"title":2227},"\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":2229,"title":2230},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fpreact-vs-react-islands-bundle-size","Preact vs React Islands Bundle Size",{"path":2232,"title":2233},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Freplacing-react-islands-with-web-components","Replacing React Islands with Web Components",{"path":2235,"title":2236},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fjavascript-hydration-partial-rendering\u002Fserver-islands-in-astro","Server Islands in Astro",{"path":2238,"title":1554},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Feliminating-render-blocking-css-on-static-sites",{"path":2240,"title":2241},"\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":2243,"title":2244},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Ffixing-lcp-regressions-caused-by-cookie-consent-tools","Fixing LCP Regressions Caused by Cookie Consent Tools",{"path":2246,"title":2247},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Ffixing-lcp-when-the-hero-is-a-background-image","Fixing LCP When the Hero Is a Background Image",{"path":2249,"title":2250},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Ffixing-slow-lcp-on-pages-with-embedded-video","Fixing Slow LCP on Pages With Embedded Video",{"path":2252,"title":2253},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Fimproving-ttfb-for-static-html","Improving TTFB for Static HTML",{"path":2255,"title":2256},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites","Largest Contentful Paint Optimization for Static Sites",{"path":2258,"title":2259},"\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":2261,"title":2262},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Flargest-contentful-paint-optimization-for-static-sites\u002Foptimizing-lcp-on-astro-with-priority-hints","Optimizing LCP on Astro with Priority Hints",{"path":2264,"title":2265},"\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":2267,"title":2268},"\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":2270,"title":2271},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci","Performance Budgets and Lighthouse CI",{"path":2273,"title":2274},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Flighthouse-ci-vs-webpagetest-for-regression-gates","Lighthouse CI vs WebPageTest for Regression Gates",{"path":2276,"title":2277},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fmeasuring-web-vitals-in-playwright-tests","Measuring Web Vitals in Playwright Tests",{"path":2279,"title":1259},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fper-template-performance-budgets",{"path":2281,"title":2282},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Fperformance-testing-on-throttled-mobile-profiles","Performance Testing on Throttled Mobile Profiles",{"path":2284,"title":2285},"\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":2287,"title":2288},"\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":2290,"title":2291},"\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":2293,"title":1254},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Ftracking-bundle-size-per-pull-request",{"path":2295,"title":2296},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fperformance-budgets-and-lighthouse-ci\u002Ftracking-page-weight-over-time","Tracking Page Weight Over Time",{"path":2298,"title":2299},"\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":2301,"title":2302},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fauditing-unused-preloads","Auditing Unused Preloads",{"path":2304,"title":2305},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fearly-hints-103-on-cloudflare","Early Hints (103) on Cloudflare",{"path":2307,"title":2308},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Ffetchpriority-beyond-the-hero-image","Fetchpriority Beyond the Hero Image",{"path":2310,"title":2311},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Ffixing-wasted-preloads-flagged-by-chrome","Fixing Wasted Preloads Flagged by Chrome",{"path":2313,"title":2314},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed","Resource Hints and Navigation Speed",{"path":2316,"title":2317},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Finstant-navigation-with-speculation-rules","Instant Navigation with Speculation Rules",{"path":2319,"title":2320},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fpreconnect-vs-dns-prefetch-on-static-sites","Preconnect vs DNS-Prefetch on Static Sites",{"path":2322,"title":2323},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fprefetching-links-in-astro","Prefetching Links in Astro",{"path":2325,"title":2326},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fresource-hints-and-navigation-speed\u002Fview-transitions-in-astro-without-hurting-vitals","View Transitions in Astro Without Hurting Vitals",{"path":2328,"title":2329},"\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":2331,"title":2332},"\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":2334,"title":2335},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Ffacades-for-chat-widgets-and-maps","Facades for Chat Widgets and Maps",{"path":2337,"title":2338},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Ffixing-main-thread-blocking-from-chat-widgets","Fixing Main-Thread Blocking From Chat Widgets",{"path":2340,"title":2341},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites","Third-Party Script Performance on Static Sites",{"path":2343,"title":2344},"\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":2346,"title":2347},"\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":2349,"title":2350},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Fmeasuring-third-party-cost-with-request-blocking","Measuring Third-Party Cost with Request Blocking",{"path":2352,"title":2353},"\u002Fperformance-optimization-core-web-vitals-for-ssgs\u002Fthird-party-script-performance-on-static-sites\u002Fprivacy-friendly-analytics-compared-by-page-weight","Privacy-Friendly Analytics Compared by Page Weight",{"path":2355,"title":2356},"\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":2358,"title":2359},"\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":2361,"title":2362},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fautomating-eleventy-deployments-with-cloudflare-pages","Automating Eleventy Deployments on Cloudflare Pages",{"path":2364,"title":2365},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fbranch-deploy-controls-on-cloudflare-pages","Branch Deploy Controls on Cloudflare Pages",{"path":2367,"title":2368},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fcloudflare-pages-functions-middleware","Cloudflare Pages Functions Middleware",{"path":2370,"title":2371},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fconfiguring-redirects-on-cloudflare-pages","Configuring Redirects on Cloudflare Pages",{"path":2373,"title":2374},"\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":2376,"title":2377},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fdeploying-astro-to-cloudflare-workers-static-assets","Deploying Astro to Cloudflare Workers Static Assets",{"path":2379,"title":2380},"\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":2382,"title":2383},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Fdeploying-to-cloudflare-from-github-actions-with-wrangler","Deploying to Cloudflare From GitHub Actions With Wrangler",{"path":2385,"title":2386},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup\u002Ffixing-redirect-loops-on-cloudflare-pages","Fixing Redirect Loops on Cloudflare Pages",{"path":2388,"title":2389},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcloudflare-pages-edge-caching-setup","Cloudflare Pages Edge Caching Setup",{"path":2391,"title":2392},"\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":2394,"title":2395},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fchecking-links-in-pull-requests","Checking Links in Pull Requests",{"path":2397,"title":2398},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fcontent-linting-with-markdownlint","Content Linting with markdownlint",{"path":2400,"title":2401},"\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":2403,"title":2404},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Feditorial-checks-with-vale-in-ci","Editorial Checks with Vale in CI",{"path":2406,"title":2407},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fgit-based-cms-options-for-static-sites-compared","Git-Based CMS Options for Static Sites Compared",{"path":2409,"title":2410},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams","Content Workflows for Documentation Teams",{"path":2412,"title":2413},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fmanaging-images-in-docs-as-code-repos","Managing Images in Docs-as-Code Repos",{"path":2415,"title":2416},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Frelease-notes-and-changelogs-from-git","Release Notes and Changelogs from Git",{"path":2418,"title":2419},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fcontent-workflows-for-documentation-teams\u002Fscheduled-content-publishing-with-github-actions","Scheduled Content Publishing With GitHub Actions",{"path":2421,"title":2422},"\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":2424,"title":2425},"\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":2427,"title":2428},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fbuilding-astro-sites-with-github-actions","Building Astro Sites with GitHub Actions",{"path":2430,"title":2431},"\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":2433,"title":2434},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fconcurrency-groups-to-cancel-stale-builds","Concurrency Groups to Cancel Stale Builds",{"path":2436,"title":2437},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fdeploying-to-github-pages-with-actions","Deploying to GitHub Pages with Actions",{"path":2439,"title":2440},"\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":2442,"title":2443},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Ffixing-flaky-static-site-builds-in-github-actions","Fixing Flaky Static Site Builds in GitHub Actions",{"path":2445,"title":2446},"\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":2448,"title":2449},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds","GitHub Actions for Automated SSG Builds",{"path":2451,"title":2452},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fmatrix-builds-for-multi-site-monorepos","Matrix Builds for Multi-Site Monorepos",{"path":2454,"title":2455},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fpinning-actions-by-commit-sha","Pinning Actions by Commit SHA",{"path":2457,"title":2458},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Fpublishing-any-generator-to-github-pages-with-actions","Publishing Any Generator to GitHub Pages With Actions",{"path":2460,"title":2461},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fgithub-actions-for-automated-ssg-builds\u002Freusable-workflows-for-ssg-builds","Reusable Workflows for SSG Builds",{"path":2463,"title":2464},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fbuild-caching-on-netlify-and-vercel","Build Caching on Netlify and Vercel",{"path":2466,"title":2467},"\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":2469,"title":2470},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fdeploying-only-changed-files","Deploying Only Changed Files",{"path":2472,"title":2473},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fenabling-incremental-builds-in-eleventy","Enabling Incremental Builds in Eleventy",{"path":2475,"title":2476},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Ffixing-stale-pages-from-incremental-builds","Fixing Stale Pages From Incremental Builds",{"path":2478,"title":2479},"\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":2481,"title":2482},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs\u002Fincremental-rebuild-times-across-astro-eleventy-and-hugo","Incremental Rebuild Times Across Astro, Eleventy and Hugo",{"path":2484,"title":2485},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fincremental-builds-and-build-caching-for-ssgs","Incremental Builds and Build Caching for SSGs",{"path":2487,"title":2488},"\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":2490,"title":2491},"\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":2493,"title":2494},"\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":2496,"title":2497},"\u002Fproduction-ready-deployment-cicd-workflows","Production-Ready Deployment & CI\u002FCD for SSGs",{"path":2499,"title":2500},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Falerting-on-cache-hit-ratio-drops","Alerting on Cache Hit Ratio Drops",{"path":2502,"title":2503},"\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":2505,"title":2506},"\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":2508,"title":2509},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Ffinding-the-cause-of-a-sudden-field-lcp-drop","Finding the Cause of a Sudden Field LCP Drop",{"path":2511,"title":2512},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production","Monitoring Static Sites in Production",{"path":2514,"title":2515},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Flogging-404s-at-the-edge","Logging 404s at the Edge",{"path":2517,"title":2518},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fmonitoring-tls-certificate-expiry","Monitoring TLS Certificate Expiry",{"path":2520,"title":2521},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Freal-user-error-tracking-on-static-sites","Real-User Error Tracking on Static Sites",{"path":2523,"title":2524},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Fsynthetic-monitoring-with-scheduled-playwright-checks","Synthetic Monitoring With Scheduled Playwright Checks",{"path":2526,"title":2527},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fmonitoring-static-sites-in-production\u002Ftracking-deploy-markers-in-analytics","Tracking Deploy Markers in Analytics",{"path":2529,"title":2530},"\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":2532,"title":2533},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fbandwidth-pricing-for-static-sites-across-netlify-vercel-and-cloudflare","Static Site Bandwidth Pricing: Netlify, Vercel, Cloudflare",{"path":2535,"title":2536},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fconfiguring-redirects-on-vercel-for-static-sites","Configuring Redirects on Vercel for Static Sites",{"path":2538,"title":2539},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fconfiguring-vercel-for-hugo-and-eleventy","Configuring Vercel for Hugo and Eleventy",{"path":2541,"title":2542},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fdeploying-astro-to-vercel-as-a-fully-static-site","Deploying Astro to Vercel as a Fully Static Site",{"path":2544,"title":2545},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Ffixing-netlify-builds-that-exceed-the-time-limit","Fixing Netlify Builds That Exceed the Time Limit",{"path":2547,"title":2548},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Ffixing-vercel-builds-that-run-out-of-memory","Fixing Vercel Builds That Run Out of Memory",{"path":2550,"title":2551},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies","Netlify vs Vercel Deployment Strategies",{"path":2553,"title":2554},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fnetlify-build-hooks-for-content-updates","Netlify Build Hooks for Content Updates",{"path":2556,"title":2557},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fnetlify-edge-functions-for-static-sites","Netlify Edge Functions for Static Sites",{"path":2559,"title":2560},"\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":2562,"title":2563},"\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":2565,"title":2566},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fnetlify-vs-vercel-deployment-strategies\u002Fvercel-build-output-api-for-custom-ssgs","Vercel Build Output API for Custom SSGs",{"path":2568,"title":2569},"\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":2571,"title":2572},"\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":2574,"title":2575},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fcleaning-up-stale-preview-deployments","Cleaning Up Stale Preview Deployments",{"path":2577,"title":2578},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fcommenting-on-preview-deploys","Commenting on Preview Deploys",{"path":2580,"title":2581},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Ffixing-preview-deploys-leaking-into-search-results","Fixing Preview Deploys Leaking Into Search Results",{"path":2583,"title":2584},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests","Preview Environments for Pull Requests",{"path":2586,"title":2587},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpassword-protecting-preview-deployments","Password-Protecting Preview Deployments",{"path":2589,"title":2590},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpreview-deploys-for-monorepos","Preview Deploys for Monorepos",{"path":2592,"title":2593},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpreviewing-headless-cms-drafts","Previewing Headless CMS Drafts",{"path":2595,"title":2596},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fpull-request-previews-for-github-pages-sites","Pull Request Previews for GitHub Pages Sites",{"path":2598,"title":2599},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fpreview-environments-for-pull-requests\u002Fvisual-regression-testing-on-preview-deploys","Visual Regression Testing on Preview Deploys",{"path":2601,"title":2602},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fatomic-deploys-vs-incremental-uploads","Atomic Deploys vs Incremental Uploads",{"path":2604,"title":2605},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fblue-green-deploys-for-static-sites","Blue-Green Deploys for Static Sites",{"path":2607,"title":2608},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fcanary-releases-for-static-sites","Canary Releases for Static Sites",{"path":2610,"title":2611},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Ffeature-flags-on-static-sites","Feature Flags on Static Sites",{"path":2613,"title":2614},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites","Rollbacks and Deploy Safety for Static Sites",{"path":2616,"title":2617},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fkeeping-old-assets-alive-after-deploy","Keeping Old Assets Alive After Deploy",{"path":2619,"title":2620},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Fpost-deploy-verification-checklists","Post-Deploy Verification Checklists",{"path":2622,"title":2623},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Frecovering-from-a-deploy-that-deleted-live-assets","Recovering From a Deploy That Deleted Live Assets",{"path":2625,"title":2626},"\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":2628,"title":2629},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Frolling-back-netlify-deploys-from-the-cli-and-api","Rolling Back Netlify Deploys From the CLI and API",{"path":2631,"title":2632},"\u002Fproduction-ready-deployment-cicd-workflows\u002Frollbacks-and-deploy-safety-for-static-sites\u002Frolling-back-s3-and-cloudfront-deploys-with-versioned-prefixes","Rolling Back S3 and CloudFront Deploys With Versioned Prefixes",{"path":2634,"title":2635},"\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":2637,"title":2638},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fauditing-npm-dependencies-in-ssg-pipelines","Auditing npm Dependencies in SSG Pipelines",{"path":2640,"title":2641},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fenabling-hsts-and-preload-safely","Enabling HSTS and Preload Safely",{"path":2643,"title":2644},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Ffixing-content-security-policy-violations-from-inline-scripts","Fixing Content Security Policy Violations From Inline Scripts",{"path":2646,"title":2647},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Ffixing-mixed-content-warnings-after-moving-to-https","Fixing Mixed Content Warnings After Moving to HTTPS",{"path":2649,"title":2650},"\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":2652,"title":2653},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites","Security Headers and Hardening for Static Sites",{"path":2655,"title":2656},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fpermissions-policy-and-cross-origin-headers","Permissions-Policy and Cross-Origin Headers",{"path":2658,"title":2659},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecuring-deploy-credentials-with-github-oidc","Securing Deploy Credentials with GitHub OIDC",{"path":2661,"title":2662},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecurity-headers-for-static-sites-served-by-caddy","Security Headers for Static Sites Served by Caddy",{"path":2664,"title":2665},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecurity-headers-on-vercel-for-static-sites","Security Headers on Vercel for Static Sites",{"path":2667,"title":2668},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsecurity-txt-and-disclosure-for-static-sites","security.txt and Disclosure for Static Sites",{"path":2670,"title":2671},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fsecurity-headers-for-static-sites\u002Fsubresource-integrity-for-third-party-assets","Subresource Integrity for Third-Party Assets",{"path":2673,"title":2674},"\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":2676,"title":2677},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fbrotli-and-gzip-precompression-served-by-nginx","Brotli and Gzip Precompression Served by Nginx",{"path":2679,"title":2680},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fclean-urls-and-trailing-slashes-on-s3","Clean URLs and Trailing Slashes on S3",{"path":2682,"title":2683},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fcloudfront-functions-for-redirects","CloudFront Functions for Redirects",{"path":2685,"title":2686},"\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":2688,"title":2689},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fhosting-on-azure-static-web-apps","Hosting on Azure Static Web Apps",{"path":2691,"title":2692},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites","Self-Hosting Static Sites on S3, Nginx and Caddy",{"path":2694,"title":2695},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fnginx-vs-caddy-for-serving-static-sites","Nginx vs Caddy for Serving Static Sites",{"path":2697,"title":2698},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-from-a-docker-container-with-nginx","Serving a Static Site From a Docker Container With Nginx",{"path":2700,"title":2701},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-caddy-and-automatic-https","Serving a Static Site With Caddy and Automatic HTTPS",{"path":2703,"title":2704},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-caddy","Serving a Static Site with Caddy",{"path":2706,"title":2707},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fserving-a-static-site-with-nginx","Serving a Static Site with Nginx",{"path":2709,"title":2710},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fstatic-hosting-on-google-cloud-storage","Static Hosting on Google Cloud Storage",{"path":2712,"title":2713},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fself-hosting-static-sites\u002Fzero-downtime-deploys-with-symlink-swaps","Zero-Downtime Deploys with Symlink Swaps",{"path":2715,"title":2716},"\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":2718,"title":2719},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Ffixing-cold-starts-in-netlify-functions-for-forms","Fixing Cold Starts in Netlify Functions for Forms",{"path":2721,"title":2722},"\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":2724,"title":2725},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites","Serverless Functions for Static Sites",{"path":2727,"title":2728},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fnetlify-functions-vs-cloudflare-workers","Netlify Functions vs Cloudflare Workers",{"path":2730,"title":2731},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fnewsletter-signup-with-an-edge-function","Newsletter Signup with an Edge Function",{"path":2733,"title":2734},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Fprotecting-a-static-site-behind-authentication","Protecting a Static Site Behind Authentication",{"path":2736,"title":2737},"\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",{"path":2739,"title":2740},"\u002Fproduction-ready-deployment-cicd-workflows\u002Fserverless-functions-for-static-sites\u002Frate-limiting-edge-functions","Rate Limiting Edge Functions",{"path":2742,"title":2743},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Faccessibility-testing-with-axe-and-pa11y-in-ci","Accessibility Testing with axe and pa11y in CI",{"path":2745,"title":2746},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Fend-to-end-tests-for-static-sites-with-playwright","End-to-End Tests for Static Sites with Playwright",{"path":2748,"title":2749},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Ffixing-flaky-playwright-tests-against-preview-deploys","Fixing Flaky Playwright Tests Against Preview Deploys",{"path":2751,"title":2752},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci","Testing Static Sites in CI",{"path":2754,"title":2755},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Fsnapshot-testing-build-output","Snapshot Testing Build Output",{"path":2757,"title":2758},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Ftesting-redirects-and-headers-before-deploy","Testing Redirects and Headers Before Deploy",{"path":2760,"title":2761},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Ftesting-search-and-navigation-flows-with-playwright","Testing Search and Navigation Flows With Playwright",{"path":2763,"title":2764},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Ftesting-structured-data-and-meta-tags","Testing Structured Data and Meta Tags",{"path":2766,"title":2767},"\u002Fproduction-ready-deployment-cicd-workflows\u002Ftesting-static-sites-in-ci\u002Fvalidating-html-output-in-ci","Validating HTML Output in CI",null,1790943190977]