[{"data":1,"prerenderedAt":1404},["ShallowReactive",2],{"navigation":3,"/docs/cache/usage":137,"/docs/cache/usage-surround":1399},[4,123],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":113},"Docs","i-lucide-book","/docs","docs",[10,34,58,73,84,95,114],{"title":11,"path":12,"stem":13,"children":14,"icon":33},"Getting Started","/docs/getting-started","docs/1.getting-started/1.index",[15,17,21,25,29],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","/docs/getting-started/installation","docs/1.getting-started/2.installation",{"title":22,"path":23,"stem":24},"Deploy","/docs/getting-started/deploy","docs/1.getting-started/3.deploy",{"title":26,"path":27,"stem":28},"Migration","/docs/getting-started/migration","docs/1.getting-started/4.migration",{"title":30,"path":31,"stem":32},"Environments","/docs/getting-started/environments","docs/1.getting-started/5.environments","i-lucide-rocket",{"title":35,"path":36,"stem":37,"children":38,"icon":57},"Database","/docs/database","docs/2.database/1.index",[39,41,45,49,53],{"title":40,"path":36,"stem":37},"Setup",{"title":42,"path":43,"stem":44},"Schema","/docs/database/schema","docs/2.database/2.schema",{"title":46,"path":47,"stem":48},"Queries","/docs/database/query","docs/2.database/3.query",{"title":50,"path":51,"stem":52},"Migrations","/docs/database/migrations","docs/2.database/4.migrations",{"title":54,"path":55,"stem":56},"CLI","/docs/database/cli","docs/2.database/cli","i-lucide-database",{"title":59,"path":60,"stem":61,"children":62,"icon":72},"Blob","/docs/blob","docs/3.blob/1.index",[63,64,68],{"title":40,"path":60,"stem":61},{"title":65,"path":66,"stem":67},"Upload","/docs/blob/upload","docs/3.blob/2.upload",{"title":69,"path":70,"stem":71},"Blob SDK","/docs/blob/usage","docs/3.blob/3.usage","i-lucide-shapes",{"title":74,"path":75,"stem":76,"children":77,"icon":83},"Key Value","/docs/kv","docs/4.kv/1.index",[78,79],{"title":40,"path":75,"stem":76},{"title":80,"path":81,"stem":82},"KV SDK","/docs/kv/usage","docs/4.kv/2.usage","i-lucide-list",{"title":85,"path":86,"stem":87,"children":88,"icon":94},"Cache","/docs/cache","docs/5.cache/1.index",[89,90],{"title":40,"path":86,"stem":87},{"title":91,"path":92,"stem":93},"Usage","/docs/cache/usage","docs/5.cache/2.usage","i-lucide-zap",{"title":96,"icon":97,"path":98,"stem":99,"children":100,"page":113},"Guides","i-lucide-book-text","/docs/guides","docs/6.guides",[101,105,109],{"title":102,"path":103,"stem":104},"Pre-rendering","/docs/guides/pre-rendering","docs/6.guides/1.pre-rendering",{"title":106,"path":107,"stem":108},"Realtime","/docs/guides/realtime","docs/6.guides/2.realtime",{"title":110,"path":111,"stem":112},"CI/CD","/docs/guides/ci-cd","docs/6.guides/3.ci-cd",false,{"title":115,"path":116,"stem":117,"children":118,"page":113},"Reference","/docs/reference","docs/7.reference",[119],{"title":120,"path":121,"stem":122},"Environment Variables","/docs/reference/environment-variables","docs/7.reference/1.environment-variables",{"title":124,"icon":125,"path":126,"stem":127,"children":128,"page":113},"Changelog","i-lucide-megaphone","/changelog","changelog",[129,133],{"title":130,"path":131,"stem":132},"NuxtHub Multi-Vendor is now available","/changelog/nuxthub-multi-vendor","changelog/nuxthub-multi-vendor",{"title":134,"path":135,"stem":136},"Self-Hosting First & Cloud-Agnostic Future","/changelog/self-hosting-first","changelog/self-hosting-first",{"id":138,"title":139,"body":140,"description":1392,"extension":1393,"links":1394,"meta":1395,"navigation":1396,"path":92,"seo":1397,"stem":93,"__hash__":1398},"docs/docs/5.cache/2.usage.md","Caching in Nuxt",{"type":141,"value":142,"toc":1384},"minimark",[143,148,157,370,381,392,396,403,407,612,619,642,646,653,744,751,755,766,825,828,856,859,959,962,990,993,1033,1042,1084,1088,1092,1118,1121,1143,1146,1165,1168,1175,1253,1260,1266,1307,1314,1380],[144,145,147],"h2",{"id":146},"api-routes-caching","API Routes Caching",[149,150,151,152,156],"p",{},"To cache Nuxt API and server routes, use the ",[153,154,155],"code",{},"cachedEventHandler"," function. This function will cache the response of the server route into the cache storage.",[158,159,165],"pre",{"className":160,"code":161,"filename":162,"language":163,"meta":164,"style":164},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { H3Event } from 'h3'\n\nexport default cachedEventHandler((event) => {\n  return {\n    success: true,\n    date: new Date().toISOString()\n  }\n}, {\n  maxAge: 60 * 60, // 1 hour\n  getKey: (event: H3Event) => event.path\n})\n","server/api/cached-route.ts","ts","",[153,166,167,203,210,242,250,267,293,299,307,331,361],{"__ignoreMap":164},[168,169,172,176,179,183,187,190,193,196,200],"span",{"class":170,"line":171},"line",1,[168,173,175],{"class":174},"s7zQu","import",[168,177,178],{"class":174}," type",[168,180,182],{"class":181},"sMK4o"," {",[168,184,186],{"class":185},"sTEyZ"," H3Event",[168,188,189],{"class":181}," }",[168,191,192],{"class":174}," from",[168,194,195],{"class":181}," '",[168,197,199],{"class":198},"sfazB","h3",[168,201,202],{"class":181},"'\n",[168,204,206],{"class":170,"line":205},2,[168,207,209],{"emptyLinePlaceholder":208},true,"\n",[168,211,213,216,219,223,226,228,232,235,239],{"class":170,"line":212},3,[168,214,215],{"class":174},"export",[168,217,218],{"class":174}," default",[168,220,222],{"class":221},"s2Zo4"," cachedEventHandler",[168,224,225],{"class":185},"(",[168,227,225],{"class":181},[168,229,231],{"class":230},"sHdIc","event",[168,233,234],{"class":181},")",[168,236,238],{"class":237},"spNyl"," =>",[168,240,241],{"class":181}," {\n",[168,243,245,248],{"class":170,"line":244},4,[168,246,247],{"class":174},"  return",[168,249,241],{"class":181},[168,251,253,257,260,264],{"class":170,"line":252},5,[168,254,256],{"class":255},"swJcz","    success",[168,258,259],{"class":181},":",[168,261,263],{"class":262},"sfNiH"," true",[168,265,266],{"class":181},",\n",[168,268,270,273,275,278,281,284,287,290],{"class":170,"line":269},6,[168,271,272],{"class":255},"    date",[168,274,259],{"class":181},[168,276,277],{"class":181}," new",[168,279,280],{"class":221}," Date",[168,282,283],{"class":255},"()",[168,285,286],{"class":181},".",[168,288,289],{"class":221},"toISOString",[168,291,292],{"class":255},"()\n",[168,294,296],{"class":170,"line":295},7,[168,297,298],{"class":181},"  }\n",[168,300,302,305],{"class":170,"line":301},8,[168,303,304],{"class":181},"},",[168,306,241],{"class":181},[168,308,310,313,315,319,322,324,327],{"class":170,"line":309},9,[168,311,312],{"class":255},"  maxAge",[168,314,259],{"class":181},[168,316,318],{"class":317},"sbssI"," 60",[168,320,321],{"class":181}," *",[168,323,318],{"class":317},[168,325,326],{"class":181},",",[168,328,330],{"class":329},"sHwdD"," // 1 hour\n",[168,332,334,337,339,342,344,346,349,351,353,356,358],{"class":170,"line":333},10,[168,335,336],{"class":221},"  getKey",[168,338,259],{"class":181},[168,340,341],{"class":181}," (",[168,343,231],{"class":230},[168,345,259],{"class":181},[168,347,186],{"class":348},"sBMFI",[168,350,234],{"class":181},[168,352,238],{"class":237},[168,354,355],{"class":185}," event",[168,357,286],{"class":181},[168,359,360],{"class":185},"path\n",[168,362,364,367],{"class":170,"line":363},11,[168,365,366],{"class":181},"}",[168,368,369],{"class":185},")\n",[149,371,372,373,376,377,380],{},"The above example will cache the response of the ",[153,374,375],{},"/api/cached-route"," route for 1 hour. The ",[153,378,379],{},"getKey"," function is used to generate the key for the cache entry.",[382,383,385,386,286],"note",{"to":384},"https://nitro.build/guide/cache#options","Read more about ",[387,388,391],"a",{"href":384,"rel":389},[390],"nofollow","Nitro Cache options",[144,393,395],{"id":394},"server-functions-caching","Server Functions Caching",[149,397,398,399,402],{},"Using the ",[153,400,401],{},"cachedFunction"," function, You can cache the response of a server function based on the arguments passed to the function.",[404,405,406],"tip",{},"This is useful to cache the result of a function used in multiple API routes or within authenticated routes.",[158,408,411],{"className":160,"code":409,"filename":410,"language":163,"meta":164,"style":164},"import type { H3Event } from 'h3'\n\nexport const getRepoStarCached = defineCachedFunction(async (event: H3Event, repo: string) => {\n  const data: any = await $fetch(`https://api.github.com/repos/${repo}`)\n\n  return data.stargazers_count\n}, {\n  maxAge: 60 * 60, // 1 hour\n  name: 'ghStars',\n  getKey: (event: H3Event, repo: string) => repo\n})\n","server/utils/cached-function.ts",[153,412,413,433,437,482,523,527,538,544,560,577,606],{"__ignoreMap":164},[168,414,415,417,419,421,423,425,427,429,431],{"class":170,"line":171},[168,416,175],{"class":174},[168,418,178],{"class":174},[168,420,182],{"class":181},[168,422,186],{"class":185},[168,424,189],{"class":181},[168,426,192],{"class":174},[168,428,195],{"class":181},[168,430,199],{"class":198},[168,432,202],{"class":181},[168,434,435],{"class":170,"line":205},[168,436,209],{"emptyLinePlaceholder":208},[168,438,439,441,444,447,450,453,455,458,460,462,464,466,468,471,473,476,478,480],{"class":170,"line":212},[168,440,215],{"class":174},[168,442,443],{"class":237}," const",[168,445,446],{"class":185}," getRepoStarCached ",[168,448,449],{"class":181},"=",[168,451,452],{"class":221}," defineCachedFunction",[168,454,225],{"class":185},[168,456,457],{"class":237},"async",[168,459,341],{"class":181},[168,461,231],{"class":230},[168,463,259],{"class":181},[168,465,186],{"class":348},[168,467,326],{"class":181},[168,469,470],{"class":230}," repo",[168,472,259],{"class":181},[168,474,475],{"class":348}," string",[168,477,234],{"class":181},[168,479,238],{"class":237},[168,481,241],{"class":181},[168,483,484,487,490,492,495,498,501,504,506,509,512,515,518,521],{"class":170,"line":244},[168,485,486],{"class":237},"  const",[168,488,489],{"class":185}," data",[168,491,259],{"class":181},[168,493,494],{"class":348}," any",[168,496,497],{"class":181}," =",[168,499,500],{"class":174}," await",[168,502,503],{"class":221}," $fetch",[168,505,225],{"class":255},[168,507,508],{"class":181},"`",[168,510,511],{"class":198},"https://api.github.com/repos/",[168,513,514],{"class":181},"${",[168,516,517],{"class":185},"repo",[168,519,520],{"class":181},"}`",[168,522,369],{"class":255},[168,524,525],{"class":170,"line":252},[168,526,209],{"emptyLinePlaceholder":208},[168,528,529,531,533,535],{"class":170,"line":269},[168,530,247],{"class":174},[168,532,489],{"class":185},[168,534,286],{"class":181},[168,536,537],{"class":185},"stargazers_count\n",[168,539,540,542],{"class":170,"line":295},[168,541,304],{"class":181},[168,543,241],{"class":181},[168,545,546,548,550,552,554,556,558],{"class":170,"line":301},[168,547,312],{"class":255},[168,549,259],{"class":181},[168,551,318],{"class":317},[168,553,321],{"class":181},[168,555,318],{"class":317},[168,557,326],{"class":181},[168,559,330],{"class":329},[168,561,562,565,567,569,572,575],{"class":170,"line":309},[168,563,564],{"class":255},"  name",[168,566,259],{"class":181},[168,568,195],{"class":181},[168,570,571],{"class":198},"ghStars",[168,573,574],{"class":181},"'",[168,576,266],{"class":181},[168,578,579,581,583,585,587,589,591,593,595,597,599,601,603],{"class":170,"line":333},[168,580,336],{"class":221},[168,582,259],{"class":181},[168,584,341],{"class":181},[168,586,231],{"class":230},[168,588,259],{"class":181},[168,590,186],{"class":348},[168,592,326],{"class":181},[168,594,470],{"class":230},[168,596,259],{"class":181},[168,598,475],{"class":348},[168,600,234],{"class":181},[168,602,238],{"class":237},[168,604,605],{"class":185}," repo\n",[168,607,608,610],{"class":170,"line":363},[168,609,366],{"class":181},[168,611,369],{"class":185},[149,613,614,615,618],{},"The above example will cache the result of the ",[153,616,617],{},"getRepoStarCached"," function for 1 hour.",[620,621,622,632,635],"important",{},[149,623,624,625,627,628,631],{},"It is important to note that the ",[153,626,231],{}," argument should always be the first argument of the cached function. Nitro leverages ",[153,629,630],{},"event.waitUntil"," to keep the instance alive while the cache is being updated while the response is sent to the client.",[633,634],"br",{},[149,636,637,286],{},[387,638,641],{"href":639,"rel":640},"https://nitro.build/guide/cache#edge-workers",[390],"Read more about this in the Nitro docs",[144,643,645],{"id":644},"routes-caching","Routes Caching",[149,647,648,649,652],{},"You can enable route caching in your ",[153,650,651],{},"nuxt.config.ts"," file.",[158,654,656],{"className":160,"code":655,"filename":651,"language":163,"meta":164,"style":164},"export default defineNuxtConfig({\n  routeRules: {\n    '/blog/**': {\n      cache: {\n        maxAge: 60 * 60,\n        // other options like name, group, swr...\n      }\n    }\n  }\n})\n",[153,657,658,672,681,695,704,719,724,729,734,738],{"__ignoreMap":164},[168,659,660,662,664,667,669],{"class":170,"line":171},[168,661,215],{"class":174},[168,663,218],{"class":174},[168,665,666],{"class":221}," defineNuxtConfig",[168,668,225],{"class":185},[168,670,671],{"class":181},"{\n",[168,673,674,677,679],{"class":170,"line":205},[168,675,676],{"class":255},"  routeRules",[168,678,259],{"class":181},[168,680,241],{"class":181},[168,682,683,686,689,691,693],{"class":170,"line":212},[168,684,685],{"class":181},"    '",[168,687,688],{"class":255},"/blog/**",[168,690,574],{"class":181},[168,692,259],{"class":181},[168,694,241],{"class":181},[168,696,697,700,702],{"class":170,"line":244},[168,698,699],{"class":255},"      cache",[168,701,259],{"class":181},[168,703,241],{"class":181},[168,705,706,709,711,713,715,717],{"class":170,"line":252},[168,707,708],{"class":255},"        maxAge",[168,710,259],{"class":181},[168,712,318],{"class":317},[168,714,321],{"class":181},[168,716,318],{"class":317},[168,718,266],{"class":181},[168,720,721],{"class":170,"line":269},[168,722,723],{"class":329},"        // other options like name, group, swr...\n",[168,725,726],{"class":170,"line":295},[168,727,728],{"class":181},"      }\n",[168,730,731],{"class":170,"line":301},[168,732,733],{"class":181},"    }\n",[168,735,736],{"class":170,"line":309},[168,737,298],{"class":181},[168,739,740,742],{"class":170,"line":333},[168,741,366],{"class":181},[168,743,369],{"class":185},[382,745,385,746,286],{},[387,747,750],{"href":748,"rel":749},"https://nuxt.com/docs/guide/concepts/rendering#hybrid-rendering",[390],"Nuxt's route rules",[144,752,754],{"id":753},"cache-invalidation","Cache Invalidation",[149,756,757,758,761,762,765],{},"When using the ",[153,759,760],{},"defineCachedFunction"," or ",[153,763,764],{},"defineCachedEventHandler"," functions, the cache key is generated using the following pattern:",[158,767,769],{"className":160,"code":768,"language":163,"meta":164,"style":164},"`${options.group}:${options.name}:${options.getKey(...args)}.json`\n",[153,770,771],{"__ignoreMap":164},[168,772,773,776,779,781,784,786,788,790,792,794,797,799,801,803,805,807,809,811,814,817,819,822],{"class":170,"line":171},[168,774,775],{"class":181},"`${",[168,777,778],{"class":185},"options",[168,780,286],{"class":181},[168,782,783],{"class":185},"group",[168,785,366],{"class":181},[168,787,259],{"class":198},[168,789,514],{"class":181},[168,791,778],{"class":185},[168,793,286],{"class":181},[168,795,796],{"class":185},"name",[168,798,366],{"class":181},[168,800,259],{"class":198},[168,802,514],{"class":181},[168,804,778],{"class":185},[168,806,286],{"class":181},[168,808,379],{"class":221},[168,810,225],{"class":185},[168,812,813],{"class":181},"...",[168,815,816],{"class":185},"args)",[168,818,366],{"class":181},[168,820,821],{"class":198},".json",[168,823,824],{"class":181},"`\n",[149,826,827],{},"The defaults are:",[829,830,831,840],"ul",{},[832,833,834,836,837],"li",{},[153,835,783],{},": ",[153,838,839],{},"'nitro'",[832,841,842,836,844,847,848,851,852,855],{},[153,843,796],{},[153,845,846],{},"'handlers'"," for API routes,  ",[153,849,850],{},"'functions'"," for server functions, or ",[153,853,854],{},"'routes'"," for route handlers",[149,857,858],{},"For example, the following function:",[158,860,862],{"className":160,"code":861,"language":163,"meta":164,"style":164},"const getAccessToken = defineCachedFunction(() => {\n  return String(Date.now())\n}, {\n  maxAge: 60,\n  name: 'getAccessToken',\n  getKey: () => 'default'\n})\n",[153,863,864,884,904,910,920,935,953],{"__ignoreMap":164},[168,865,866,869,872,874,876,878,880,882],{"class":170,"line":171},[168,867,868],{"class":237},"const",[168,870,871],{"class":185}," getAccessToken ",[168,873,449],{"class":181},[168,875,452],{"class":221},[168,877,225],{"class":185},[168,879,283],{"class":181},[168,881,238],{"class":237},[168,883,241],{"class":181},[168,885,886,888,891,893,896,898,901],{"class":170,"line":205},[168,887,247],{"class":174},[168,889,890],{"class":221}," String",[168,892,225],{"class":255},[168,894,895],{"class":185},"Date",[168,897,286],{"class":181},[168,899,900],{"class":221},"now",[168,902,903],{"class":255},"())\n",[168,905,906,908],{"class":170,"line":212},[168,907,304],{"class":181},[168,909,241],{"class":181},[168,911,912,914,916,918],{"class":170,"line":244},[168,913,312],{"class":255},[168,915,259],{"class":181},[168,917,318],{"class":317},[168,919,266],{"class":181},[168,921,922,924,926,928,931,933],{"class":170,"line":252},[168,923,564],{"class":255},[168,925,259],{"class":181},[168,927,195],{"class":181},[168,929,930],{"class":198},"getAccessToken",[168,932,574],{"class":181},[168,934,266],{"class":181},[168,936,937,939,941,944,946,948,951],{"class":170,"line":269},[168,938,336],{"class":221},[168,940,259],{"class":181},[168,942,943],{"class":181}," ()",[168,945,238],{"class":237},[168,947,195],{"class":181},[168,949,950],{"class":198},"default",[168,952,202],{"class":181},[168,954,955,957],{"class":170,"line":295},[168,956,366],{"class":181},[168,958,369],{"class":185},[149,960,961],{},"Will generate the following cache key:",[158,963,965],{"className":160,"code":964,"language":163,"meta":164,"style":164},"nitro:functions:getAccessToken:default.json\n",[153,966,967],{"__ignoreMap":164},[168,968,969,972,974,977,979,981,983,985,987],{"class":170,"line":171},[168,970,971],{"class":348},"nitro",[168,973,259],{"class":181},[168,975,976],{"class":348},"functions",[168,978,259],{"class":181},[168,980,930],{"class":348},[168,982,259],{"class":181},[168,984,950],{"class":185},[168,986,286],{"class":181},[168,988,989],{"class":185},"json\n",[149,991,992],{},"You can invalidate the cached function entry from your storage using cache key.",[158,994,996],{"className":160,"code":995,"language":163,"meta":164,"style":164},"await useStorage('cache').removeItem('nitro:functions:getAccessToken:default.json')\n",[153,997,998],{"__ignoreMap":164},[168,999,1000,1003,1006,1008,1010,1013,1015,1017,1019,1022,1024,1026,1029,1031],{"class":170,"line":171},[168,1001,1002],{"class":174},"await",[168,1004,1005],{"class":221}," useStorage",[168,1007,225],{"class":185},[168,1009,574],{"class":181},[168,1011,1012],{"class":198},"cache",[168,1014,574],{"class":181},[168,1016,234],{"class":185},[168,1018,286],{"class":181},[168,1020,1021],{"class":221},"removeItem",[168,1023,225],{"class":185},[168,1025,574],{"class":181},[168,1027,1028],{"class":198},"nitro:functions:getAccessToken:default.json",[168,1030,574],{"class":181},[168,1032,369],{"class":185},[149,1034,1035,1036,1038,1039,1041],{},"You can use the ",[153,1037,783],{}," and ",[153,1040,796],{}," options to invalidate multiple cache entries based on their prefixes.",[158,1043,1045],{"className":160,"code":1044,"language":163,"meta":164,"style":164},"// Gets all keys that start with nitro:handlers\nawait useStorage('cache').clear('nitro:handlers')\n",[153,1046,1047,1052],{"__ignoreMap":164},[168,1048,1049],{"class":170,"line":171},[168,1050,1051],{"class":329},"// Gets all keys that start with nitro:handlers\n",[168,1053,1054,1056,1058,1060,1062,1064,1066,1068,1070,1073,1075,1077,1080,1082],{"class":170,"line":205},[168,1055,1002],{"class":174},[168,1057,1005],{"class":221},[168,1059,225],{"class":185},[168,1061,574],{"class":181},[168,1063,1012],{"class":198},[168,1065,574],{"class":181},[168,1067,234],{"class":185},[168,1069,286],{"class":181},[168,1071,1072],{"class":221},"clear",[168,1074,225],{"class":185},[168,1076,574],{"class":181},[168,1078,1079],{"class":198},"nitro:handlers",[168,1081,574],{"class":181},[168,1083,369],{"class":185},[382,1085,1087],{"to":1086},"https://nitro.build/guide/cache","Read more about Nitro Cache.",[199,1089,1091],{"id":1090},"normalizing-cache-keys","Normalizing Cache Keys",[620,1093,1094,1098,1099,1038,1102,1105,1106,1109,1110,1113,1114,1117],{},[1095,1096,1097],"strong",{},"Cache keys are automatically normalized"," using an internal utility that removes non-alphanumeric characters such as ",[153,1100,1101],{},"/",[153,1103,1104],{},"-",". This behavior helps ensure compatibility across various storage backends (e.g., ",[153,1107,1108],{},"file systems",", ",[153,1111,1112],{},"key-value"," stores) that might have restrictions on characters in ",[153,1115,1116],{},"keys",", and also prevents potential path traversal vulnerabilities.",[149,1119,1120],{},"For example:",[158,1122,1124],{"className":160,"code":1123,"language":163,"meta":164,"style":164},"getKey: () => '/api/products/sale-items'\n",[153,1125,1126],{"__ignoreMap":164},[168,1127,1128,1130,1132,1134,1136,1138,1141],{"class":170,"line":171},[168,1129,379],{"class":348},[168,1131,259],{"class":181},[168,1133,943],{"class":181},[168,1135,238],{"class":237},[168,1137,195],{"class":181},[168,1139,1140],{"class":198},"/api/products/sale-items",[168,1142,202],{"class":181},[149,1144,1145],{},"Would generate a key like:",[158,1147,1149],{"className":160,"code":1148,"language":163,"meta":164,"style":164},"api/productssaleitems.json\n",[153,1150,1151],{"__ignoreMap":164},[168,1152,1153,1156,1158,1161,1163],{"class":170,"line":171},[168,1154,1155],{"class":185},"api",[168,1157,1101],{"class":181},[168,1159,1160],{"class":185},"productssaleitems",[168,1162,286],{"class":181},[168,1164,989],{"class":185},[149,1166,1167],{},"This behavior may result in keys that look different from the original route or identifier.",[404,1169,1170,1171,1174],{},"To manually reproduce the same normalized key pattern used by Nitro (e.g., when invalidating cache entries), you can use the ",[153,1172,1173],{},"escapeKey"," utility function provided below:",[158,1176,1178],{"className":160,"code":1177,"language":163,"meta":164,"style":164},"function escapeKey(key: string | string[]) {\n  return String(key).replace(/\\W/g, \"\");\n}\n",[153,1179,1180,1209,1248],{"__ignoreMap":164},[168,1181,1182,1185,1188,1190,1193,1195,1197,1200,1202,1205,1207],{"class":170,"line":171},[168,1183,1184],{"class":237},"function",[168,1186,1187],{"class":221}," escapeKey",[168,1189,225],{"class":181},[168,1191,1192],{"class":230},"key",[168,1194,259],{"class":181},[168,1196,475],{"class":348},[168,1198,1199],{"class":181}," |",[168,1201,475],{"class":348},[168,1203,1204],{"class":185},"[]",[168,1206,234],{"class":181},[168,1208,241],{"class":181},[168,1210,1211,1213,1215,1217,1219,1221,1223,1226,1228,1230,1233,1235,1238,1240,1243,1245],{"class":170,"line":205},[168,1212,247],{"class":174},[168,1214,890],{"class":221},[168,1216,225],{"class":255},[168,1218,1192],{"class":185},[168,1220,234],{"class":255},[168,1222,286],{"class":181},[168,1224,1225],{"class":221},"replace",[168,1227,225],{"class":255},[168,1229,1101],{"class":181},[168,1231,1232],{"class":198},"\\W",[168,1234,1101],{"class":181},[168,1236,1237],{"class":317},"g",[168,1239,326],{"class":181},[168,1241,1242],{"class":181}," \"\"",[168,1244,234],{"class":255},[168,1246,1247],{"class":181},";\n",[168,1249,1250],{"class":170,"line":212},[168,1251,1252],{"class":181},"}\n",[149,1254,1255,1256,1259],{},"It's recommended to use ",[153,1257,1258],{},"escapeKey()"," when invalidating manually using route paths or identifiers to ensure consistency with Nitro's internal key generation.",[149,1261,1262,1263,1265],{},"For example, if your ",[153,1264,379],{}," function is:",[158,1267,1269],{"className":160,"code":1268,"language":163,"meta":164,"style":164},"getKey: (id: string) => `product/${id}/details`\n",[153,1270,1271],{"__ignoreMap":164},[168,1272,1273,1275,1277,1279,1282,1284,1286,1288,1290,1293,1296,1298,1300,1302,1305],{"class":170,"line":171},[168,1274,379],{"class":348},[168,1276,259],{"class":181},[168,1278,341],{"class":181},[168,1280,1281],{"class":230},"id",[168,1283,259],{"class":181},[168,1285,475],{"class":348},[168,1287,234],{"class":181},[168,1289,238],{"class":237},[168,1291,1292],{"class":181}," `",[168,1294,1295],{"class":198},"product/",[168,1297,514],{"class":181},[168,1299,1281],{"class":185},[168,1301,366],{"class":181},[168,1303,1304],{"class":198},"/details",[168,1306,824],{"class":181},[149,1308,1309,1310,1313],{},"And you want to invalidate ",[153,1311,1312],{},"product/123/details",", you would do:",[158,1315,1317],{"className":160,"code":1316,"language":163,"meta":164,"style":164},"const normalizedKey = escapeKey('product/123/details')\nawait useStorage('cache').removeItem(`nitro:functions:getProductDetails:${normalizedKey}.json`)\n",[153,1318,1319,1340],{"__ignoreMap":164},[168,1320,1321,1323,1326,1328,1330,1332,1334,1336,1338],{"class":170,"line":171},[168,1322,868],{"class":237},[168,1324,1325],{"class":185}," normalizedKey ",[168,1327,449],{"class":181},[168,1329,1187],{"class":221},[168,1331,225],{"class":185},[168,1333,574],{"class":181},[168,1335,1312],{"class":198},[168,1337,574],{"class":181},[168,1339,369],{"class":185},[168,1341,1342,1344,1346,1348,1350,1352,1354,1356,1358,1360,1362,1364,1367,1369,1372,1374,1376,1378],{"class":170,"line":205},[168,1343,1002],{"class":174},[168,1345,1005],{"class":221},[168,1347,225],{"class":185},[168,1349,574],{"class":181},[168,1351,1012],{"class":198},[168,1353,574],{"class":181},[168,1355,234],{"class":185},[168,1357,286],{"class":181},[168,1359,1021],{"class":221},[168,1361,225],{"class":185},[168,1363,508],{"class":181},[168,1365,1366],{"class":198},"nitro:functions:getProductDetails:",[168,1368,514],{"class":181},[168,1370,1371],{"class":185},"normalizedKey",[168,1373,366],{"class":181},[168,1375,821],{"class":198},[168,1377,508],{"class":181},[168,1379,369],{"class":185},[1381,1382,1383],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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":164,"searchDepth":205,"depth":205,"links":1385},[1386,1387,1388,1389],{"id":146,"depth":205,"text":147},{"id":394,"depth":205,"text":395},{"id":644,"depth":205,"text":645},{"id":753,"depth":205,"text":754,"children":1390},[1391],{"id":1090,"depth":212,"text":1091},"Learn how to cache API routes, server functions, and pages in your Nuxt application, with practical examples and best practices.","md",null,{},{"title":91},{"title":139,"description":1392},"RB8B8oOizu2kIbz1daOZJ-XGyhf4Yq_z0TvDaVgKBMw",[1400,1402],{"title":40,"path":86,"stem":87,"description":1401,"children":-1},"Configure caching in your Nuxt application, including setup for pages, API routes, and serverless functions to improve performance and reduce load.",{"title":102,"path":103,"stem":104,"description":1403,"children":-1},"Pre-render pages at build time for maximum performance and avoid server CPU usage.",1773885581258]