[{"data":1,"prerenderedAt":537},["ShallowReactive",2],{"navigation":3,"-guide-query-params":57,"-guide-query-params-surround":534},[4],{"title":5,"path":6,"stem":7,"children":8,"icon":16},"Guide","\u002Fguide","1.guide\u002F1.index",[9,12,17,22,27,32,37,42,47,52],{"title":10,"path":6,"stem":7,"icon":11},"Getting Started","lucide:rocket",{"title":13,"path":14,"stem":15,"icon":16},"API Reference","\u002Fguide\u002Fapi","1.guide\u002F10.api","lucide:book-open",{"title":18,"path":19,"stem":20,"icon":21},"Caching Functions","\u002Fguide\u002Ffunctions","1.guide\u002F2.functions","lucide:square-function",{"title":23,"path":24,"stem":25,"icon":26},"Invalidation & Expiration","\u002Fguide\u002Finvalidation","1.guide\u002F3.invalidation","lucide:trash-2",{"title":28,"path":29,"stem":30,"icon":31},"Storage","\u002Fguide\u002Fstorage","1.guide\u002F4.storage","lucide:database",{"title":33,"path":34,"stem":35,"icon":36},"Caching HTTP Handlers","\u002Fguide\u002Fhandler","1.guide\u002F5.handler","lucide:server",{"title":38,"path":39,"stem":40,"icon":41},"Query Parameters","\u002Fguide\u002Fquery-params","1.guide\u002F6.query-params","lucide:link-2",{"title":43,"path":44,"stem":45,"icon":46},"Cookies","\u002Fguide\u002Fcookies","1.guide\u002F7.cookies","lucide:cookie",{"title":48,"path":49,"stem":50,"icon":51},"Cache-Control & Eligibility","\u002Fguide\u002Fcache-control","1.guide\u002F8.cache-control","lucide:sliders-horizontal",{"title":53,"path":54,"stem":55,"icon":56},"Incremental Static Regeneration","\u002Fguide\u002Fisr","1.guide\u002F9.isr","lucide:refresh-cw",{"id":58,"title":38,"body":59,"description":97,"extension":529,"meta":530,"navigation":531,"path":39,"seo":532,"stem":40,"__hash__":533},"content\u002F1.guide\u002F6.query-params.md",{"type":60,"value":61,"toc":526,"icon":41},"minimark",[62,80,91,373,387,400,405,433,522],[63,64,65,66,70,71,75,76,79],"p",{},"By default the ",[67,68,69],"strong",{},"full query string"," is part of the cache key, so ",[72,73,74],"code",{},"?color=red"," and ",[72,77,78],{},"?color=red&utm=x"," are cached as separate entries. That means unrelated params — tracking tags, cache-busters — fragment your cache and lower the hit rate.",[63,81,82,83,86,87,90],{},"Set ",[72,84,85],{},"allowQuery"," to an allowlist of param names so ",[67,88,89],{},"only those"," vary the key; every other param is ignored:",[92,93,98],"pre",{"className":94,"code":95,"language":96,"meta":97,"style":97},"language-ts shiki shiki-themes github-light github-dark github-dark","const handler = defineCachedHandler(\n  async (event) => {\n    const url = event.url ?? new URL(event.req.url);\n    const color = url.searchParams.get(\"color\") ?? \"default\";\n    return new Response(renderSwatch(color), {\n      headers: { \"content-type\": \"text\u002Fhtml\" },\n    });\n  },\n  {\n    maxAge: 300,\n    allowQuery: [\"color\"],\n  },\n);\n\n\u002F\u002F All of these share ONE cached entry (only `color` matters):\nawait handler({ req: new Request(\"https:\u002F\u002Fshop.dev\u002Fswatch?color=red\") });\nawait handler({ req: new Request(\"https:\u002F\u002Fshop.dev\u002Fswatch?color=red&lang=en\") });\nawait handler({ req: new Request(\"https:\u002F\u002Fshop.dev\u002Fswatch?color=red&utm=ig\") });\n","ts","",[72,99,100,124,146,172,205,224,242,248,254,260,272,283,288,294,301,308,333,353],{"__ignoreMap":97},[101,102,105,109,113,116,120],"span",{"class":103,"line":104},"line",1,[101,106,108],{"class":107},"so5gQ","const",[101,110,112],{"class":111},"suiK_"," handler",[101,114,115],{"class":107}," =",[101,117,119],{"class":118},"shcOC"," defineCachedHandler",[101,121,123],{"class":122},"slsVL","(\n",[101,125,127,130,133,137,140,143],{"class":103,"line":126},2,[101,128,129],{"class":107},"  async",[101,131,132],{"class":122}," (",[101,134,136],{"class":135},"sQHwn","event",[101,138,139],{"class":122},") ",[101,141,142],{"class":107},"=>",[101,144,145],{"class":122}," {\n",[101,147,149,152,155,157,160,163,166,169],{"class":103,"line":148},3,[101,150,151],{"class":107},"    const",[101,153,154],{"class":111}," url",[101,156,115],{"class":107},[101,158,159],{"class":122}," event.url ",[101,161,162],{"class":107},"??",[101,164,165],{"class":107}," new",[101,167,168],{"class":118}," URL",[101,170,171],{"class":122},"(event.req.url);\n",[101,173,175,177,180,182,185,188,191,195,197,199,202],{"class":103,"line":174},4,[101,176,151],{"class":107},[101,178,179],{"class":111}," color",[101,181,115],{"class":107},[101,183,184],{"class":122}," url.searchParams.",[101,186,187],{"class":118},"get",[101,189,190],{"class":122},"(",[101,192,194],{"class":193},"sfrk1","\"color\"",[101,196,139],{"class":122},[101,198,162],{"class":107},[101,200,201],{"class":193}," \"default\"",[101,203,204],{"class":122},";\n",[101,206,208,211,213,216,218,221],{"class":103,"line":207},5,[101,209,210],{"class":107},"    return",[101,212,165],{"class":107},[101,214,215],{"class":118}," Response",[101,217,190],{"class":122},[101,219,220],{"class":118},"renderSwatch",[101,222,223],{"class":122},"(color), {\n",[101,225,227,230,233,236,239],{"class":103,"line":226},6,[101,228,229],{"class":122},"      headers: { ",[101,231,232],{"class":193},"\"content-type\"",[101,234,235],{"class":122},": ",[101,237,238],{"class":193},"\"text\u002Fhtml\"",[101,240,241],{"class":122}," },\n",[101,243,245],{"class":103,"line":244},7,[101,246,247],{"class":122},"    });\n",[101,249,251],{"class":103,"line":250},8,[101,252,253],{"class":122},"  },\n",[101,255,257],{"class":103,"line":256},9,[101,258,259],{"class":122},"  {\n",[101,261,263,266,269],{"class":103,"line":262},10,[101,264,265],{"class":122},"    maxAge: ",[101,267,268],{"class":111},"300",[101,270,271],{"class":122},",\n",[101,273,275,278,280],{"class":103,"line":274},11,[101,276,277],{"class":122},"    allowQuery: [",[101,279,194],{"class":193},[101,281,282],{"class":122},"],\n",[101,284,286],{"class":103,"line":285},12,[101,287,253],{"class":122},[101,289,291],{"class":103,"line":290},13,[101,292,293],{"class":122},");\n",[101,295,297],{"class":103,"line":296},14,[101,298,300],{"emptyLinePlaceholder":299},true,"\n",[101,302,304],{"class":103,"line":303},15,[101,305,307],{"class":306},"sCsY4","\u002F\u002F All of these share ONE cached entry (only `color` matters):\n",[101,309,311,314,316,319,322,325,327,330],{"class":103,"line":310},16,[101,312,313],{"class":107},"await",[101,315,112],{"class":118},[101,317,318],{"class":122},"({ req: ",[101,320,321],{"class":107},"new",[101,323,324],{"class":118}," Request",[101,326,190],{"class":122},[101,328,329],{"class":193},"\"https:\u002F\u002Fshop.dev\u002Fswatch?color=red\"",[101,331,332],{"class":122},") });\n",[101,334,336,338,340,342,344,346,348,351],{"class":103,"line":335},17,[101,337,313],{"class":107},[101,339,112],{"class":118},[101,341,318],{"class":122},[101,343,321],{"class":107},[101,345,324],{"class":118},[101,347,190],{"class":122},[101,349,350],{"class":193},"\"https:\u002F\u002Fshop.dev\u002Fswatch?color=red&lang=en\"",[101,352,332],{"class":122},[101,354,356,358,360,362,364,366,368,371],{"class":103,"line":355},18,[101,357,313],{"class":107},[101,359,112],{"class":118},[101,361,318],{"class":122},[101,363,321],{"class":107},[101,365,324],{"class":118},[101,367,190],{"class":122},[101,369,370],{"class":193},"\"https:\u002F\u002Fshop.dev\u002Fswatch?color=red&utm=ig\"",[101,372,332],{"class":122},[63,374,375,376,75,379,382,383,386],{},"Matching is order-independent and normalized: ",[72,377,378],{},"?color=red&size=l",[72,380,381],{},"?size=l&color=red"," hit the same entry, and repeated (array) params like ",[72,384,385],{},"?color=red&color=blue"," are matched regardless of order.",[388,389,390],"tip",{},[63,391,392,395,396,399],{},[67,393,394],{},"Ignored params never reach the handler."," Just like non-",[72,397,398],{},"varies"," headers, params outside the allowlist are stripped from the URL the handler receives — so a handler can never accidentally produce output that depends on a param outside the cache key.",[401,402,404],"h2",{"id":403},"edge-cases","Edge cases",[406,407,408,419],"ul",{},[409,410,411,414,415,418],"li",{},[67,412,413],{},"Cache everything under one key."," An empty allowlist (",[72,416,417],{},"allowQuery: []",") drops the whole query string, so every request to the path shares a single entry (and the handler always sees a query-less URL).",[409,420,421,424,425,428,429,432],{},[67,422,423],{},"Case-sensitive."," ",[72,426,427],{},"allowQuery: [\"color\"]"," does not match ",[72,430,431],{},"?Color=red",".",[434,435,436,458],"note",{},[63,437,438,444,445,447,448,450,451,453,454,457],{},[67,439,440,443],{},[72,441,442],{},"getKey"," overrides the key entirely."," If you provide a custom ",[72,446,442],{},", it — not ",[72,449,85],{}," — decides the cache key. ",[72,452,85],{}," no longer influences the key, but non-allowlisted params are ",[67,455,456],{},"still stripped"," from the URL the handler sees.",[92,459,461],{"className":94,"code":460,"language":96,"meta":97,"style":97},"defineCachedHandler(myHandler, {\n  maxAge: 300,\n  allowQuery: [\"color\"], \u002F\u002F still strips other params from the handler's URL\n  getKey: (event) => new URL(event.req.url).pathname, \u002F\u002F but this defines the key\n});\n",[72,462,463,471,480,493,517],{"__ignoreMap":97},[101,464,465,468],{"class":103,"line":104},[101,466,467],{"class":118},"defineCachedHandler",[101,469,470],{"class":122},"(myHandler, {\n",[101,472,473,476,478],{"class":103,"line":126},[101,474,475],{"class":122},"  maxAge: ",[101,477,268],{"class":111},[101,479,271],{"class":122},[101,481,482,485,487,490],{"class":103,"line":148},[101,483,484],{"class":122},"  allowQuery: [",[101,486,194],{"class":193},[101,488,489],{"class":122},"], ",[101,491,492],{"class":306},"\u002F\u002F still strips other params from the handler's URL\n",[101,494,495,498,501,503,505,507,509,511,514],{"class":103,"line":174},[101,496,497],{"class":118},"  getKey",[101,499,500],{"class":122},": (",[101,502,136],{"class":135},[101,504,139],{"class":122},[101,506,142],{"class":107},[101,508,165],{"class":107},[101,510,168],{"class":118},[101,512,513],{"class":122},"(event.req.url).pathname, ",[101,515,516],{"class":306},"\u002F\u002F but this defines the key\n",[101,518,519],{"class":103,"line":207},[101,520,521],{"class":122},"});\n",[523,524,525],"style",{},"html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .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);}",{"title":97,"searchDepth":126,"depth":126,"links":527},[528],{"id":403,"depth":126,"text":404},"md",{"icon":41},{"icon":41},{"title":38,"description":97},"tppib5lDHZHcciC7CJ9oHmwJEDpQGnzQpAj-kzYWRf0",[535,536],{"title":33,"path":34,"stem":35,"description":97,"icon":36,"children":-1},{"title":43,"path":44,"stem":45,"description":97,"icon":46,"children":-1},1783601179226]