[{"data":1,"prerenderedAt":925},["ShallowReactive",2],{"navigation":3,"/docs/cache":137,"/docs/cache-surround":920},[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":40,"body":139,"description":914,"extension":915,"links":916,"meta":917,"navigation":532,"path":86,"seo":918,"stem":87,"__hash__":919},"docs/docs/5.cache/1.index.md",{"type":140,"value":141,"toc":905},"minimark",[142,154,158,166,240,244,247,332,337,340,375,464,468,471,497,643,653,657,660,802,806,817,893,901],[143,144,145,146,153],"p",{},"NuxtHub Cache automatically configures ",[147,148,152],"a",{"href":149,"rel":150},"https://nitro.build/guide/cache#customize-cache-storage",[151],"nofollow","Nitro's cache storage",". It allows you to cache API routes, server functions, and pages in your application.",[155,156,11],"h2",{"id":157},"getting-started",[143,159,160,161,165],{},"Enable cache storage in your project by setting ",[162,163,164],"code",{},"cache: true"," in the NuxtHub config.",[167,168,174],"pre",{"className":169,"code":170,"filename":171,"language":172,"meta":173,"style":173},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  hub: {\n    cache: true\n  }\n})\n","nuxt.config.ts","ts","",[162,175,176,200,213,225,231],{"__ignoreMap":173},[177,178,181,185,188,192,196],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"s7zQu","export",[177,186,187],{"class":183}," default",[177,189,191],{"class":190},"s2Zo4"," defineNuxtConfig",[177,193,195],{"class":194},"sTEyZ","(",[177,197,199],{"class":198},"sMK4o","{\n",[177,201,203,207,210],{"class":179,"line":202},2,[177,204,206],{"class":205},"swJcz","  hub",[177,208,209],{"class":198},":",[177,211,212],{"class":198}," {\n",[177,214,216,219,221],{"class":179,"line":215},3,[177,217,218],{"class":205},"    cache",[177,220,209],{"class":198},[177,222,224],{"class":223},"sfNiH"," true\n",[177,226,228],{"class":179,"line":227},4,[177,229,230],{"class":198},"  }\n",[177,232,234,237],{"class":179,"line":233},5,[177,235,236],{"class":198},"}",[177,238,239],{"class":194},")\n",[155,241,243],{"id":242},"cache-vs-kv","Cache vs KV",[143,245,246],{},"NuxtHub provides both Cache and KV storage. Understanding when to use each helps you make the right architectural decisions.",[248,249,250,263],"table",{},[251,252,253],"thead",{},[254,255,256,260],"tr",{},[257,258,259],"th",{},"Use Case",[257,261,262],{},"Recommendation",[264,265,266,277,286,295,305,314,323],"tbody",{},[254,267,268,272],{},[269,270,271],"td",{},"Response caching",[269,273,274],{},[275,276,85],"strong",{},[254,278,279,282],{},[269,280,281],{},"API route caching",[269,283,284],{},[275,285,85],{},[254,287,288,291],{},[269,289,290],{},"Computed data caching",[269,292,293],{},[275,294,85],{},[254,296,297,300],{},[269,298,299],{},"User sessions",[269,301,302],{},[275,303,304],{},"KV",[254,306,307,310],{},[269,308,309],{},"Feature flags",[269,311,312],{},[275,313,304],{},[254,315,316,319],{},[269,317,318],{},"Rate limiting counters",[269,320,321],{},[275,322,304],{},[254,324,325,328],{},[269,326,327],{},"Persistent configuration",[269,329,330],{},[275,331,304],{},[333,334,336],"h3",{"id":335},"when-to-use-cache","When to Use Cache",[143,338,339],{},"Cache is ideal for data that can be recomputed and benefits from automatic expiration:",[341,342,343,350,363,369],"ul",{},[344,345,346,349],"li",{},[275,347,348],{},"TTL-based expiration",": Cached data automatically expires after a specified duration",[344,351,352,354,355,358,359,362],{},[275,353,271],{},": Use ",[162,356,357],{},"cachedEventHandler"," or ",[162,360,361],{},"cachedFunction"," for API responses",[344,364,365,368],{},[275,366,367],{},"Computed data",": Cache expensive computations with automatic invalidation",[344,370,371,374],{},[275,372,373],{},"No manual cleanup",": Expired entries are removed automatically",[167,376,379],{"className":169,"code":377,"filename":378,"language":172,"meta":173,"style":173},"export default cachedEventHandler(async () => {\n  const posts = await fetchPosts()\n  return posts\n}, { maxAge: 60 * 60 }) // Cache for 1 hour\n","server/api/posts.ts",[162,380,381,404,424,432],{"__ignoreMap":173},[177,382,383,385,387,390,392,396,399,402],{"class":179,"line":180},[177,384,184],{"class":183},[177,386,187],{"class":183},[177,388,389],{"class":190}," cachedEventHandler",[177,391,195],{"class":194},[177,393,395],{"class":394},"spNyl","async",[177,397,398],{"class":198}," ()",[177,400,401],{"class":394}," =>",[177,403,212],{"class":198},[177,405,406,409,412,415,418,421],{"class":179,"line":202},[177,407,408],{"class":394},"  const",[177,410,411],{"class":194}," posts",[177,413,414],{"class":198}," =",[177,416,417],{"class":183}," await",[177,419,420],{"class":190}," fetchPosts",[177,422,423],{"class":205},"()\n",[177,425,426,429],{"class":179,"line":215},[177,427,428],{"class":183},"  return",[177,430,431],{"class":194}," posts\n",[177,433,434,437,440,443,445,449,452,454,457,460],{"class":179,"line":227},[177,435,436],{"class":198},"},",[177,438,439],{"class":198}," {",[177,441,442],{"class":205}," maxAge",[177,444,209],{"class":198},[177,446,448],{"class":447},"sbssI"," 60",[177,450,451],{"class":198}," *",[177,453,448],{"class":447},[177,455,456],{"class":198}," }",[177,458,459],{"class":194},") ",[177,461,463],{"class":462},"sHwdD","// Cache for 1 hour\n",[333,465,467],{"id":466},"when-to-use-kv","When to Use KV",[143,469,470],{},"KV is designed for data that must persist until explicitly deleted:",[341,472,473,479,485,491],{},[344,474,475,478],{},[275,476,477],{},"Persistent data",": Information that should not expire automatically",[344,480,481,484],{},[275,482,483],{},"Session storage",": User sessions and authentication tokens",[344,486,487,490],{},[275,488,489],{},"Application state",": Feature flags and configuration values",[344,492,493,496],{},[275,494,495],{},"Counters",": Rate limiting and analytics counters",[167,498,501],{"className":169,"code":499,"filename":500,"language":172,"meta":173,"style":173},"import { kv } from 'hub:kv'\n\nexport default defineEventHandler(async (event) => {\n  const sessionId = getCookie(event, 'session')\n  const session = await kv.get(`sessions:${sessionId}`)\n  return session\n})\n","server/api/session.ts",[162,502,503,528,534,561,590,628,636],{"__ignoreMap":173},[177,504,505,508,510,513,515,518,521,525],{"class":179,"line":180},[177,506,507],{"class":183},"import",[177,509,439],{"class":198},[177,511,512],{"class":194}," kv",[177,514,456],{"class":198},[177,516,517],{"class":183}," from",[177,519,520],{"class":198}," '",[177,522,524],{"class":523},"sfazB","hub:kv",[177,526,527],{"class":198},"'\n",[177,529,530],{"class":179,"line":202},[177,531,533],{"emptyLinePlaceholder":532},true,"\n",[177,535,536,538,540,543,545,547,550,554,557,559],{"class":179,"line":215},[177,537,184],{"class":183},[177,539,187],{"class":183},[177,541,542],{"class":190}," defineEventHandler",[177,544,195],{"class":194},[177,546,395],{"class":394},[177,548,549],{"class":198}," (",[177,551,553],{"class":552},"sHdIc","event",[177,555,556],{"class":198},")",[177,558,401],{"class":394},[177,560,212],{"class":198},[177,562,563,565,568,570,573,575,577,580,582,585,588],{"class":179,"line":227},[177,564,408],{"class":394},[177,566,567],{"class":194}," sessionId",[177,569,414],{"class":198},[177,571,572],{"class":190}," getCookie",[177,574,195],{"class":205},[177,576,553],{"class":194},[177,578,579],{"class":198},",",[177,581,520],{"class":198},[177,583,584],{"class":523},"session",[177,586,587],{"class":198},"'",[177,589,239],{"class":205},[177,591,592,594,597,599,601,603,606,609,611,614,617,620,623,626],{"class":179,"line":233},[177,593,408],{"class":394},[177,595,596],{"class":194}," session",[177,598,414],{"class":198},[177,600,417],{"class":183},[177,602,512],{"class":194},[177,604,605],{"class":198},".",[177,607,608],{"class":190},"get",[177,610,195],{"class":205},[177,612,613],{"class":198},"`",[177,615,616],{"class":523},"sessions:",[177,618,619],{"class":198},"${",[177,621,622],{"class":194},"sessionId",[177,624,625],{"class":198},"}`",[177,627,239],{"class":205},[177,629,631,633],{"class":179,"line":630},6,[177,632,428],{"class":183},[177,634,635],{"class":194}," session\n",[177,637,639,641],{"class":179,"line":638},7,[177,640,236],{"class":198},[177,642,239],{"class":194},[644,645,646,647,649,650,652],"tip",{},"As a general rule, use ",[275,648,85],{}," for data that can be recomputed, and use ",[275,651,304],{}," for data that must persist.",[333,654,656],{"id":655},"automatic-configuration","Automatic Configuration",[143,658,659],{},"NuxtHub automatically configures the cache storage driver based on your hosting provider.",[661,662,664,682,781],"tabs",{"sync":663},"provider",[665,666,671,679],"tabs-item",{"className":667,"icon":669,"label":670},[668],"p-4","i-simple-icons-vercel","Vercel",[143,672,673,674,605],{},"When deploying to Vercel, it automatically configures ",[147,675,678],{"href":676,"rel":677},"https://vercel.com/changelog/introducing-the-runtime-cache-api",[151],"Vercel Runtime Cache",[143,680,681],{},"No configuration is necessary to enable the Vercel Runtime Cache.",[665,683,687,696,776],{"className":684,"icon":685,"label":686},[668],"i-simple-icons-cloudflare","Cloudflare",[143,688,689,690,695],{},"When deploying to Cloudflare, configure ",[147,691,694],{"href":692,"rel":693},"https://developers.cloudflare.com/kv/",[151],"Cloudflare Workers KV"," for caching by providing the namespace ID. NuxtHub auto-generates the wrangler bindings at build time.",[167,697,699],{"className":169,"code":698,"filename":171,"language":172,"meta":173,"style":173},"export default defineNuxtConfig({\n  hub: {\n    cache: {\n      driver: 'cloudflare-kv-binding',\n      namespaceId: '\u003Ccache-namespace-id>'\n    }\n  }\n})\n",[162,700,701,713,721,729,746,760,765,769],{"__ignoreMap":173},[177,702,703,705,707,709,711],{"class":179,"line":180},[177,704,184],{"class":183},[177,706,187],{"class":183},[177,708,191],{"class":190},[177,710,195],{"class":194},[177,712,199],{"class":198},[177,714,715,717,719],{"class":179,"line":202},[177,716,206],{"class":205},[177,718,209],{"class":198},[177,720,212],{"class":198},[177,722,723,725,727],{"class":179,"line":215},[177,724,218],{"class":205},[177,726,209],{"class":198},[177,728,212],{"class":198},[177,730,731,734,736,738,741,743],{"class":179,"line":227},[177,732,733],{"class":205},"      driver",[177,735,209],{"class":198},[177,737,520],{"class":198},[177,739,740],{"class":523},"cloudflare-kv-binding",[177,742,587],{"class":198},[177,744,745],{"class":198},",\n",[177,747,748,751,753,755,758],{"class":179,"line":233},[177,749,750],{"class":205},"      namespaceId",[177,752,209],{"class":198},[177,754,520],{"class":198},[177,756,757],{"class":523},"\u003Ccache-namespace-id>",[177,759,527],{"class":198},[177,761,762],{"class":179,"line":630},[177,763,764],{"class":198},"    }\n",[177,766,767],{"class":179,"line":638},[177,768,230],{"class":198},[177,770,772,774],{"class":179,"line":771},8,[177,773,236],{"class":198},[177,775,239],{"class":194},[777,778,780],"callout",{"to":779},"https://developers.cloudflare.com/kv/concepts/kv-bindings/","Learn more about KV bindings on Cloudflare's documentation.",[665,782,786,794],{"className":783,"icon":784,"label":785},[668],"i-simple-icons-nodedotjs","Other",[143,787,788,789,605],{},"When deploying to other providers, it automatically configures the ",[147,790,793],{"href":791,"rel":792},"https://unstorage.unjs.io/drivers/fs#nodejs-filesystem-lite",[151],"filesystem",[644,795,797,798,801],{"to":796},"#custom-driver","You can configure the ",[162,799,800],{},"cache"," to use a different storage driver.",[333,803,805],{"id":804},"custom-driver","Custom Driver",[143,807,808,809,814,815,605],{},"You can use any ",[147,810,813],{"href":811,"rel":812},"https://unstorage.unjs.io/drivers",[151],"unstorage"," driver by providing a configuration object to ",[162,816,800],{},[167,818,820],{"className":169,"code":819,"filename":171,"language":172,"meta":173,"style":173},"export default defineNuxtConfig({\n  hub: {\n    cache: {\n      driver: 'redis',\n      url: 'redis://localhost:6379'\n    }\n  }\n})\n",[162,821,822,834,842,850,865,879,883,887],{"__ignoreMap":173},[177,823,824,826,828,830,832],{"class":179,"line":180},[177,825,184],{"class":183},[177,827,187],{"class":183},[177,829,191],{"class":190},[177,831,195],{"class":194},[177,833,199],{"class":198},[177,835,836,838,840],{"class":179,"line":202},[177,837,206],{"class":205},[177,839,209],{"class":198},[177,841,212],{"class":198},[177,843,844,846,848],{"class":179,"line":215},[177,845,218],{"class":205},[177,847,209],{"class":198},[177,849,212],{"class":198},[177,851,852,854,856,858,861,863],{"class":179,"line":227},[177,853,733],{"class":205},[177,855,209],{"class":198},[177,857,520],{"class":198},[177,859,860],{"class":523},"redis",[177,862,587],{"class":198},[177,864,745],{"class":198},[177,866,867,870,872,874,877],{"class":179,"line":233},[177,868,869],{"class":205},"      url",[177,871,209],{"class":198},[177,873,520],{"class":198},[177,875,876],{"class":523},"redis://localhost:6379",[177,878,527],{"class":198},[177,880,881],{"class":179,"line":630},[177,882,764],{"class":198},[177,884,885],{"class":179,"line":638},[177,886,230],{"class":198},[177,888,889,891],{"class":179,"line":771},[177,890,236],{"class":198},[177,892,239],{"class":194},[777,894,895,896,900],{"to":811},"You can find the driver list on ",[147,897,899],{"href":811,"rel":898},[151],"unstorage documentation"," with their configuration.",[902,903,904],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .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);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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}",{"title":173,"searchDepth":202,"depth":202,"links":906},[907,908],{"id":157,"depth":202,"text":11},{"id":242,"depth":202,"text":243,"children":909},[910,911,912,913],{"id":335,"depth":215,"text":336},{"id":466,"depth":215,"text":467},{"id":655,"depth":215,"text":656},{"id":804,"depth":215,"text":805},"Configure caching in your Nuxt application, including setup for pages, API routes, and serverless functions to improve performance and reduce load.","md",null,{},{"title":40,"description":914},"5xQSl4-0AscgcIuHMZU0y75_3HX7Ovx-UItIVel3BAY",[921,923],{"title":80,"path":81,"stem":82,"description":922,"children":-1},"Learn how to use the KV SDK to store, retrieve, update, and delete key-value pairs in your Nuxt application, with practical examples and best practices.",{"title":91,"path":92,"stem":93,"description":924,"children":-1},"Learn how to cache API routes, server functions, and pages in your Nuxt application, with practical examples and best practices.",1773885578377]