Kabul edilen cevap ve bu sorunun genel doğası ('işe yaramaz') hakkındaki yorumlara bakarak, bunun burada yer alan konular hakkında bazı genel açıklamalar için iyi bir yer olabileceğini düşündüm. Dolayısıyla bu cevap, OP'nin özel kullanım durumu hakkında arka plan bilgisi / detaylandırma olarak tasarlanmıştır. Lütfen bana eşlik et.
Sunucu tarafı ve İstemci tarafı
Bu konuda anlaşılması gereken ilk büyük şey, URL'nin yorumlandığı 2 yer olması ve 'eski günlerde' sadece 1 olmasıydı. Geçmişte, yaşam basit olduğunda, bazı kullanıcılar http://example.com/about
sunucuya URL'nin yol bölümünü inceleyen bir istek gönderdi , kullanıcının yaklaşık sayfayı istediğini belirledi ve sonra o sayfayı geri gönderdi.
React-Router'ın sağladığı istemci tarafı yönlendirme ile işler daha az basittir. İlk başta, istemcide henüz yüklü bir JS kodu yoktur. Bu yüzden ilk istek her zaman sunucuya olacaktır. Bu daha sonra React ve React Router vb. Yüklemek için gerekli kod etiketlerini içeren bir sayfa döndürür. Örneğin 'Hakkımızda' gezinme bağlantısı tıkladığında, URL değiştiğinde faz 2, In sadece yerel olarak hiç http://example.com/about
(mümkün hale Tarih API ), ancak sunucuya hiçbir istek yapıldığında. Bunun yerine, React Router işini istemci tarafında yapar, hangi React görünümünün oluşturulacağını belirler ve oluşturur. Hakkında sayfanızın herhangi bir REST çağrısı yapması gerekmediğini varsayarsak, zaten yapılır. Hiçbir sunucu isteği tetiklenmeden Ana Sayfa'dan Hakkımızda'ya geçtiniz.
Temel olarak bir bağlantıyı tıklattığınızda, sayfa yenilemesine neden olmadan adres çubuğundaki URL'yi işleyen bazı Javascript çalışır ve bu da React Router'ın istemci tarafında bir sayfa geçişi gerçekleştirmesine neden olur .
Ancak şimdi URL'yi adres çubuğuna kopyalayıp yapıştırır ve bir arkadaşınıza e-postayla gönderirseniz ne olacağını düşünün. Arkadaşınız henüz web sitenizi yüklemedi. Başka bir deyişle, hala 1. aşamadadır . Makinesinde henüz hiçbir React Router çalışmıyor. Yani onun tarayıcı bir hale getirecek Sunucu isteği için http://example.com/about
.
İşte sorun burada başlıyor. Şimdiye kadar, sunucunuzun web köküne statik bir HTML yerleştirmekten kurtulabilirsiniz. Ancak bu , sunucudan istendiğinde404
diğer tüm URL'ler için hatalar verir . Aynı URL'ler istemci tarafında iyi çalışır , çünkü React Router sizin için yönlendirmeyi yapıyor, ancak sunucunuzu onları anlamadığınız sürece sunucu tarafında başarısız oluyorlar .
Sunucu ve istemci tarafı yönlendirmeyi birleştirme
http://example.com/about
URL'nin hem sunucu hem de istemci tarafında çalışmasını istiyorsanız, hem sunucu hem de istemci tarafında bunun için yollar ayarlamanız gerekir. Mantıklı geliyor mu?
Ve seçimlerinizin başladığı yer burası. Çözümler, sorunun önyüklenmesini, önyükleme HTML'sini döndüren bir tümünü yakala yolu aracılığıyla, hem sunucunun hem de istemcinin aynı JS kodunu çalıştırdığı tam izomorfik yaklaşıma kadar uzanır.
.
Sorunu tamamen atlamak: Karma Geçmişi
Tarayıcı Geçmişi yerine Karma Geçmişi ile , yaklaşık sayfasının URL'niz şuna benzer:
Hash ( ) simgesinden sonraki bölüm sunucuya gönderilmez. Böylece sunucu dizin sayfasını yalnızca beklendiği gibi görür ve gönderir. React-Router parçayı alır ve doğru sayfayı gösterir.http://example.com/#/about
#
http://example.com/
#/about
Dezavantajları :
- 'çirkin' URL'ler
- Bu yaklaşımla sunucu tarafı oluşturma mümkün değildir. Arama Motoru Optimizasyonu (SEO) ile ilgili olarak, web siteniz neredeyse hiç içerik barındıran tek bir sayfadan oluşmaktadır.
.
Tümünü yakalama
Bu yaklaşım sayesinde kullanım Tarayıcı Geçmişi, ama sadece bir catch-all gönderen sunucuda kurmak /*
için index.html
etkin bir size Hash Geçmişi ile hemen hemen aynı durum vererek. Bununla birlikte temiz URL'leriniz var ve daha sonra tüm kullanıcı sık kullanılanlarını geçersiz kılmak zorunda kalmadan bu şema üzerinde iyileştirebilirsiniz.
Dezavantajları :
- Kurulumu daha karmaşık
- Hala iyi bir SEO yok
.
melez
Karma yaklaşımda, belirli yollar için belirli komut dosyaları ekleyerek tümünü yakalama senaryosunu genişletirsiniz. İçeriğinizle birlikte sitenizin en önemli sayfalarını döndürmek için bazı basit PHP komut dosyaları oluşturabilirsiniz, böylece Googlebot en azından sayfanızda ne olduğunu görebilir.
Dezavantajları :
- Kurulumu daha da karmaşık
- Sadece özel tedavi verdiğiniz yollar için iyi SEO
- Sunucuda ve istemcide içerik oluşturmak için çoğaltma kodu
.
izomorf
Her iki uçta da aynı JS kodunu çalıştırabilmemiz için Node JS'yi sunucumuz olarak kullanırsak ne olur ? Artık tüm rotalarımız tek bir tepki yönlendirici yapılandırmasında tanımlanmıştır ve oluşturma kodumuzu çoğaltmamız gerekmez. Bu tabiri caizse 'kutsal kâse'. Sunucu, sayfa geçişi istemcide gerçekleşmiş olsaydı sonuçlandırdığımız işaretin aynısını gönderir. Bu çözüm SEO açısından idealdir.
Dezavantajları :
- Sunucu gerekir JS çalıştırın (muktedir). Java icw Nashorn ile denedim ama bu benim için çalışmıyor. Uygulamada bu çoğunlukla Node JS tabanlı bir sunucu kullanmanız gerektiği anlamına gelir.
- Birçok zorlu çevre sorunu (
window
sunucu tarafında vb. Kullanarak )
- Dik öğrenme eğrisi
.
Hangisini kullanmalıyım?
Kaçabileceğinizi seçin. Şahsen ben catch-all kurmak için basit olduğunu düşünüyorum, bu yüzden benim minimum olurdu. Bu kurulum, zamanla işleri iyileştirmenizi sağlar. Sunucu platformunuz olarak zaten Node JS kullanıyorsanız, kesinlikle izomorfik bir uygulama yapmayı araştırırım. Evet ilk başta zor, ama bir kez asıldıktan sonra sorunun çok zarif bir çözümü.
Temel olarak, benim için, bu belirleyici faktör olacaktır. Sunucum Düğüm JS'de çalışıyorsa, izomorfik olurdum; Aksi takdirde Catch-all çözümü için gitmek ve sadece zaman ilerledikçe ve SEO gereksinimleri talep olarak (Hybrid çözüm) genişletmek istiyorum.
React ile izomorfik ('evrensel' olarak da adlandırılır) oluşturma hakkında daha fazla bilgi edinmek isterseniz, bu konuda bazı iyi eğitimler vardır:
Ayrıca, başlamanız için bazı başlangıç kitlerine bakmanızı tavsiye ederim. Teknoloji yığını için seçimlerinizle eşleşen birini seçin (unutmayın, React MVC'deki V'dir, tam bir uygulama oluşturmak için daha fazla şeye ihtiyacınız vardır). Facebook'un kendisi tarafından yayınlanan bir kitaba bakarak başlayın:
Ya da topluluk tarafından bir çoğunu seçin. Şimdi hepsini dizine eklemeye çalışan güzel bir site var:
Bunlarla başladım:
Şu anda, yukarıdaki iki başlangıç kitinden esinlenilen evrensel oluşturmanın ev yapımı bir versiyonunu kullanıyorum, ancak şimdi güncel değiller.
Soruşturmanda başarılar!