Angular'da SEO
Angular uygulamalarını taranabilir ve dizine eklenebilir hâle getirme: @angular/ssr ile önceden oluşturma ve hibrit oluşturma karşılaştırması, hydration, Title/Meta servisleri, History API yönlendirmesi ve Googlebot'un gerçekten oluşturduğu içeriği test etme.
Diller
Angular'da SEO aslında tek bir karardır: istemci tarafından oluşturulan bir kabuk yerine gerçek HTML sunmak. Modern Angular (v17+) SSR'yi @angular/ssr olarak CLI'ye yerleşik getirir; statik rotaları önceden, dinamikleri sunucuda oluşturun, hibrit yapı kullanın ve sunucu HTML'si yeniden oluşturulmak yerine yeniden kullanılsın diye hydration uygulayın. Ardından temel işleri tamamlayın: Angular'ın Title ve Meta servisleriyle benzersiz başlık ve açıklamalar, HTML5 History yönlendirmesi (hash URL'ler asla değil), gerçek <a href> bağlantıları ve URL Inspection ile doğrulama. Dinamik oluşturma bir strateji değil, geçici bir çözümdür; AngularJS ise farklı bir çerçevedir.
TL;DR — Angular varsayılan olarak sayfayı tarayıcıda JavaScript ile oluşturur; bu nedenle bir arama motorunun ilk gördüğü ham HTML neredeyse boştur. Çözüm, Angular’ın yerleşik sunucu taraflı oluşturmasını (
@angular/ssr) veya önceden oluşturmayı kullanarak gerçek, tamamlanmış HTML göndermektir. Ardından her sayfaya benzersiz başlık ve açıklama ekleyin, temiz URL’ler kullanın (#olmadan) ve gerçek<a href>bağlantıları verin.
Sorun tek cümlede
Varsayılan bir Angular uygulaması tarayıcıya küçük bir HTML kabuğu — temelde boş bir
<div> — ve büyük bir JavaScript paketi gönderir. Tarayıcınız bu JavaScript’i çalıştırır ve
ardından sayfa içerikle dolar. Buna istemci taraflı oluşturma (CSR) denir.
Sorun şu: Bir arama motoru bu URL’yi ilk indirdiğinde boş kabuğu görür. Google gerçek içeriği görmek için JavaScript’i çalıştırabilir, ancak bunu daha sonra ayrı bir adımda ve her zaman güvenilir biçimde yapmaz. Evidence for this claim Google can render JavaScript but processes rendering as a stage after crawling. Scope: Google Search rendering; other crawler behavior is not covered by this record. Confidence: high · Verified: Google: JavaScript SEO basics Diğer tarayıcılar — Bing ve sosyal önizlemelerin arkasındaki botlar — çoğu zaman JavaScript’i hiç çalıştıramaz. Bu yüzden hiçbir şey göremezler.
Çözüm: tamamlanmış HTML gönderin
Sayfayı tarayıcıya (veya arama botuna) oluşturtmak yerine onu önceden ya da bir sunucuda oluşturup tamamlanmış HTML’i gönderirsiniz. Angular bunun için iki ana yol sunar:
- Sunucu taraflı oluşturma (SSR) — Sunucu her istek için Angular’ı çalıştırır ve tam sayfayı geri gönderir. Sık değişen içerikler için uygundur. Evidence for this claim Angular supports server-side rendering and build-time prerendering through its SSR tooling. Scope: Current Angular SSR and prerender features. Confidence: high · Verified: Angular: Server-side and hybrid rendering
- Önceden oluşturma — Angular, sayfalarınız için derleme sırasında statik HTML dosyaları üretir; sunucu gerekmez. En hızlı seçenektir ve blog yazılarıyla pazarlama sayfaları için idealdir.
Modern Angular (sürüm 17 ve sonrası) bu iki yaklaşımı da araç setine yerleştirir. Tek bir
komutla ekleyebilirsiniz: ng add @angular/ssr. Eski Angular Universal adını duymuş
olabilirsiniz — aynı fikrin ayrı bir eklenti olarak sunulan hâliydi. Angular bunu v17’de
çekirdeğe aldı ve yeniden adlandırdı.
Diğer temel işler
- Her sayfaya benzersiz başlık ve açıklama verin. Angular bunu sizin yerinize yapmaz;
kodda Angular’ın yerleşik
TitleveMetaservisleriyle ayarlarsınız. Aksi hâlde her sayfa aynı başlığı paylaşır. - Hash URL’ler yerine temiz URL’ler kullanın. Angular’ın varsayılan yönlendirmesi
/products/shoesgibi düzgün URL’ler üretir. Eski “hash” biçiminden (/#/products) kaçının; arama motorları#işaretinden sonraki bölümü güvenilir biçimde işleyemez. - Gerçek bağlantılar kullanın. Gezinme, düğme veya tıklama işleyicileri değil gerçek
<a href>bağlantıları olmalıdır; yoksa Google bunları izleyemez.
İnsanların en sık yanıldığı nokta
“Google Angular’ı dizine ekleyemez” bir mittir — JavaScript’i oluşturabilir. Ancak gerçek HTML göndermekten daha yavaş ve daha az güvenilirdir; Google dışındaki tarayıcılar bunu hiç yapamaz. Bu nedenle bulunmasını istediğiniz her şeyi sunucuda oluşturun veya önceden oluşturun.
Daha derin sürümde rota başına hibrit oluşturma, hydration, kodla SEO servisleri ve Google’ın gerçekte ne gördüğünü test etme anlatılıyor. Advanced sekmesine geçin.
Evidence for this claim Modern Angular documents @angular/ssr as its server-side and hybrid rendering package. Scope: Current Angular documentation; historical Angular Universal details are not required for this claim. Confidence: high · Verified: Angular: Server-side and hybrid renderingTL;DR — Angular SEO, birçok rol üstlenen tek bir mimari karardır: istemci kabuğu yerine yanıta gerçek HTML koyun. Modern Angular (v17+), yeniden adlandırılmış ve bütünleşik Angular Universal halefi olan
@angular/ssrile SSR’yi CLI’ye ekler. Statik rotaları önceden, dinamikleri sunucuda oluşturun; hibrit oluşturmayla ikisini birleştirin ve sunucu HTML’si yeniden oluşturulmak yerine kullanılsın diye hydration uygulayın. ArdındanTitle/Metaservisleri (veya yönlendiricininTitleStrategy’si) ile benzersiz başlık/açıklamalar, HTML5 History yönlendirmesi —HashLocationStrategyasla değil — gerçek<a href>bağlantıları, güvenli JSON-LD ve URL Inspection doğrulaması ekleyin. Dinamik oluşturma, Google’ın kabul ettiği bir geçici çözümdür; strateji değildir.
Varsayılan sorun: istemci taraflı oluşturma
Standart bir Angular derlemesi, gövdesi esasen <app-root></app-root> öğesiyle komut dosyası etiketlerinden oluşan bir index.html gönderir. JavaScript çalıştırılmadığında tarayıcı botu hiçbir başlık, metin veya bağlantı göremez; içerik, paket yüklendikten sonra tarayıcıda oluşturulur. Bu, JavaScript SEO yazısında anlattığım temel sorunla aynıdır: Web, düz HTML’den uzaklaştı ve CSR bu yelpazenin en riskli ucudur.
(Bu rehberin uygulama ayrıntıları — RenderMode API’leri, hydration tetikleyicileri ve event replay — Angular v22’yi yansıtır. Aşağıdaki sürüme özgü özellikler tarihlidir: v17 SSR yeniden adlandırması, v18 event replay ve v19–v20 artımlı hydration.)
CSR üç farklı SEO sorunu oluşturur:
- Gecikmiş ve daha az güvenilir dizine ekleme. Google, JS uygulamalarını üç aşamada işler — “Tarama, Oluşturma ve Dizine Ekleme” — ve oluşturma işlemi bir kuyruğa ertelenir. Bu oluşturma işlemi gerçekleşene kadar içeriğiniz dizine eklenmek üzere mevcut değildir.
- Daha kötü Core Web Vitals. Tarayıcının anlamlı içeriği görüntülemeden önce bir paketi indirip çalıştırması gerektiğinden LCP olumsuz etkilenir.
- Google dışındaki tarayıcı botları kabuğu görür. Bingbot, JS oluşturma konusunda çok daha tutarsızdır; sosyal medya ve bağlantı önizleme botları ise genellikle hiç oluşturma yapmaz. Bu nedenle istemci tarafında eklenen Open Graph etiketleri ve içerik onlara ulaşmaz.
Googlebot bir Angular uygulamasını gerçekte nasıl işler?
Googlebot evergreen’dir; Chrome’un güncel V8 motor sürümüyle oluşturur ve Chrome sürümleriyle birlikte güncellenir. Evidence for this claim Googlebot uses an evergreen version of Chromium for rendering. Scope: Google Search rendering engine; this does not remove application-level rendering risks. Confidence: high · Verified: Google: Evergreen Googlebot Bu nedenle Angular’ı çalıştırabilir; ancak tasarımda hesaba katılması gereken sert sınırlar vardır:
- Oluşturma kuyruğa alınır, anında yapılmaz. Google ayrı tarama, oluşturma ve dizine ekleme aşamalarını belgeler; oluşturmanın taramaya yetişmesinin ne kadar sürdüğüne dair sabit bir takvim yayımlamaz. Sektörün “iki dalga” dediği şey budur: önce ham HTML (CSR Angular için boş kabuk), oluşturma çalıştığında daha sonra oluşturulmuş DOM dizine eklenir. SSR/önceden oluşturma beklemeyi ortadan kaldırır; ilk getirmede HTML tamamdır.
- Oluşturucu durumsuzdur. Yüklemeler arasında çerez,
localStorageveyasessionStoragetaşımaz; izin istemlerini reddeder. İçeriği istemci durumuna bağlamayın. - Tıklamaz veya kaydırmaz ve çok uzun bir görüntü alanında oluşturur. Etkileşimin arkasındaki içerik görülmez.
- Kaynaklar agresif biçimde önbelleğe alınır — güncellenmiş paketlerin eski sunulmaması için
içerik parmak izli dosya adları (Angular’ın varsayılanı
main.<hash>.js) kullanın.
@angular/ssr — nedir, adlandırma geçmişi
Sunucu taraflı oluşturma Angular’ı her istek için bir Node sunucusunda çalıştırır ve tarayıcının ardından hydrate ettiği (yeniden oluşturmak yerine mevcut DOM’a olay dinleyicileri eklediği) tam oluşturulmuş HTML döndürür. Googlebot, Bingbot ve sosyal botlar ikinci dalgaya gerek kalmadan ilk istekte tam HTML alır.
Adlandırma sık karıştırılıyor; bu yüzden net olalım: “Angular Universal” tarihî SSR
çözümüydü ve harici bir paket (@nguniversal/express-engine) olarak dağıtılıyordu. Angular
v17 (Kasım 2023) ile SSR doğrudan Angular CLI ve Application Builder’a entegre edildi ve
@angular/ssr olarak yeniden adlandırıldı; Angular Universal deposu artık bakım modunda.
Evidence for this claim Modern Angular documents @angular/ssr as its server-side and hybrid rendering package. Scope: Current Angular documentation; historical Angular Universal details are not required for this claim. Confidence: high · Verified: Angular: Server-side and hybrid rendering Kurulum artık tek satırdır:
# New project with SSR enabled
ng new my-app --ssr
# Add SSR to an existing project
ng add @angular/ssrBu, eski ng add @nguniversal/express-engine komutunun yerini alır. Fikir aynıdır; artık Angular tarafından doğrudan desteklenen araçlarla sunulur.
Önceden oluşturma (statik üretim / SSG)
Önceden oluşturma, rotalar için derleme zamanında statik HTML üretir; bu nedenle istek
sırasında sunucu çalışmaz — CDN’e dağıtabilirsiniz. En hızlı TTFB/FCP/LCP’yi ve en düşük
işletim maliyetini sağlar. v17+ sürümlerinde bunu bir sunucu rotaları dosyasında
(app.routes.server.ts) RenderMode.Prerender ile rota bazında yapılandırırsınız; outputMode: 'static' tamamen statik bir uygulama üretir.
Kısıt şudur: Veriler derleme zamanında mevcut olmalı, kullanıcıya özel içerik bulunmamalı ve çok büyük siteler yavaş derlemeler anlamına gelir. Bu yöntem pazarlama sayfaları, belgeler ve blog yazıları için idealdir — tam da sıralanması ve kaynak gösterilmesi en çok gereken içerik.
Hibrit oluşturma — rota başına bir mod seçin
v17+ ile gelen büyük yenilik, oluşturma modunun app.routes.server.ts içinde yapılandırılan
rota başına bir karar olmasıdır:
RenderMode.Prerender— statik rotalar (ana sayfa, hakkında, blog yazıları).RenderMode.Server— dinamik, istek başına rotalar (arama sonuçları, güncel verili panolar).RenderMode.Client— zaten dizine eklenmesini istemediğiniz yalnızca iç rotalar (yönetim arayüzleri, yalnızca kimlik doğrulamalı ekranlar). CSR burada gerçekten uygundur.
Pratik karar kuralı şudur: statik olanı önceden oluşturun, güncel kalması gerekeni sunucuda oluşturun ve yalnızca dizinde bulunmaması gereken şeylerde istemci taraflı oluşturmaya dönün.
Hydration — CLS’yi bozan tuzak
Naif SSR’nin bir kusuru vardır: sunucu HTML’yi gönderir, ardından tarayıcı onu atıp
baştan oluşturur; bu da bir titreme ve boşa giden iş yaratır. Hydration bunu düzeltir:
tarayıcı sunucuda oluşturulan uygulamayı geri yükler ve eşleşen DOM’u yok edip yeniden
oluşturmak yerine yalnızca etkileşimi bağlar. app.config.ts içinde etkinleştirin:
provideClientHydration()Ön koşul: hydration, SSR’nin istemci tarafındaki tamamlayıcısıdır; tek başına açılan bir
anahtar değildir. provideClientHydration() yalnızca zaten sunucuda veya önceden oluşturulmuş
bir rotada işe yarar; RenderMode.Client rotasının kabuğunu sunucu HTML’sine çeviremez.
Önce rota için SSR/önceden oluşturmayı etkinleştirin.
İki yeni yetenek SEO’ya komşu kullanıcı deneyimi açısından önemlidir; hiçbiri arama dizine eklemeyi değiştirmez:
- Event replay (v18+): Hydration tamamlanmadan önce gerçekleşen desteklenen kullanıcı etkileşimlerini yakalar ve tamamlandıktan sonra yeniden oynatır. Desteklediği etkileşimlerde tıklama kaybını azaltır; bu bir UX/etkileşim özelliğidir, SEO özelliği değildir ve Google’ın neyi dizine eklediğini değiştirmez.
- Artımlı hydration (v19 geliştirici ön izlemesi, v20’de kararlı): SSR, hydration,
ertelenebilir görünümler ve event replay’in birlikte kullanılmasına bağlıdır; tek başına
bir özellik değildir.
@deferbloklarının hydrate triggers’ı, ilk oluşturma sırasında hangi sınırların hydration olmadan kalacağını belirler.hydrate neversınırı ilk yüklemede hydration olmadan kalır; ancak sonraki istemci oluşturma işlemlerinde (ör. rota değişiminden sonra) bağımlılıkların yüklenmesini zorunlu olarak engellemez. SEO etkisi dolaylıdır: başlangıçta daha az JavaScript hydrate etmek LCP’ye yardımcı olabilir, ancak tetikleyici yapılandırması tarayıcı zamanlaması değil oluşturma ayrıntısıdır.
Kritik tuzak: @if (isPlatformBrowser(...)) ifadesini doğrudan şablona koymak, sunucu ve
istemcinin farklı işaretleme oluşturmasına — bir hydration uyuşmazlığına — ve bunun sonucunda
düzen kayması ile CLS’ye yol açar. Şablonda platforma göre dallanmak yerine tarayıcıya özgü
çalışma için afterNextRender() kullanın.
Başlık ve meta etiketleri — Angular’ın yerleşik servisleri
Angular <title> öğesinin metnine doğrudan bağlanamaz; bu nedenle head etiketlerini
@angular/platform-browser içindeki iki servisle yönetin:
Title—setTitle()/getTitle().Meta—name='description'veyaproperty='og:title'gibi seçicilerleaddTag(),addTags(),updateTag(),getTag(),removeTag().
Temel işler için üçüncü taraf kütüphaneye ihtiyacınız yoktur. Paylaşılan bir SEO servisi temiz bir kalıptır:
@Injectable({ providedIn: 'root' })
export class SeoService {
private title = inject(Title);
private meta = inject(Meta);
updatePage(title: string, description: string) {
this.title.setTitle(title);
this.meta.updateTag({ name: 'description', content: description });
this.meta.updateTag({ property: 'og:title', content: title });
}
}Başlıklar için yönlendiricinin TitleStrategy’si (Angular v14+) rota yapılandırmasında
title ayarlamanıza ve gezinmede sayfa başlığını otomatik güncellemenize izin verir; bileşen
başına kod gerekmez. document.title = ... ifadesini elle ayarlamayın; SSR altında doğru
çalışması için Title servisini kullanın.
URL yapısı
- Varsayılan HTML5 History API yönlendirmesini kullanın (
PathLocationStrategy) —/products/shoesgibi temiz URL’ler elde edersiniz. Bunun içinindex.htmldosyasında<base href="/">bulunmalıdır. - Kamuya açık içerikte
HashLocationStrategy/useHash: truekullanmayın.#işaretinden sonraki parça tanımlayıcıları HTTP isteğinden önce çıkarılır; dolayısıyla sunucu bunları hiç görmez ve Googlebot#/productsyolunu güvenilir biçimde çözümleyemez. Tüm siteniz tek bir URL’ye indirgenebilir. - Tembel yüklenen rotalar dâhil, gezinme için gerçek
<a href>bağlantıları kullanın. Tembel yükleme performans açısından uygundur; ancak bu rotalara giden bağlantılar tıklama işleyicileri değil, taranabilir bağlantılar olmalıdır.
Yapılandırılmış veri (JSON-LD)
Google, JSON-LD’nin JavaScript ile eklenmesini destekler. Sağlam Angular kalıbı; global document nesnesine doğrudan erişmek yerine Angular’ın DOCUMENT enjeksiyon belirtecini kullanarak bir <script type="application/ld+json"> öğesi oluşturan ve bunu document.head içine ekleyen bir servistir. Global erişim sunucuda çalışmaz. Tüm şemayı tek bir yerde tutun; statik HTML ile oluşturulmuş DOM arasında bölmeyin ve Zengin Sonuçlar Testi ile URL Inspection kullanarak doğrulayın.
Dinamik oluşturma — eski bir geçici çözüm, plan değil
Dinamik oluşturma, botlara Puppeteer, Rendertron veya prerender.io aracılığıyla önceden oluşturulmuş bir sürüm; kullanıcılara ise tam SPA sunar. Google, “dynamic rendering is a workaround and not a long-term solution,” (Türkçe çeviri) “dinamik oluşturma geçici bir çözümdür; uzun vadeli bir çözüm değildir,” ifadesini açıkça kullanır ve “better solutions than dynamic rendering” (Türkçe çeviri) “dinamik oluşturmadan daha iyi çözümler” bulunduğunu belirtir — bunlar sunucu taraflı oluşturma, statik oluşturma veya hydration’dır. Büyük ölçüde benzer içerik sunduğunuz sürece bu yaklaşım otomatik olarak cloaking sayılmaz; ancak ek bir oluşturma sunucusu gerektirir, içerik sapması riski yaratır ve gerçek kullanıcıların Core Web Vitals değerlerine hiçbir katkı sağlamaz. Yeni bir Angular uygulamasında bunun yerine @angular/ssr veya önceden oluşturmayı tercih edin.
Yaygın Angular SEO hataları
- Hash yönlendirmesi (
#URL’leri) — tüm site tek bir URL gibi görünür. Title/Metaçağrılarının olmaması — her sayfa aynı başlık ve açıklamayı paylaşır.- SSR/önceden oluşturmanın olmaması — içerik yalnızca ertelenmiş oluşturma dalgasından sonra mevcut olur.
robots.txtiçinde.js/.cssdosyalarını engellemek — Google sayfayı oluşturamaz ve boş bir kabuğu dizine ekler.- Bulunamadı görünümünde
200döndürmek — soft 404 oluşturur; gerçek bir404döndürün veyanoindexekleyin. Titleservisi yerinedocument.title = ...kullanmak.- Şablondaki
@ifiçindeisPlatformBrowser()kullanmak — hydration uyuşmazlığı → CLS. - Sunucuda çalışan kodda
window/localStorage/documentnesnelerine erişmek — SSR çöker. - Şemayı ham HTML ile oluşturulmuş DOM arasında bölmek.
- URL Inspection yerine yerel geliştirme ortamında test etmek — Googlebot’a değil varsayımlara güvenmek.
Angular SEO’yu test etme
- URL Inspection (Search Console) doğruluk kaynağıdır: Taranan sayfa görünümü, Googlebot JavaScript’i çalıştırdıktan sonraki ve dizine eklenen oluşturulmuş HTML’yi gösterir; ayrıca JS konsol iletilerini ve engellenen kaynakları sunar. İsteğe bağlı bir oluşturma işlemi için Canlı Test çalıştırın.
- JavaScript öncesindeki ham HTML’yi görmek için URL’yi
curlile çekin — boş bir kabuk, SSR kullanılmayan CSR anlamına gelir. - Zengin Sonuçlar Testi yapılandırılmış veriyi doğrular.
- Ahrefs Site Audit (JS oluşturma açık) ve Screaming Frog (JS modu), ham DOM ile oluşturulmuş DOM arasındaki farkları büyük ölçekte karşılaştırır.
- Lighthouse / PageSpeed Insights, oluşturma tercihinizin Core Web Vitals üzerindeki etkisini ölçer.
Angular SEO için kötü değildir; yalnızca farklıdır. Yanıta gerçek HTML koyun, head etiketlerini yönetin, URL’leri ve bağlantıları taranabilir tutun ve neyin oluşturulduğuna Google’ın araçlarının karar vermesine izin verin. Bu konu JavaScript SEO ve bu kümedeki headless CMS oluşturma sorularıyla yan yana durur; hepsindeki temel ders aynıdır: oluşturma modu neredeyse her şeyi belirler.
AI özeti
Gelişmiş sürümün kısa özeti:
- Angular’ın varsayılanı istemci taraflı oluşturmadır (CSR) — neredeyse boş bir HTML kabuğu gönderilir. Bu, dizine eklemenin gecikmesine ve güvenilmez olmasına, daha kötü LCP’ye ve Google dışındaki tarayıcıların (Bing, sosyal botlar) hiçbir şey görememesine yol açar.
- Googlebot evergreen’dir ve JS çalıştırır, ancak oluşturma kuyruğa alınır (“iki dalga”: önce ham HTML, sonra oluşturulmuş DOM; sabit bir takvim yoktur), durumsuzdur (çerez ve depolama yoktur), tıklamaz/kaydırmaz ve kaynakları agresif biçimde önbelleğe alır. SSR/önceden oluşturma bu beklemeyi ortadan kaldırır: ilk getirmede HTML tamamdır.
@angular/ssrmodern çözümdür — SSR, v17’den beri Angular CLI’ye eklenmiştir ve harici Angular Universal paketinin (@nguniversal/express-engine) yerini almıştır. Kurulum:ng new --ssrveyang add @angular/ssr.- Önceden oluşturma (derleme zamanında statik HTML) en hızlı ve CDN’e dağıtılabilir seçenektir; statik pazarlama, blog ve belge içerikleri ile sınırlı derleme zamanı verileri için idealdir.
- Hibrit oluşturma
app.routes.server.tsiçinde rota başına mod belirler:RenderMode.Prerender(statik),RenderMode.Server(dinamik),RenderMode.Client(dizine eklenmemesi gereken iç sayfalar). - Hydration (
provideClientHydration()) zaten SSR/önceden oluşturulmuş bir rotadaki sunucu HTML’sini yeniden kullanır; CSR rotası için sunucu HTML’si üretmez. Event replay (v18+), hydration öncesi desteklenen etkileşimleri yakalayıp sonra yeniden oynatır. Artımlı hydration (v19 ön izleme / v20 kararlı), SSR + hydration + ertelenebilir görünümler + event replay birlikteliğine dayanır ve@deferhydration tetikleyicileriyle ilk yüklemede hangi sınırların hydration dışında kalacağını belirler (hydrate never, sonraki istemci yüklemelerini otomatik olarak engellemez). Bunların hiçbiri arama dizine eklemesini değiştirmez. ŞablondakiisPlatformBrowser()içinde@ifkullanmayın; hydration uyuşmazlığı ve CLS yaratır, bunun yerineafterNextRender()kullanın. - Yerleşik
TitleveMetaservislerini kullanın (üçüncü taraf kitaplık gerekmez); yönlendiricininTitleStrategy’si (v14+) rota başlıklarını otomatik ayarlar. - HTML5 History yönlendirmesi ve asla hash (
#) URL’leri kullanmayın; gezinme gerçek<a href>bağlantılarıyla yapılmalıdır. JSON-LD,DOCUMENTbelirteci üzerinden eklenebilir. - Dinamik oluşturma bir geçici çözümdür, strateji değildir — Google bunun yerine SSR/statik oluşturma/hydration önerir.
- URL Inspection (oluşturulmuş HTML),
curl(ham HTML), Zengin Sonuçlar Testi ve JS oluşturmalı bir tarayıcıyla test edin. AngularJS ≠ Angular — eski AngularJS önerileri uygulanamaz.
Resmî dokümantasyon
Google ve Angular’ın birincil kaynakları.
- JavaScript SEO’nun temellerini anlayın — tarama → oluşturma → dizine ekleme aşamaları, taranabilir
<a href>bağlantıları, parça tabanlı yönlendirmeyle ilgili uyarılar, yanlışlıkla bulunamadı olarak değerlendirilen sayfalar ve JS ile eklenen yapılandırılmış veriler. - Dinamik Oluşturma (geçici çözüm) — neden geçici bir çözüm olduğu, gizlemeyle ilgili ince ayrım ve SSR/statik oluşturma/hidrasyon alternatifleri.
- Web’de Oluşturma (web.dev — Addy Osmani ve Jason Miller) — SSR, CSR, statik oluşturma ve hidrasyon kavramlarının temel tanımları ile performans ödünleşimleri.
- URL Inspection Tool — Google’ın gerçekte dizine eklediği oluşturulmuş HTML’yi ve JS konsol iletilerini görme yöntemi.
Angular
- Angular — Sunucu taraflı ve hibrit oluşturma (SSR) — resmî
@angular/ssrrehberi, sunucu rotaları veRenderMode. - Angular —
Titleservice —setTitle()/getTitle(). - Angular —
Metaservice —addTag(),updateTag()ve seçiciler. - Angular — Router reference —
PathLocationStrategyile hash yönlendirmesi veTitleStrategy. - Introducing Angular v17 (Angular team blog) — SSR’nin CLI tarafından doğrudan desteklenen bir özellik hâline gelmesi.
- Angular Universal (maintenance mode) — artık yerini
@angular/ssrpaketine bırakmış olan tarihî paket.
Kaynaktan alıntılar
Google’dan ve kendi yazılarımdan kayda geçmiş ifadeler. Her arama motoru bağlantısı, kaynak sayfadaki alıntıya atlayan bir derin bağlantıdır.
Google — JavaScript uygulamaları nasıl işlenir
- “Google processes JavaScript web apps in three main phases: 1. Crawling 2. Rendering 3. Indexing.” (Türkçe çeviri) “Google, JavaScript web uygulamalarını üç ana aşamada işler: 1. Tarama 2. Oluşturma 3. Dizine ekleme.” (çeviri) “Google, JavaScript web uygulamalarını üç ana aşamada işler: 1. Tarama 2. Oluşturma 3. Dizinleme.” — Google Arama Merkezi dokümanları. Alıntıya git
- “Google can only discover your links if they are <a> HTML elements with an href attribute.” (Türkçe çeviri) “Google bağlantılarınızı yalnızca href özniteliğine sahip <a> HTML öğeleriyse keşfedebilir.” (çeviri) “Google, bağlantılarınızı yalnızca href özniteliğine sahip <a> HTML öğeleri olduklarında keşfedebilir.” — Google Arama Merkezi dokümanları. Alıntıya git
Google — dinamik oluşturma bir geçici çözümdür
- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” (Türkçe çeviri) “Dinamik oluşturma, arama motorlarında JavaScript ile oluşturulan içerik sorunları için geçici bir çözümdü; uzun vadeli bir çözüm değildi.” — Google Search Central dokümanları. Alıntıya git
web.dev — SSR / statik oluşturmayı tercih edin (Addy Osmani ve Jason Miller)
- “Rendering an app on the server to send HTML, rather than JavaScript, to the client.” (Türkçe çeviri) “İstemciye JavaScript yerine HTML göndermek için uygulamayı sunucuda oluşturmak.” — sunucu taraflı oluşturmanın tanımı. Alıntıya git
Patrick Stox (kendi çalışmam — JavaScript SEO: A Definitive Guide)
- “JavaScript is not bad for SEO, and it’s not evil. It’s just different from what many SEOs are used to.” (Türkçe çeviri) “JavaScript SEO için kötü veya zararlı değildir; yalnızca birçok SEO uzmanının alıştığından farklıdır.”
- “Any kind of SSR, static rendering, and prerendering setup is going to be fine for search engines.” (Türkçe çeviri) “Her türlü SSR, statik oluşturma ve önceden oluşturma kurulumu arama motorları açısından uygun olacaktır.”
Angular SEO kontrol listesi
Angular uygulamasının taranabilir ve dizine eklenebilir olduğunu hızlıca doğrulamak için:
- Kamuya açık içerik, tam CSR yerine
@angular/ssr(SSR) veya önceden oluşturma yoluyla gerçek HTML olarak sunuluyor. - Oluşturma modu
app.routes.server.tsiçinde rota başına ayarlanıyor — statik rotalar önceden, dinamik rotalar sunucuda oluşturuluyor; yalnızca dizine eklenmeyen iç sayfalar istemcide oluşturuluyor. - Hydration etkin (
provideClientHydration()) ve hiçbir şablon@ifiçindeisPlatformBrowser()kullanmıyor (bunun yerineafterNextRender()kullanılıyor). - Her sayfa benzersiz bir başlık (
Titleservisi veya yönlendiricininTitleStrategy’si aracılığıyla) ve benzersiz bir açıklama (Metaservisi aracılığıyla) ayarlıyor. - Sosyal önizlemeler için Open Graph / Twitter Card etiketleri
Metaservisiyle ayarlanıyor. - Yönlendirme,
<base href="/">ile HTML5 History API’yi (varsayılan) kullanıyor;HashLocationStrategy/useHash: truekullanılmıyor. - Tembel yüklenen rotalara giden bağlantılar dâhil tüm gezinme öğeleri gerçek
<a href>bağlantıları kullanıyor. -
robots.txt,.jsveya.csskaynaklarını engellemiyor. - İstemci tarafındaki bulunamadı görünümleri gerçek bir
404döndürüyor veyanoindextaşıyor (soft 404 yok). - Sunucuda çalışan kodda
window/localStorage/documenterişimi yok (DOCUMENTbelirteci / platform korumaları kullanılıyor). - JSON-LD tek bir yerde bulunuyor ve Zengin Sonuçlar Testi’ni geçiyor.
- Yalnızca yerel geliştirme ortamını değil, URL Inspection içindeki oluşturulmuş HTML’yi doğruladınız.
Zihinsel modeller
1. Yanıta gerçek HTML koyun. Angular SEO sorunlarının neredeyse tamamı şu soruya iner: Tarayıcı ilk getirmede tamamlanmış HTML mi alıyor, yoksa oluşturması gereken bir kabuk mu? SSR ve önceden oluşturma “evet” der; CSR “sonra, belki” der. Her denetime buradan başlayın.
2. Rota başına oluşturma karar kuralı.
- Statik içerik (ana sayfa, hakkında, blog, belgeler) →
RenderMode.Prerender. - Güncel kalması gereken dinamik içerik (arama, canlı veri) →
RenderMode.Server. - Dizine eklenmesini istemediğiniz iç/kimlik doğrulamalı sayfalar →
RenderMode.Clientuygundur.
3. “Angular Universal” ile “@angular/ssr” aynı fikrin farklı dönemleridir.
Universal harici paketti; v17’de SSR CLI’ye alındı ve yeniden adlandırıldı. Modern Angular
kullanıyorsanız istediğiniz paket @angular/ssr’dir; Universal deposu bakım modundadır.
4. Yeniden oluşturmayın, hydrate edin.
Naif SSR HTML gönderir ve sonra onu atar. provideClientHydration() HTML’yi yeniden kullanır;
ancak yalnızca zaten SSR/önceden oluşturulmuş bir rotada çalışır, CSR rotası için sunucu HTML’si
üretmez. Event replay ve artımlı hydration (@defer) ilk yükteki JavaScript’i azaltır.
Şablonu isPlatformBrowser() ile dallandırmayın; bu hydration uyuşmazlığına ve CLS’ye yol açar.
5. Head etiketleri sizin işinizdir, Angular’ın değil.
Burada Yoast yok. Her sayfada Title/Meta servisleriyle (veya TitleStrategy ile) başlık ve
açıklamaları bilinçli biçimde ayarlayın. “Tüm sayfalar aynı başlığı paylaşıyor” kötü şans değil,
varsayılan başarısızlıktır.
6. Durumsuz bir bot için temiz URL’ler tasarlayın.
History API yönlendirmesi, gerçek <a href> bağlantıları, çerez/depolamaya bağımlılık olmaması ve
tıklamanın arkasına saklanmayan içerik kullanın. Ardından neyin oluşturulduğunu dizüstü
bilgisayarınız değil URL Inspection söylesin.
Angular SEO — kısa başvuru
Oluşturma modları
| Mod | HTML nerede oluşturulur | SEO | En uygun kullanım | Angular yapılandırması |
|---|---|---|---|---|
| Prerender (SSG) | Derleme zamanı → statik dosyalar | ✅ En iyi | Statik pazarlama/blog/belge içerikleri | RenderMode.Prerender |
| SSR | Sunucu, istek başına | ✅ Çok iyi | Dinamik, güncel kalması gereken içerik | RenderMode.Server / @angular/ssr |
| Client (CSR) | Tarayıcıda | ⚠️ Riskli | İç/kimlik doğrulamalı (dizine eklenmeyen) sayfalar | RenderMode.Client |
| Dinamik oluşturma | Ayrı bot sunucusu | Yalnızca geçici çözüm | Taşınamayan eski uygulamalar | Puppeteer / Rendertron / prerender.io |
Kurulum komutları
| Amaç | Komut |
|---|---|
| SSR içeren yeni proje | ng new my-app --ssr |
| Mevcut uygulamaya SSR ekleme | ng add @angular/ssr |
| Hydration’ı etkinleştirme | app.config.ts içinde provideClientHydration() |
Head ve yönlendirme için hızlı kurallar
- Başlıklar/açıklamalar: Angular’ın
Title+Metaservisleri (üçüncü taraf kitaplık gerekmez). - Rota başına otomatik başlıklar: rotanın
titleözelliği aracılığıyla yönlendiricininTitleStrategy’si (v14+). - Yönlendirme: HTML5 History API +
<base href="/">. AslauseHash: truekullanmayın. - Bağlantılar: tembel yüklenen rotalara gidenler dâhil gerçek
<a href>bağlantıları. - JSON-LD:
DOCUMENTbelirteci aracılığıyla ekleyin ve tek bir yerde tutun.
Adlandırma
- Angular Universal = eski harici paket (
@nguniversal/express-engine), bakım modunda. @angular/ssr= v17’den beri CLI’ye yerleşik aynı SSR yaklaşımı.- AngularJS (v1.x) ≠ Angular (v2+) — farklı çerçeveler; eski AngularJS önerileri uygulanamaz.
Dikkat edilmesi gerekenler
- Şablon
isPlatformBrowser()içinde@if→ hydration uyuşmazlığı → CLS.afterNextRender()kullanın. - Sunucuda
window/localStorage/document→ SSR çökmesi. - robots.txt içinde
.js/.cssengelleme → Google oluşturma yapamaz.
Bir Angular uygulamasının gerçekten sunucuda oluşturulup oluşturulmadığını kontrol edin
Bir URL’nin CSR mi yoksa SSR/önceden oluşturulmuş mu olduğunu anlamanın en hızlı yolu, ham
HTML’i (JavaScript çalışmadan önce) getirip gerçek içeriğinize bakmaktır. CSR Angular uygulaması
neredeyse boş bir <app-root> döndürür; SSR/önceden oluşturulmuş uygulama tamamlanmış işaretleme döndürür.
macOS / Linux
# Raw HTML as the server sends it — this is the "first fetch", pre-JS
curl -sL -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
https://example.com/page/ -o raw.html
# Is your real headline in the raw HTML? Empty result = CSR with no SSR
grep -o "Your headline text" raw.html
# A near-empty <app-root> is the tell-tale CSR signature
grep -o "<app-root></app-root>" raw.htmlWindows (PowerShell)
$ua = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Invoke-WebRequest -Uri "https://example.com/page/" -UserAgent $ua -OutFile raw.html
Select-String -Path raw.html -Pattern "Your headline text"
Select-String -Path raw.html -Pattern "<app-root></app-root>"Başlık eksikse ve yalın bir <app-root> görüyorsanız içerik oluşturma işlemine bağlıdır;
SSR veya önceden oluşturma ekleyin. (Oluşturulmuş DOM için URL Inspection’ın “Taranan sayfayı
görüntüle → oluşturulmuş HTML” bölümünü kullanın; düz curl JavaScript çalıştıramaz.)
Angular’ın JS/CSS dosyalarını robots.txt ile engellemediğinizi doğrulayın
macOS / Linux
curl -sL https://example.com/robots.txt | grep -iE "disallow.*\.(js|css)|Disallow:\s*/(assets|dist|main)"Paketinizle eşleşen bir Disallow, Google’ın sayfayı düzgün oluşturamayacağı anlamına gelir —
neredeyse her zaman bir hatadır.
Angular SEO hata ayıklama araçları
- URL Inspection (Google Search Console) — doğruluk kaynağıdır. Bir Canlı test çalıştırın; ardından oluşturulmuş HTML’yi (Googlebot Angular JS’nizi çalıştırdıktan sonraki DOM), ekran görüntüsünü, sayfa kaynaklarını (yüklenen ve engellenenler) ve JavaScript konsol iletilerini okuyun.
- Zengin Sonuçlar Testi — her oluşturma değişikliğinden sonra JSON-LD’nin oluşturulmuş çıktıda bulunduğunu doğrulayın.
curl— CSR’yi (boş<app-root>) SSR/önceden oluşturulmuş HTML’den ayırmak için ham, JavaScript öncesi HTML’i getirir.- Ahrefs Site Audit (JS oluşturma açık) — headless Chrome ile tarar, ham ve oluşturulmuş DOM’u karşılaştırır; eksik meta verileri, bozuk canonical’ları ve dizine eklenebilirlik sorunlarını büyük ölçekte ortaya çıkarır.
- Screaming Frog SEO Spider (JS oluşturma modu) — URL başına ham ve oluşturulmuş içeriği karşılaştırır.
- Lighthouse / PageSpeed Insights — oluşturma stratejinizin (CSR, SSR veya önceden oluşturma) temel Web Vitals üzerindeki etkisini ölçer.
- Angular CLI / DevTools — derlemenin
outputMode’unu, sunucu rotalarını ve hydration ayarlarını beklediğiniz gibi doğrular.
Zaman ayırmaya değer kaynaklar
İlgili yazılarım
- JavaScript SEO: A Definitive Guide — oluşturma, DOM eşliği, en kısıtlayıcı yönerge kuralı ve hangi oluşturma kurulumlarının güvenli olduğu hakkındaki kapsamlı rehberim. Angular SEO, burada ele alınan her şeyin belirli bir uygulamasıdır.
- The Beginner’s Guide to Technical SEO — oluşturma ve taramanın büyük resimdeki yeri.
Konuşmalarım
- JavaScript SEO — Ungagged 2019 (SlideShare) — Googlebot’un durumsuz oluşturma davranışı, görüntü alanı ve önbellekleme ile dönemin oluşturma yaklaşımları. (Sürekli uyarı: Bu sunumdaki dinamik oluşturma önerisi artık güncel değildir — Google sonradan bunu geçici çözüm olarak nitelendirdi.)
Sektörden
- Web’de Oluşturma (web.dev) — Addy Osmani ve Jason Miller’ın SSR, CSR, statik oluşturma ve hydration ödünleşimleri hakkındaki temel yazısı.
- Sunucu taraflı ve hibrit oluşturma (SSR) (angular.dev) — sunucu rotaları,
RenderMode, önceden oluşturma ve hydration konularını kapsayan resmî@angular/ssrrehberi. - Introducing Angular v17 (Angular ekip blogu) — SSR’yi CLI tarafından doğrudan desteklenen bir özellik hâline getiren ve
@angular/ssrpaketini kullanıma sunan sürüm. - Angular Universal (maintenance mode) (GitHub) —
@angular/ssrpaketinin yerini aldığı tarihî SSR paketi; yeniden adlandırmayı anlamak için yararlıdır. - Angular SEO Guide (Search Engine Journal, Jamie Indigo) — v17’deki yeniden adlandırmadan önce yayımlanmış olsa da temelleri güçlü olan klasik iki dalgalı dizine ekleme anlatımı.
- Angular SSR Rehberi (Angular Architects, Alexander Thalhammer, Mart 2025) — kod ağırlıklı bir SSR kurulum rehberi; yayımlanmasından sonraki API değişiklikleri için kod örneklerini resmî
@angular/ssrdokümanlarıyla karşılaştırın. - r/TechSEO — oluşturma ve dizine ekleme sorunlarını gidermeye yönelik topluluk.
Angular SEO karşıt kalıpları
Angular uygulamalarında defalarca gördüğüm somut hatalar — her biri yalnızca teorik risk değil, doğrudan kontrol etmeye değer bir alışkanlıktır.
Yalnızca CSR oluşturup işi bitmiş saymak
Varsayılan ng new çıktısında SSR veya önceden oluşturma yoktur. Projeyi başlatmanın en hızlı,
ilk getirmede boş bir <app-root> ile bitirmenin en kolay yoludur. Neden yanlış: Tarayıcının
gördüğü ham HTML’de içerik yoktur; dizine ekleme tamamen Google’ın ertelenmiş oluşturma geçişine
bağlıdır ve diğer botlar ikinci bir şans bulamaz. Bunun yerine: Bulunmasını istediğiniz
her şeyi göndermeden önce projeye @angular/ssr ekleyin (ng new my-app --ssr) veya mevcut
projede ng add @angular/ssr çalıştırın.
Kamuya açık rotalarda HashLocationStrategy kullanmak
Hash yönlendirmesi (useHash: true, /#/products/shoes gibi URL’ler) bazı eski Angular öğreticilerinde ve başlangıç şablonlarında hâlâ varsayılan olarak kullanılır. Neden yanlış: # işaretinden sonraki her şey, istek sunucuya ulaşmadan önce istemci tarafında çıkarılır; dolayısıyla sunucu ve Googlebot tüm uygulama için yalnızca tek bir URL görür. Bunun yerine: index.html içinde <base href="/"> kullanarak varsayılan HTML5 History API yönlendirmesini (PathLocationStrategy) tercih edin.
Şablonu isPlatformBrowser() ile dallandırmak
İçeriği @if (isPlatformBrowser(platformId)) içine sarmalamak, yalnızca tarayıcıya özgü kodu
korumanın bariz yolu gibi görünebilir. Neden yanlış: Sunucu bir dalı, istemci hydration
sırasında diğer dalı oluşturur; bu hydration uyuşmazlığıdır. Angular farkı uzlaştırmak zorunda
kalır ve görünür sonuç CLS olarak ortaya çıkan düzen kaymasıdır. Bunun yerine: Tarayıcıya
özgü çalışma için afterNextRender() kullanın; böylece şablon sunucuda ve istemcide aynı işaretlemeyi üretir.
Title servisini kullanmak yerine document.title değerini doğrudan ayarlamak
Yerel geliştirmede çalıştığı için kolay bir kısayol gibi görünür. Neden yanlış:
document.title = '...' gibi doğrudan DOM erişimi SSR ile iyi çalışmaz; sunucuda tarayıcıdaki
anlamıyla document globali yoktur ve Angular’ın başlık yönetiminin yönlendirici entegrasyonunu
kaybedersiniz. Bunun yerine: Angular’ın Title servisini (setTitle()) enjekte edin veya
başlıkları yönlendiricinin TitleStrategy’siyle rota başına yapılandırın.
SSR sırasında çalışan kodda window, localStorage veya document’e dokunmak
Oluşturulurken localStorage verilerini okuyan veya window.innerWidth değerini kontrol eden bir bileşen ya da hizmet, tarayıcıda sorunsuz çalışırken sunucuda oluşturma işlemini çökertir. Neden yanlış: Bu genel nesnelerin hiçbiri SSR derlemenizi çalıştıran Node sunucu işleminde mevcut değildir; bu nedenle oluşturma işlemi hata verir ve istek ya sunucu hatasıyla sonuçlanır ya da sessizce boş bir yanıta geri döner. Bunun yerine: Bu kodu afterNextRender() arkasında çalıştırın veya genel nesne yerine Angular’ın DOCUMENT belirtecini enjekte edin. SSR derlemesini yalnızca ng serve ile değil, yerel olarak ng build çalıştırıp SSR çıktısını sunarak da test edin.
Dinamik oluşturmayı kalıcı çözüm saymak
Puppeteer veya Rendertron gibi bir hizmeti botlara önceden oluşturulmuş anlık görüntü sunacak
şekilde kurmak hemen görülen belirtiyi giderir. Neden yanlış: Bakımı gereken ek bir sistemdir,
gerçek kullanıcıların gördüğü içerikten sapabilir ve Google bunun uzun vadeli çözüm değil geçici
çözüm olduğunu açıkça söylemiştir. Bunun yerine: @angular/ssr veya önceden oluşturmaya geçin;
böylece bot ya da insan her istek sahibi aynı işlem hattından aynı gerçek HTML’yi alır.
Bu rota hangi oluşturma modunu kullanmalı?
Angular v17+, app.routes.server.ts içinde rota başına oluşturma modu ayarlamanıza izin verir.
Soru, tüm uygulama için “SSR mi yoksa önceden oluşturma mı?” değildir; her rota için ayrı sorulur.
Choosing a rendering mode for an Angular route
Angular SEO çalışması için istemler
Bu makaledeki belirli Angular SEO görevleri için kopyalamaya hazır istemler. Açıklanan girdiyi yapıştırın ve çıktıyı kendi değerlendirmenizle kontrol edin — mekanik işleri hızlandırırlar, ancak URL Inspection ile test etmenin yerini tutmazlar.
1. Bir rota için ham ve oluşturulmuş HTML’yi karşılaştırın
Aynı URL için curl -sL <url> çıktısını (ham HTML) ve URL Inspection Canlı Testi’ndeki
“oluşturulmuş HTML” panelini (veya Ahrefs/Screaming Frog JS oluşturmalı taramasını) yapıştırın.
Here is the raw HTML for [URL] (fetched with curl, before JavaScript runs):
[paste raw HTML]
Here is the rendered HTML for the same URL (from Google Search Console URL
Inspection's Live Test, or a JS-rendering crawler):
[paste rendered HTML]
Compare the two. List: (1) content present in rendered but missing from raw —
this is what depends on client-side rendering, (2) any <title>, meta description,
or JSON-LD that differs between the two versions, (3) whether the raw HTML shows
a near-empty <app-root> (a sign of CSR with no SSR/prerendering).Ham ve oluşturulmuş sürümler arasındaki CSR bağımlılıklarını ve başlık/meta/şema sapmalarını kısa bir liste hâlinde bekleyin; önce düzeltilmeye değer iki konu bunlardır.
2. Bir Title/Meta servisi uygulamasını inceleyin
Angular’ın Title ve Meta servislerini çağıran SeoService sınıfınızı veya eşdeğerini yapıştırın.
Here is an Angular service that sets page titles and meta tags:
[paste the service's TypeScript code]
Check it against these rules: (1) titles are set via the Title service's
setTitle(), never document.title directly, (2) description is set with
meta.updateTag({ name: 'description', ... }) not addTag() (which can duplicate
the tag on repeat calls), (3) Open Graph tags use the property selector, not
name, (4) nothing in this code reads window/localStorage/document directly in a
way that would break during SSR. Flag any line that violates one of these and
suggest the fix.İşaretlenen her nokta için düzeltilmiş parçayla birlikte her satırı bu dört kurala göre geçti/kaldı sonucu bekleyin.
3. app.routes.server.ts dosyasını oluşturma modu hataları için denetleyin
Sunucu rotaları yapılandırma dosyanızı yapıştırın.
Here is my Angular app.routes.server.ts, which sets RenderMode per route:
[paste the file]
For each route, tell me: is RenderMode.Prerender used on anything that depends
on per-request or per-user data (a mistake — it would bake stale/wrong data into
the static build)? Is RenderMode.Client used on anything that looks like public,
indexable content (a missed-SEO-opportunity)? Is RenderMode.Server used on fully
static content where Prerender would be faster and cheaper? List each route with
its current mode and whether it matches the decision rule: static data →
Prerender, must-be-fresh → Server, non-indexed internal → Client.Her rota için, RenderMode’un rotanın gerçek gereksinimiyle eşleşmediği durumları işaretleyen
rota başına bir karar bekleyin.
Kendinizi test edin: Angular SEO
Angular uygulamalarını taranabilir ve dizine eklenebilir kılma hakkında beş kısa soru. Her biri için bir yanıt seçin, ardından kontrol edin.
Değişiklik günlüğü
22 Ağu 2026 tarihinde güncellendi.
Editoryal özet ve kaydedilen değişiklik ayrıntıları.Değişiklik ayrıntıları
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
Tam karşılaştırma kullanılamıyor — bu sürüm için önceki anlık görüntü arşivlenmemiş.
9 Ağu 2026 tarihinde güncellendi.
Editoryal özet ve kaydedilen değişiklik ayrıntıları.Değişiklik ayrıntıları
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
Tam karşılaştırma kullanılamıyor — bu sürüm için önceki anlık görüntü arşivlenmemiş.
8 Ağu 2026 tarihinde güncellendi.
Editoryal özet ve kaydedilen değişiklik ayrıntıları.Değişiklik ayrıntıları
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
Tam karşılaştırma kullanılamıyor — bu sürüm için önceki anlık görüntü arşivlenmemiş.
6 Ağu 2026 tarihinde güncellendi.
Editoryal özet ve kaydedilen değişiklik ayrıntıları.Değişiklik ayrıntıları
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
Tam karşılaştırma kullanılamıyor — bu sürüm için önceki anlık görüntü arşivlenmemiş.
17 Tem 2026 tarihinde güncellendi.
Editoryal özet ve kaydedilen değişiklik ayrıntıları.Değişiklik ayrıntıları
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
Tam karşılaştırma kullanılamıyor — bu sürüm için önceki anlık görüntü arşivlenmemiş.