[{"data":1,"prerenderedAt":1054},["ShallowReactive",2],{"post-\u002Ftr\u002Fnext-js-on-bellegi-nasil-yenilenir-on-demand-cache-regeneration":3},{"page":4,"translation":907,"nav":909,"related":1040,"random":1041},{"id":5,"title":6,"body":7,"categories":891,"category":893,"date":894,"description":895,"draft":896,"extension":897,"image":898,"kind":893,"lang":100,"meta":899,"navigation":232,"path":900,"readingTime":273,"seo":901,"slug":902,"stem":903,"tags":893,"translationKey":904,"type":892,"updated":905,"__hash__":906},"postsTr\u002Ftr\u002Fnext-js-on-bellegi-nasil-yenilenir-on-demand-cache-regeneration.md","Next.js Önbelleği Nasıl Yenilenir? \"On-Demand Cache Regeneration\"",{"type":8,"value":9,"toc":884},"minimark",[10,60,67,74,85,88,93,186,188,195,198,208,211,459,461,470,481,488,843,846,860,862,867,880],[11,12,13,21],"blockquote",{},[14,15,16,17],"p",{},"💡 ",[18,19,20],"strong",{},"Özet (TL;DR):",[22,23,24,31,46],"ul",{},[25,26,27,30],"li",{},[18,28,29],{},"Nedir:"," Incremental Static Regeneration (ISR) ile oluşturulan statik sayfaların önbelleğini, belirli bir zaman aşımı süresini (TTL) beklemeden, bir olay veya webhook tetiklemesiyle (on-demand) anında güncelleyen mekanizmadır.",[25,32,33,36,37,41,42,45],{},[18,34,35],{},"Pages Router (Klasik):"," ",[38,39,40],"code",{},"pages\u002Fapi\u002Frevalidate.js"," uç noktasında ",[38,43,44],{},"res.revalidate('\u002Fyol')"," metodu kullanılarak yapılır.",[25,47,48,51,52,55,56,59],{},[18,49,50],{},"App Router (Modern):"," Next.js 13+ ile gelen App Router'da Route Handler veya Server Action içinde ",[38,53,54],{},"revalidatePath('\u002Fyol')"," veya daha spesifik veriler için ",[38,57,58],{},"revalidateTag('etiket')"," fonksiyonları kullanılır.",[14,61,62,63,66],{},"Next.js, sitenizin derlenmesinden sonra da arka planda statik sayfalar oluşturmanıza veya güncellemenize olanak tanır. ",[18,64,65],{},"Incremental Static Regeneration (ISR)"," adı verilen bu özellik, sitenin tamamını baştan derlemenize gerek kalmadan sayfa bazında statik HTML üretilmesine izin verir.",[14,68,69,70,73],{},"Next.js 12.1 sürümü ile duyurulan ",[18,71,72],{},"On-demand Revalidation"," özelliği, headless WordPress yapısındaki bu siteyi oluştururken Nuxt.js yerine Next.js'i tercih etme sebebim olmuştu. Benzer özellik birkaç ay sonra Nuxt.js için de duyuruldu ve Nuxt.js (Vue) tekrar oyuna girdi.",[14,75,76,77,80,81,84],{},"Next.js v12.1.0 ile başlayarak On-Demand Incremental Static Regeneration özelliğini getirdi ve bu özellik spesifik bir sayfa için Next.js önbelleğini temizleme olanağı sağladı. Sonraki Next.js sürümü olan v12.2.0 ile bu özellik kararlı (stable) statüsü kazandı. Fakat ",[38,78,79],{},"unstable_revalidate()"," olan fonksiyon adını ",[38,82,83],{},"revalidate()","'e çevirerek bu deneysel özelliği kullanan sitelerin hata vermesine neden oldu. Sonuç olarak web sitemin önbellek yenilemesinin hata verme nedenini çözmek bir saatime mal oldu.",[86,87],"hr",{},[89,90,92],"h3",{"id":91},"nextjs-revalidation-yöntemleri-karşılaştırması","Next.js Revalidation Yöntemleri Karşılaştırması",[94,95,96,125],"table",{},[97,98,99],"thead",{},[100,101,102,107,114,120],"tr",{},[103,104,106],"th",{"align":105},"left","Özellik \u002F Yöntem",[103,108,109,110,113],{"align":105},"Pages Router (",[38,111,112],{},"res.revalidate",")",[103,115,116,117,113],{"align":105},"App Router (",[38,118,119],{},"revalidatePath",[103,121,116,122,113],{"align":105},[38,123,124],{},"revalidateTag",[126,127,128,147,170],"tbody",{},[100,129,130,136,142,145],{},[131,132,133],"td",{"align":105},[18,134,135],{},"Kullanım Yeri",[131,137,138,139,113],{"align":105},"API Routes (",[38,140,141],{},"pages\u002Fapi\u002F...",[131,143,144],{"align":105},"Route Handlers \u002F Server Actions",[131,146,144],{"align":105},[100,148,149,154,161,167],{},[131,150,151],{"align":105},[18,152,153],{},"Hedefleme",[131,155,156,157,160],{"align":105},"Tam URL yolu bazlı (Örn: ",[38,158,159],{},"\u002Fblog\u002Fpost-1",").",[131,162,163,164,160],{"align":105},"Yol bazlı (Statik yol veya dinamik ",[38,165,166],{},"\u002Fblog\u002F[slug]",[131,168,169],{"align":105},"Veri bazlı (Fetch isteklerine atanan etiketler).",[100,171,172,177,180,183],{},[131,173,174],{"align":105},[18,175,176],{},"Çalışma Şekli",[131,178,179],{"align":105},"Sadece belirtilen sayfayı yeniden derler.",[131,181,182],{"align":105},"Sayfa bileşenlerini ve veri isteklerini sıfırlar.",[131,184,185],{"align":105},"Sadece o etiketle işaretlenmiş veri önbelleğini sıfırlar.",[86,187],{},[189,190,192,193,113],"h2",{"id":191},"_1-klasik-yöntem-pages-router-resrevalidate","1. Klasik Yöntem: Pages Router (",[38,194,112],{},[14,196,197],{},"İlk olarak sadece Next.js uygulamanız tarafından bilinen bir gizli anahtar belirlemelisiniz. Bu anahtarı önbellek yenileme isteklerini alacak API uç noktanıza yetkisiz erişilmesini engellemek için kullanacaksınız. Aşağıdaki gibi bir URL yapısına sahip olacak bu uç noktayı manuel veya webhook yöntemi ile tetikleyebilirsiniz:",[199,200,206],"pre",{"className":201,"code":203,"language":204,"meta":205},[202],"language-text","https:\u002F\u002F\u003Calan-adiniz.com>\u002Fapi\u002Frevalidate?secret=MY_SECRET_TOKEN\n","text","",[38,207,203],{"__ignoreMap":205},[14,209,210],{},"Belirlediğiniz bu gizli anahtarı ortam değişkenlerine ekleyin ve önbellek yenileme uç noktanızı aşağıdaki örneğe benzer şekilde oluşturun:",[199,212,216],{"className":213,"code":214,"language":215,"meta":205,"style":205},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F pages\u002Fapi\u002Frevalidate.js\n\nexport default async function handler(req, res) {\n  \u002F\u002F İsteğin geçerli olduğunu doğrulamak için gizli anahtarı kontrol edin.\n  if (req.query.secret !== process.env.MY_SECRET_TOKEN) {\n    return res.status(401).json({ message: 'Geçersiz anahtar' })\n  }\n\n  try {\n    \u002F\u002F Yol parametrik değil gerçek yol olmalıdır\n    \u002F\u002F Örneğin \"\u002Fblog\u002F[slug]\" yerine \"\u002Fblog\u002Fpost-1\" olmalıdır\n    await res.revalidate('\u002Fpath-to-revalidate')\n    return res.json({ revalidated: true })\n  } catch (err) {\n    \u002F\u002F Eğer önbellek yenilenirken bir hata olursa\n    \u002F\u002F Next.js oluşturulan son önbelleği kullanmaya devam edecektir\n    return res.status(500).send('Önbellek temizleme başarısız oldu')\n  }\n}\n","javascript",[38,217,218,227,234,271,277,298,330,336,341,350,356,362,381,398,410,416,422,448,453],{"__ignoreMap":205},[219,220,223],"span",{"class":221,"line":222},"line",1,[219,224,226],{"class":225},"sJ8bj","\u002F\u002F pages\u002Fapi\u002Frevalidate.js\n",[219,228,230],{"class":221,"line":229},2,[219,231,233],{"emptyLinePlaceholder":232},true,"\n",[219,235,237,241,244,247,250,254,258,262,265,268],{"class":221,"line":236},3,[219,238,240],{"class":239},"szBVR","export",[219,242,243],{"class":239}," default",[219,245,246],{"class":239}," async",[219,248,249],{"class":239}," function",[219,251,253],{"class":252},"sScJk"," handler",[219,255,257],{"class":256},"sVt8B","(",[219,259,261],{"class":260},"s4XuR","req",[219,263,264],{"class":256},", ",[219,266,267],{"class":260},"res",[219,269,270],{"class":256},") {\n",[219,272,274],{"class":221,"line":273},4,[219,275,276],{"class":225},"  \u002F\u002F İsteğin geçerli olduğunu doğrulamak için gizli anahtarı kontrol edin.\n",[219,278,280,283,286,289,292,296],{"class":221,"line":279},5,[219,281,282],{"class":239},"  if",[219,284,285],{"class":256}," (req.query.secret ",[219,287,288],{"class":239},"!==",[219,290,291],{"class":256}," process.env.",[219,293,295],{"class":294},"sj4cs","MY_SECRET_TOKEN",[219,297,270],{"class":256},[219,299,301,304,307,310,312,315,317,320,323,327],{"class":221,"line":300},6,[219,302,303],{"class":239},"    return",[219,305,306],{"class":256}," res.",[219,308,309],{"class":252},"status",[219,311,257],{"class":256},[219,313,314],{"class":294},"401",[219,316,160],{"class":256},[219,318,319],{"class":252},"json",[219,321,322],{"class":256},"({ message: ",[219,324,326],{"class":325},"sZZnC","'Geçersiz anahtar'",[219,328,329],{"class":256}," })\n",[219,331,333],{"class":221,"line":332},7,[219,334,335],{"class":256},"  }\n",[219,337,339],{"class":221,"line":338},8,[219,340,233],{"emptyLinePlaceholder":232},[219,342,344,347],{"class":221,"line":343},9,[219,345,346],{"class":239},"  try",[219,348,349],{"class":256}," {\n",[219,351,353],{"class":221,"line":352},10,[219,354,355],{"class":225},"    \u002F\u002F Yol parametrik değil gerçek yol olmalıdır\n",[219,357,359],{"class":221,"line":358},11,[219,360,361],{"class":225},"    \u002F\u002F Örneğin \"\u002Fblog\u002F[slug]\" yerine \"\u002Fblog\u002Fpost-1\" olmalıdır\n",[219,363,365,368,370,373,375,378],{"class":221,"line":364},12,[219,366,367],{"class":239},"    await",[219,369,306],{"class":256},[219,371,372],{"class":252},"revalidate",[219,374,257],{"class":256},[219,376,377],{"class":325},"'\u002Fpath-to-revalidate'",[219,379,380],{"class":256},")\n",[219,382,384,386,388,390,393,396],{"class":221,"line":383},13,[219,385,303],{"class":239},[219,387,306],{"class":256},[219,389,319],{"class":252},[219,391,392],{"class":256},"({ revalidated: ",[219,394,395],{"class":294},"true",[219,397,329],{"class":256},[219,399,401,404,407],{"class":221,"line":400},14,[219,402,403],{"class":256},"  } ",[219,405,406],{"class":239},"catch",[219,408,409],{"class":256}," (err) {\n",[219,411,413],{"class":221,"line":412},15,[219,414,415],{"class":225},"    \u002F\u002F Eğer önbellek yenilenirken bir hata olursa\n",[219,417,419],{"class":221,"line":418},16,[219,420,421],{"class":225},"    \u002F\u002F Next.js oluşturulan son önbelleği kullanmaya devam edecektir\n",[219,423,425,427,429,431,433,436,438,441,443,446],{"class":221,"line":424},17,[219,426,303],{"class":239},[219,428,306],{"class":256},[219,430,309],{"class":252},[219,432,257],{"class":256},[219,434,435],{"class":294},"500",[219,437,160],{"class":256},[219,439,440],{"class":252},"send",[219,442,257],{"class":256},[219,444,445],{"class":325},"'Önbellek temizleme başarısız oldu'",[219,447,380],{"class":256},[219,449,451],{"class":221,"line":450},18,[219,452,335],{"class":256},[219,454,456],{"class":221,"line":455},19,[219,457,458],{"class":256},"}\n",[86,460],{},[189,462,464,465,467,468,113],{"id":463},"_2-modern-yöntem-app-router-revalidatepath-ve-revalidatetag","2. Modern Yöntem: App Router (",[38,466,119],{}," ve ",[38,469,124],{},[14,471,472,473,476,477,480],{},"Next.js 13 ve sonrasındaki (Next.js 14, 15+) App Router mimarisinde önbellek yönetimi API Route'lar yerine ",[18,474,475],{},"Route Handlers"," veya ",[18,478,479],{},"Server Actions"," içinde gerçekleştirilir. Artık yol tabanlı veya veri etiketleme tabanlı (tag-based) yenileme yapabiliyoruz.",[14,482,483,484,487],{},"Örnek bir Route Handler (",[38,485,486],{},"app\u002Fapi\u002Frevalidate\u002Froute.js",") üzerinden nasıl kullanıldığına bakalım:",[199,489,491],{"className":213,"code":490,"language":215,"meta":205,"style":205},"\u002F\u002F app\u002Fapi\u002Frevalidate\u002Froute.js\nimport { revalidatePath, revalidateTag } from 'next\u002Fcache'\n\nexport async function POST(request) {\n  const { searchParams } = new URL(request.url)\n  const secret = searchParams.get('secret')\n  const path = searchParams.get('path')\n  const tag = searchParams.get('tag')\n\n  \u002F\u002F Güvenlik doğrulaması\n  if (secret !== process.env.MY_SECRET_TOKEN) {\n    return Response.json({ message: 'Geçersiz anahtar' }, { status: 401 })\n  }\n\n  try {\n    if (path) {\n      \u002F\u002F Belirli bir yolu revalidate et (Örn: \u002Fblog\u002Fyazi-1)\n      revalidatePath(path)\n      return Response.json({ revalidated: true, path })\n    }\n\n    if (tag) {\n      \u002F\u002F Belirli bir veri etiketini revalidate et (Örn: 'posts')\n      \u002F\u002F Fetch yaparken { next: { tags: ['posts'] } } şeklinde etiketlenmiş istekleri etkiler\n      revalidateTag(tag)\n      return Response.json({ revalidated: true, tag })\n    }\n\n    return Response.json({ message: 'Eksik parametre (path veya tag belirtilmeli)' }, { status: 400 })\n  } catch (err) {\n    return Response.json({ message: 'Önbellek temizleme başarısız oldu' }, { status: 500 })\n  }\n}\n",[38,492,493,498,512,516,534,560,583,603,623,627,632,647,667,671,675,681,689,694,702,718,724,729,737,743,749,758,774,779,784,805,814,833,838],{"__ignoreMap":205},[219,494,495],{"class":221,"line":222},[219,496,497],{"class":225},"\u002F\u002F app\u002Fapi\u002Frevalidate\u002Froute.js\n",[219,499,500,503,506,509],{"class":221,"line":229},[219,501,502],{"class":239},"import",[219,504,505],{"class":256}," { revalidatePath, revalidateTag } ",[219,507,508],{"class":239},"from",[219,510,511],{"class":325}," 'next\u002Fcache'\n",[219,513,514],{"class":221,"line":236},[219,515,233],{"emptyLinePlaceholder":232},[219,517,518,520,522,524,527,529,532],{"class":221,"line":273},[219,519,240],{"class":239},[219,521,246],{"class":239},[219,523,249],{"class":239},[219,525,526],{"class":252}," POST",[219,528,257],{"class":256},[219,530,531],{"class":260},"request",[219,533,270],{"class":256},[219,535,536,539,542,545,548,551,554,557],{"class":221,"line":279},[219,537,538],{"class":239},"  const",[219,540,541],{"class":256}," { ",[219,543,544],{"class":294},"searchParams",[219,546,547],{"class":256}," } ",[219,549,550],{"class":239},"=",[219,552,553],{"class":239}," new",[219,555,556],{"class":252}," URL",[219,558,559],{"class":256},"(request.url)\n",[219,561,562,564,567,570,573,576,578,581],{"class":221,"line":300},[219,563,538],{"class":239},[219,565,566],{"class":294}," secret",[219,568,569],{"class":239}," =",[219,571,572],{"class":256}," searchParams.",[219,574,575],{"class":252},"get",[219,577,257],{"class":256},[219,579,580],{"class":325},"'secret'",[219,582,380],{"class":256},[219,584,585,587,590,592,594,596,598,601],{"class":221,"line":332},[219,586,538],{"class":239},[219,588,589],{"class":294}," path",[219,591,569],{"class":239},[219,593,572],{"class":256},[219,595,575],{"class":252},[219,597,257],{"class":256},[219,599,600],{"class":325},"'path'",[219,602,380],{"class":256},[219,604,605,607,610,612,614,616,618,621],{"class":221,"line":338},[219,606,538],{"class":239},[219,608,609],{"class":294}," tag",[219,611,569],{"class":239},[219,613,572],{"class":256},[219,615,575],{"class":252},[219,617,257],{"class":256},[219,619,620],{"class":325},"'tag'",[219,622,380],{"class":256},[219,624,625],{"class":221,"line":343},[219,626,233],{"emptyLinePlaceholder":232},[219,628,629],{"class":221,"line":352},[219,630,631],{"class":225},"  \u002F\u002F Güvenlik doğrulaması\n",[219,633,634,636,639,641,643,645],{"class":221,"line":358},[219,635,282],{"class":239},[219,637,638],{"class":256}," (secret ",[219,640,288],{"class":239},[219,642,291],{"class":256},[219,644,295],{"class":294},[219,646,270],{"class":256},[219,648,649,651,654,656,658,660,663,665],{"class":221,"line":364},[219,650,303],{"class":239},[219,652,653],{"class":256}," Response.",[219,655,319],{"class":252},[219,657,322],{"class":256},[219,659,326],{"class":325},[219,661,662],{"class":256}," }, { status: ",[219,664,314],{"class":294},[219,666,329],{"class":256},[219,668,669],{"class":221,"line":383},[219,670,335],{"class":256},[219,672,673],{"class":221,"line":400},[219,674,233],{"emptyLinePlaceholder":232},[219,676,677,679],{"class":221,"line":412},[219,678,346],{"class":239},[219,680,349],{"class":256},[219,682,683,686],{"class":221,"line":418},[219,684,685],{"class":239},"    if",[219,687,688],{"class":256}," (path) {\n",[219,690,691],{"class":221,"line":424},[219,692,693],{"class":225},"      \u002F\u002F Belirli bir yolu revalidate et (Örn: \u002Fblog\u002Fyazi-1)\n",[219,695,696,699],{"class":221,"line":450},[219,697,698],{"class":252},"      revalidatePath",[219,700,701],{"class":256},"(path)\n",[219,703,704,707,709,711,713,715],{"class":221,"line":455},[219,705,706],{"class":239},"      return",[219,708,653],{"class":256},[219,710,319],{"class":252},[219,712,392],{"class":256},[219,714,395],{"class":294},[219,716,717],{"class":256},", path })\n",[219,719,721],{"class":221,"line":720},20,[219,722,723],{"class":256},"    }\n",[219,725,727],{"class":221,"line":726},21,[219,728,233],{"emptyLinePlaceholder":232},[219,730,732,734],{"class":221,"line":731},22,[219,733,685],{"class":239},[219,735,736],{"class":256}," (tag) {\n",[219,738,740],{"class":221,"line":739},23,[219,741,742],{"class":225},"      \u002F\u002F Belirli bir veri etiketini revalidate et (Örn: 'posts')\n",[219,744,746],{"class":221,"line":745},24,[219,747,748],{"class":225},"      \u002F\u002F Fetch yaparken { next: { tags: ['posts'] } } şeklinde etiketlenmiş istekleri etkiler\n",[219,750,752,755],{"class":221,"line":751},25,[219,753,754],{"class":252},"      revalidateTag",[219,756,757],{"class":256},"(tag)\n",[219,759,761,763,765,767,769,771],{"class":221,"line":760},26,[219,762,706],{"class":239},[219,764,653],{"class":256},[219,766,319],{"class":252},[219,768,392],{"class":256},[219,770,395],{"class":294},[219,772,773],{"class":256},", tag })\n",[219,775,777],{"class":221,"line":776},27,[219,778,723],{"class":256},[219,780,782],{"class":221,"line":781},28,[219,783,233],{"emptyLinePlaceholder":232},[219,785,787,789,791,793,795,798,800,803],{"class":221,"line":786},29,[219,788,303],{"class":239},[219,790,653],{"class":256},[219,792,319],{"class":252},[219,794,322],{"class":256},[219,796,797],{"class":325},"'Eksik parametre (path veya tag belirtilmeli)'",[219,799,662],{"class":256},[219,801,802],{"class":294},"400",[219,804,329],{"class":256},[219,806,808,810,812],{"class":221,"line":807},30,[219,809,403],{"class":256},[219,811,406],{"class":239},[219,813,409],{"class":256},[219,815,817,819,821,823,825,827,829,831],{"class":221,"line":816},31,[219,818,303],{"class":239},[219,820,653],{"class":256},[219,822,319],{"class":252},[219,824,322],{"class":256},[219,826,445],{"class":325},[219,828,662],{"class":256},[219,830,435],{"class":294},[219,832,329],{"class":256},[219,834,836],{"class":221,"line":835},32,[219,837,335],{"class":256},[219,839,841],{"class":221,"line":840},33,[219,842,458],{"class":256},[14,844,845],{},"Artık Next.js önbelleğini temizlemenizi sağlayacak bir API uç noktanız oldu. Bu uç noktayı tetikleme mantığınız arka uç (backend) tarafında çözülecektir. Örneğin ben headless WordPress yapımda yeni bir yazı\u002Fsayfa\u002Fkategori eklediğimde ya da güncellediğimde Next.js uç noktasını tetikleyen bir webhook kullanıyorum.",[14,847,848,849,859],{},"Daha fazla bilgi için ",[850,851,858],"a",{"href":852,"rel":853,"target":857},"https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fapp\u002Fbuilding-your-application\u002Fdata-fetching\u002Fincremental-static-regeneration",[854,855,856],"nofollow","noopener","noreferrer","_blank","Next.js Incremental Static Regeneration Dokümantasyonu (İngilizce)"," sayfasını inceleyebilirsiniz.",[86,861],{},[863,864,866],"h5",{"id":865},"bu-yazıda-yapılan-değişiklikler","Bu Yazıda Yapılan Değişiklikler",[22,868,869,872],{},[25,870,871],{},"11.05.2022: Yazı özeti düzenlendi.",[25,873,874,875,467,877,879],{},"21.06.2026: Türkçe imla ve terim kurallarına uygun olarak \"ön bellek\" kelimeleri \"önbellek\" olarak birleştirildi, Next.js marka ismi düzeltildi, modern Next.js App Router (",[38,876,119],{},[38,878,124],{},") revalidation yöntemleri eklenerek kılavuz güncellendi.",[881,882,883],"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 .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":205,"searchDepth":229,"depth":229,"links":885},[886,887,889],{"id":91,"depth":236,"text":92},{"id":191,"depth":229,"text":888},"1. Klasik Yöntem: Pages Router (res.revalidate)",{"id":463,"depth":229,"text":890},"2. Modern Yöntem: App Router (revalidatePath ve revalidateTag)",[892],"technical",null,"2022-11-10","Next.js projelerinde Incremental Static Regeneration (ISR) önbelleğini tetikleyicilerle yenileme. Pages Router ve App Router revalidate yöntemleri.",false,"md","\u002Fimages\u002Fhero\u002Fcache-regeneration.avif",{},"\u002Ftr\u002Fnext-js-on-bellegi-nasil-yenilenir-on-demand-cache-regeneration",{"title":6,"description":895},"next-js-on-bellegi-nasil-yenilenir-on-demand-cache-regeneration","tr\u002Fnext-js-on-bellegi-nasil-yenilenir-on-demand-cache-regeneration","how-to-revalidate-next-js-isr-cache-on-demand-cache-regeneration","2026-06-21","e3uSMcP9Jlq-agyvBFW9As9DktWSCfdce_2j4rsf89w",{"path":908},"\u002Fhow-to-revalidate-next-js-isr-cache-on-demand-cache-regeneration",{"prev":910,"next":913,"others":916,"lucky":1037,"readingTime":273},{"path":911,"title":912},"\u002Ftr\u002Fself-hosted-api-gateway-nasil-kurulur-kapsamli-rehber","Self-Hosted API Gateway Nasıl Kurulur? Kapsamlı Rehber",{"path":914,"title":915},"\u002Ftr\u002Fheadless-wordpress-hakkinda-her-sey","Headless WordPress Hakkında Her Şey",[917,920,923,926,929,932,935,938,941,944,947,950,953,956,959,962,965,968,971,974,977,980,983,986,989,992,995,998,1001,1004,1007,1010,1013,1016,1019,1022,1025,1028,1031,1034],{"path":918,"title":919},"\u002Ftr\u002Fsingleton-tasarim-deseni-nedir","Singleton Tasarım Deseni Nedir?",{"path":921,"title":922},"\u002Ftr\u002Fprogralama-ipucu-yoda-gosterimi","Yoda Koşulları (Yoda Conditions) Nedir? Programlama İpucu",{"path":924,"title":925},"\u002Ftr\u002Faws-ec2-uzerinde-docker-ve-full-stack-web-performansi","AWS EC2 Üzerinde Docker ve Full Stack Web Performansı",{"path":927,"title":928},"\u002Ftr\u002Fmutable-ve-immutable-kavrami","Mutable ve Immutable Kavramları Nedir?",{"path":930,"title":931},"\u002Ftr\u002Flitespeed-web-server-performans-artisi","Konfor Alanından Çıkıp, Konforlu Bir VPS'e Geçmek: LiteSpeed Web Server",{"path":933,"title":934},"\u002Ftr\u002Fgo-ile-websockets-websocket-upgrader-nedir","Go ile WebSockets: Upgrader Nedir?",{"path":936,"title":937},"\u002Ftr\u002Fflyweight-tasarim-deseni-nedir","Flyweight Tasarım Deseni Nedir?",{"path":939,"title":940},"\u002Ftr\u002Fmerhaba-phalcon-framework","Merhaba Phalcon Framework",{"path":942,"title":943},"\u002Ftr\u002Fes13-nedir-ecmascript-2022-nedir","ES13 nedir? ECMAScript 2022 nedir?",{"path":945,"title":946},"\u002Ftr\u002Fchain-of-responsibility-deseni-nedir","Chain of Responsibility Deseni Nedir?",{"path":948,"title":949},"\u002Ftr\u002Flinuxda-golang-kurulumu","Linux'ta Golang Kurulumu",{"path":951,"title":952},"\u002Ftr\u002Frestful-api-bilesenleri","RESTful API Bileşenleri",{"path":954,"title":955},"\u002Ftr\u002Fes9-nedir-ecmascript-2018-nedir","ES9 Nedir? ECMAScript 2018 Nedir?",{"path":957,"title":958},"\u002Ftr\u002Fvisitor-tasarim-deseni-nedir","Visitor Tasarım Deseni Nedir?",{"path":960,"title":961},"\u002Ftr\u002Fes15-nedir-ecmascript-2024-nedir","ES15 nedir? ECMAScript 2024 nedir?",{"path":963,"title":964},"\u002Ftr\u002Fes11-nedir-ecmascript-2020-nedir","ES11 Nedir? ECMAScript 2020 Nedir?",{"path":966,"title":967},"\u002Ftr\u002Ftricolor-garbage-collection-algoritmasi-nedir","Tricolor Garbage Collection Algoritması Nedir?",{"path":969,"title":970},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-abstract-factory-nedir","Abstract Factory Tasarım Deseni Nedir?",{"path":972,"title":973},"\u002Ftr\u002Ftailwind-css-just-in-time-modu","Tailwind CSS Just-in-Time (JIT) Modu Nedir?",{"path":975,"title":976},"\u002Ftr\u002Fdesign-patterns-tasarim-desenleri-nedir","Design Patterns \u002F Tasarım Desenleri nedir?",{"path":978,"title":979},"\u002Ftr\u002Ffacade-tasarim-deseni-nedir","Facade Tasarım Deseni Nedir?",{"path":981,"title":982},"\u002Ftr\u002Fwebpack-nedir","Webpack Nedir? Modern JavaScript Paketleyici Ekosistemi",{"path":984,"title":985},"\u002Ftr\u002Fvite-nedir","Vite Nedir? Modern Web Geliştirme ve Paketleme Aracı",{"path":987,"title":988},"\u002Ftr\u002Ffull-stack-proje-gelistiriyoruz","Full Stack Proje Geliştiriyoruz",{"path":990,"title":991},"\u002Ftr\u002Fes8-nedir-ecmascript-2017-nedir","ES8 Nedir? ECMAScript 2017 Nedir?",{"path":993,"title":994},"\u002Ftr\u002Ffull-stack-proje-agaci","Full-Stack Proje Yol Haritası ve İçindekiler",{"path":996,"title":997},"\u002Ftr\u002Fdocker-ile-mongodb-kurulumu","Docker ile MongoDB Kurulumu",{"path":999,"title":1000},"\u002Ftr\u002Fdigital-oceanda-vps-kurulumu","DigitalOcean'da VPS (Droplet) Kurulumu: Adım Adım Rehber",{"path":1002,"title":1003},"\u002Ftr\u002Fdocker-ile-rabbitmq-kurulumu","Docker ile RabbitMQ Kurulumu",{"path":1005,"title":1006},"\u002Ftr\u002Fekran-filtresi-mavi-isik-filtresi-flux","Gözlere dost, mavi ışığa düşman ekran filtresi f.lux",{"path":1008,"title":1009},"\u002Ftr\u002Frabbitmq-nedir","RabbitMQ Nedir?",{"path":1011,"title":1012},"\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir","Template Method Tasarım Deseni Nedir?",{"path":1014,"title":1015},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-factory-method-nedir","Factory Method Tasarım Deseni Nedir?",{"path":1017,"title":1018},"\u002Ftr\u002Ffactory-method-ve-abstract-factory-farki-nedir","Factory Method ve Abstract Factory Farkı Nedir?",{"path":1020,"title":1021},"\u002Ftr\u002Fgo-veri-tipleri-map","Go Veri Tipleri - Map",{"path":1023,"title":1024},"\u002Ftr\u002Frest-api-hata-yonetimi","REST Api Hata Yönetimi",{"path":1026,"title":1027},"\u002Ftr\u002Fgoda-iota-nedir-iota-ne-zaman-ve-nerede-kullanilir","Go'da iota Nedir? iota Ne Zaman ve Nerede Kullanılır?",{"path":1029,"title":1030},"\u002Ftr\u002Fmerhabadunya","Merhaba Dünya",{"path":1032,"title":1033},"\u002Ftr\u002Fjwt-guvenli-mi-guvenlik-acigi-olusturmayin","JWT Güvenli Derken Güvenlik Açığı Oluşturmayın",{"path":1035,"title":1036},"\u002Ftr\u002Frest-api-kimlik-dogrulama-nasil-yapilir","REST API Kimlik Doğrulama Nasıl Yapılır?",{"path":1038,"title":1039},"\u002Ftr\u002Ftemiz-moduler-ve-yeniden-kullanilabilir-php-kodu-yazma-rehberi","PHP'de Temiz, Modüler ve Yeniden Kullanılabilir Kod Yazma Rehberi",[],[1042,1046,1050],{"path":1043,"title":1044,"date":1045},"\u002Ftr\u002Fwordpress-yonetici-sifresini-wp-cli-kullanarak-sifirlama","WordPress Yönetici Şifresini WP-CLI Kullanarak Sıfırlama","2023-07-02",{"path":1047,"title":1048,"date":1049},"\u002Ftr\u002Fprototype-tasarim-deseni-nedir","Prototype Tasarım Deseni Nedir?","2021-08-16",{"path":1051,"title":1052,"date":1053},"\u002Ftr\u002Fdocker-ile-mariadb-kurulumu","Docker ile MariaDB Kurulumu","2021-03-01",1782142000270]