Preview Mode
Not: Bu özelliğin yerini Taslak Modu almıştır.
Examples
- WordPress Örneği(Demo)
- DatoCMS Örnek(Demo)
- TakeShape Örnek(Demo)
- Akıllılık Örneği(Demo)
- Prismic Örnek(Demo)
- Contentful Örnek(Demo)
- Strapi Örneği(Demo)
- Prepr Örneği(Demo)
- Agility CMS Örnek(Demo)
- Kozmik Örnek(Demo)
- ButterCMS Örnek(Demo)
- Storyblok Örneği(Demo)
- GraphCMS Örnek(Demo)
- Kontent Örneği(Demo)
- Umbraco Heartcore Örneği(Demo)
- Plazmik Örnek(Demo)
- Enterspeed Örnek(Demo)
- Makeswift Örnek(Demo)
Sayfalar belgesinde ve Veri Getirme belgesinde, getStaticProps ve getStaticPaths adreslerini kullanarak derleme zamanında bir sayfanın nasıl önceden oluşturulacağından(Statik Oluşturma) bahsettik.
Statik Oluşturma, sayfalarınız başsız bir CMS'den veri aldığında kullanışlıdır. Ancak, başsız CMS'nizde bir taslak yazarken ve taslağı hemen sayfanızda önizlemek istediğinizde ideal değildir. Next.js'nin bu sayfaları derleme zamanı yerine istek zamanında oluşturmasını ve yayınlanan içerik yerine taslak içeriği getirmesini istersiniz. Next.js'nin Statik Üretimi yalnızca bu özel durum için atlamasını istersiniz.
Next.js, bu sorunu çözen Önizleme Modu adlı bir özelliğe sahiptir. İşte nasıl kullanılacağına dair talimatlar.
Step 1: Create and access a preview API route
Next.js API Routes'a aşina değilseniz önce API Routes belgelerine göz atın.
İlk olarak, bir önizleme API rotası oluşturun. Herhangi bir isme sahip olabilir - örneğin pages/api/preview.js (veya TypeScript kullanıyorsanız .ts ).
Bu API rotasında, yanıt nesnesi üzerinde setPreviewData adresini çağırmanız gerekir. setPreviewData için argüman bir nesne olmalıdır ve bu getStaticProps tarafından kullanılabilir (bu konuda daha sonra daha fazla bilgi verilecektir). Şimdilik {} adresini kullanacağız.
export default function handler(req, res) {
// ...
res.setPreviewData({})
// ...
}res.setPreviewData tarayıcıda önizleme modunu açan bazı çerezler ayarlar. Next.js'ye bu çerezleri içeren tüm istekler önizleme modu olarak kabul edilecek ve statik olarak oluşturulan sayfaların davranışı değişecektir (bu konuda daha sonra daha fazla bilgi verilecektir).
Aşağıdaki gibi bir API rotası oluşturarak ve tarayıcınızdan manuel olarak erişerek bunu manuel olarak test edebilirsiniz:
// simple example for testing it manually from your browser.
export default function handler(req, res) {
res.setPreviewData({})
res.end('Preview mode enabled')
}Tarayıcınızın geliştirici araçlarını açıp /api/preview adresini ziyaret ederseniz, bu istek üzerine __prerender_bypass ve __next_preview_data çerezlerinin ayarlanacağını fark edeceksiniz.
Securely accessing it from your Headless CMS
Pratikte, bu API rotasını başsız CMS'nizden güvenli bir şekilde çağırmak istersiniz. Belirli adımlar hangi başsız CMS'yi kullandığınıza bağlı olarak değişecektir, ancak burada atabileceğiniz bazı genel adımlar vardır.
Bu adımlar, kullandığınız headless CMS'nin özel önizleme URL'leri ayarlamayı desteklediğini varsaymaktadır. Desteklemiyorsa, önizleme URL'lerinizi güvence altına almak için bu yöntemi yine de kullanabilirsiniz, ancak önizleme URL'sini manuel olarak oluşturmanız ve erişmeniz gerekir.
İlk olarak, seçtiğiniz bir token oluşturucuyu kullanarak gizli bir token dizesi oluşturmalısınız. Bu sır yalnızca Next.js uygulamanız ve başsız CMS'niz tarafından bilinecektir. Bu sır, CMS'nize erişimi olmayan kişilerin önizleme URL'lerine erişmesini engeller.
İkinci olarak, başsız CMS'niz özel önizleme URL'leri ayarlamayı destekliyorsa, önizleme URL'si olarak aşağıdakini belirtin. Bu, önizleme API rotanızın pages/api/preview.js adresinde bulunduğunu varsayar.
https://<your-site>/api/preview?secret=<token>&slug=<path><your-site>dağıtım alanınız olmalıdır.<token>oluşturduğunuz gizli belirteç ile değiştirilmelidir.<path>önizlemek istediğiniz sayfanın yolu olmalıdır. Önizleme yapmak istiyorsanız/posts/foo, o zaman&slug=/posts/fookullanmalısınız.
Başlıksız CMS'niz önizleme URL'sine bir değişken eklemenize izin verebilir, böylece <path> CMS'nin verilerine göre dinamik olarak şu şekilde ayarlanabilir: &slug=/posts/{entry.fields.slug}
Son olarak, önizleme API rotasında:
- Gizli bilginin eşleşip eşleşmediğini ve
slugparametresinin var olup olmadığını kontrol edin (yoksa istek başarısız olmalıdır). res.setPreviewDataadresini arayın.- Ardından tarayıcıyı
slugtarafından belirtilen yola yönlendirin. (Aşağıdaki örnekte 307 yönlendirmesi kullanılmıştır ).
export default async (req, res) => {
// Check the secret and next parameters
// This secret should only be known to this API route and the CMS
if (req.query.secret !== 'MY_SECRET_TOKEN' || !req.query.slug) {
return res.status(401).json({ message: 'Invalid token' })
}
// Fetch the headless CMS to check if the provided `slug` exists
// getPostBySlug would implement the required fetching logic to the headless CMS
const post = await getPostBySlug(req.query.slug)
// If the slug doesn't exist prevent preview mode from being enabled
if (!post) {
return res.status(401).json({ message: 'Invalid slug' })
}
// Enable Preview Mode by setting the cookies
res.setPreviewData({})
// Redirect to the path from the fetched post
// We don't redirect to req.query.slug as that might lead to open redirect vulnerabilities
res.redirect(post.slug)
}Başarılı olursa, tarayıcı önizleme modu çerezleri ayarlanmış olarak önizleme yapmak istediğiniz yola yönlendirilecektir.
Step 2: Update getStaticProps
Bir sonraki adım, önizleme modunu desteklemek için getStaticProps adresini güncellemektir.
Önizleme modu çerezleri ayarlanmış olarak getStaticProps adresine sahip bir sayfa talep ederseniz ( res.setPreviewData aracılığıyla), getStaticProps istek anında (derleme zamanı yerine) çağrılacaktır.
Ayrıca, context nesnesi ile çağrılacaktır:
context.previewtrueolacaktır.context.previewDatasetPreviewDataiçin kullanılan argümanla aynı olacaktır.
export async function getStaticProps(context) {
// If you request this page with the preview mode cookies set:
//
// - context.preview will be true
// - context.previewData will be the same as
// the argument used for `setPreviewData`.
}Önizleme API rotasında res.setPreviewData({}) kullandık, bu nedenle context.previewData {} olacaktır. Gerekirse oturum bilgilerini önizleme API rotasından getStaticProps adresine aktarmak için bunu kullanabilirsiniz.
Ayrıca getStaticPaths adresini kullanıyorsanız, context.params adresi de kullanılabilir olacaktır.
Fetch preview data
getStaticProps adresini, context.preview ve/veya context.previewData adreslerine dayalı olarak farklı verileri getirecek şekilde güncelleyebilirsiniz.
Örneğin, headless CMS'niz taslak gönderiler için farklı bir API uç noktasına sahip olabilir. Eğer öyleyse, API uç noktası URL'sini aşağıdaki gibi değiştirmek için context.preview adresini kullanabilirsiniz:
export async function getStaticProps(context) {
// If context.preview is true, append "/preview" to the API endpoint
// to request draft data instead of published data. This will vary
// based on which headless CMS you're using.
const res = await fetch(`https://.../${context.preview ? 'preview' : ''}`)
// ...
}İşte bu kadar! Headless CMS'nizden veya manuel olarak önizleme API rotasına ( secret ve slug ile) erişirseniz, artık önizleme içeriğini görebilmeniz gerekir. Ve taslağınızı yayınlamadan güncellerseniz, taslağı önizleyebilmeniz gerekir.
Bunu headless CMS'nizde önizleme URL'si olarak ayarlayın veya manuel olarak erişin ve önizlemeyi görebilmeniz gerekir.
https://<your-site>/api/preview?secret=<token>&slug=<path>More Details
Bilmekte fayda var:
next/routeroluşturma sırasında birisPreviewbayrağı gösterir, daha fazla bilgi için yönlendirici nesnesi belgelerine bakın.
Specify the Preview Mode duration
setPreviewData bir options nesnesi olması gereken isteğe bağlı bir ikinci parametre alır. Aşağıdaki anahtarları kabul eder:
maxAge: Önizleme oturumunun ne kadar süreceğini (saniye cinsinden) belirtir.path: Çerezin altında uygulanması gereken yolu belirtir. Varsayılan değer olarak/tüm yollar için önizleme modunu etkinleştirir.
setPreviewData(data, {
maxAge: 60 * 60, // The preview mode cookies expire in 1 hour
path: '/about', // The preview mode cookies apply to paths with /about
})Clear the Preview Mode cookies
Varsayılan olarak, Önizleme Modu çerezleri için herhangi bir son kullanma tarihi ayarlanmamıştır, bu nedenle tarayıcı kapatıldığında önizleme oturumu sona erer.
Önizleme Modu çerezlerini manuel olarak temizlemek için clearPreviewData() adresini çağıran bir API rotası oluşturun:
export default function handler(req, res) {
res.clearPreviewData({})
}Ardından, API Rotasını çağırmak için /api/clear-preview-mode-cookies adresine bir istek gönderin. Bu rotayı kullanarak çağırıyorsanız next/linkbağlantı ön-getirme sırasında clearPreviewData adresinin çağrılmasını önlemek için prefetch={false} adresini geçmelisiniz.
setPreviewData çağrısında bir yol belirtilmişse, aynı yolu clearPreviewData adresine de aktarmanız gerekir:
export default function handler(req, res) {
const { path } = req.query
res.clearPreviewData({ path })
}previewData size limits
Bir nesneyi setPreviewData adresine aktarabilir ve getStaticProps adresinde kullanılabilir olmasını sağlayabilirsiniz. Ancak, veriler bir çerezde saklanacağı için bir boyut sınırlaması vardır. Şu anda, önizleme verileri 2KB ile sınırlıdır.
Works with getServerSideProps
Önizleme modu getServerSideProps üzerinde de çalışır. Ayrıca preview ve previewData adreslerini içeren context nesnesinde de kullanılabilir.
Bilmekte fayda var: Önizleme Modunu kullanırken
Cache-Controlbaşlığını ayarlamamalısınız çünkü atlanamaz. Bunun yerine ISR kullanmanızı öneririz.
Works with API Routes
API Rotaları, istek nesnesi altında preview ve previewData adreslerine erişebilecektir. Örneğin:
export default function myApiRoute(req, res) {
const isPreview = req.preview
const previewData = req.previewData
// ...
}Unique per next build
next build tamamlandığında hem bypass çerez değeri hem de previewData şifrelemek için kullanılan özel anahtar değişir. Bu, bypass çerezinin tahmin edilememesini sağlar.
Bilmekte fayda var: Önizleme Modunu HTTP üzerinden yerel olarak test etmek için tarayıcınızın üçüncü taraf çerezlerine ve yerel depolama erişimine izin vermesi gerekir.