Qabul qilingan javobga berilgan izohlarga va bu savolning umumiy xususiyatiga ('ishlamaydi') qarab, men bu yerdagi masalalar bo'yicha umumiy tushuntirishlar uchun yaxshi joy bo'lishi mumkin deb o'yladim. Shunday qilib, bu javob OPning maxsus foydalanish holati bo'yicha ma'lumot/ishlab chiqish sifatida mo'ljallangan. Iltimos, sabr qiling.
Server tomoni va mijoz tomoni
Buni tushunish kerak bo'lgan birinchi muhim narsa shundaki, hozirda URL talqin qilinadigan ikkita joy mavjud bo'lsa, "eski kunlarda" faqat 1 ta joy mavjud edi. Ilgari, hayot oddiy bo'lganida, ba'zi foydalanuvchi serverga http://example.com/about
so'rovini yubordi, u URLning yo'l qismini tekshirdi, foydalanuvchi haqida sahifani so'raganini aniqladi va keyin o'sha sahifani qaytarib yubordi.
React-Router tomonidan taqdim etilgan mijoz tomonidan marshrutlash bilan ishlar unchalik oson emas. Avvaliga mijozda hali JS kodi yuklanmagan. Shunday qilib, birinchi so'rov har doim serverga bo'ladi. Keyin React va React Router va hokazolarni yuklash uchun kerakli skript teglarini o'z ichiga olgan sahifani qaytaradi. Faqat shu skriptlar yuklangandan keyingina 2-bosqich boshlanadi. 2-bosqichda foydalanuvchi “Biz haqimizda” navigatsiya havolasini bosganida, masalan, URL faqat mahalliy ga http://example.com/about
ga oʻzgartiriladi (Tarix API), lekin serverga hech qanday so'rov yuborilmadi. Buning o'rniga, React Router mijoz tomonida o'z ishini qiladi, qaysi React ko'rinishini ko'rsatishni aniqlaydi va uni taqdim etadi. Haqida sahifangiz REST qo'ng'iroqlarini amalga oshirishga hojat yo'q deb hisoblasangiz, u allaqachon bajarilgan. Siz “Uy”dan “Biz haqimizda”ga hech qanday server soʻrovisiz oʻtdingiz.
Demak, havolani bosganingizda, sahifa yangilanishiga olib kelmasdan manzil satridagi URL manzilini boshqaradigan ba'zi Javascript ishlaydi, bu esa o'z navbatida React Router-ni mijozda sahifaga o'tishni amalga oshirishiga olib keladi. -tomoni.
Ammo endi manzil satriga URL-manzilni nusxa ko'chiring va uni do'stingizga elektron pochta orqali yuborsangiz nima bo'lishini ko'rib chiqing. Do'stingiz hali veb-saytingizni yuklamagan. Boshqacha qilib aytganda, u hali ham 1-bosqichda. Uning mashinasida hali hech qanday React Router ishlamaydi. Shunday qilib, uning brauzeri http://example.com/about
ga server so'rovi yuboradi.
Va bu erda sizning muammolaringiz boshlanadi. Hozirgacha serveringizning veb-rootiga statik HTMLni joylashtirish bilan qutulishingiz mumkin edi. Lekin bu serverdan so'ralganda boshqa barcha URL manzillar uchun 404
xatolik beradi. Xuddi shu URL manzillar mijoz tomonida yaxshi ishlaydi, chunki u yerda React Router siz uchun marshrutlashni amalga oshiradi, lekin serveringizga tushunarli qilmasangiz, ular server tomonida ishlamay qoladi. ular.
Server va mijoz tomonidan marshrutlashni birlashtirish
Agar siz http://example.com/about
URL manzili server va mijoz tomonida ishlashini istasangiz, uning uchun server va mijoz tomonida marshrutlarni o'rnatishingiz kerak. Mantiqiy, to'g'rimi?
Va bu erda sizning tanlovingiz boshlanadi. Yechimlar muammoni butunlay chetlab o'tishdan tortib, HTML yuklash faylini qaytaradigan barcha yo'l orqali server va mijoz bir xil JS kodini boshqaradigan to'liq izomorf yondashuvgacha bo'lgan masofani o'z ichiga oladi.
.
Muammoni butunlay chetlab o'tish: Xesh tarixi
Xesh tarixi bilan oʻrniga Brauzer tarixini o'rgansangiz, "haqida" sahifasi uchun URL manzilingiz quyidagicha ko'rinadi: http://example.com/#/about
Xesh (#
) belgisidan keyingi qism serverga yuborilmaydi. Shunday qilib, server faqat http://example.com/
ni ko'radi va indeks sahifasini kutilganidek yuboradi. React-Router #/about
qismini oladi va to'g'ri sahifani ko'rsatadi.
Kasalliklar:
- "xunuk" URL manzillar
- Ushbu yondashuv bilan server tomonida ko'rsatish mumkin emas. Qidiruv tizimini optimallashtirishga (SEO) kelsak, sizning veb-saytingiz deyarli hech qanday tarkibga ega bo'lmagan bitta sahifadan iborat.
.
Hammasini ushlash
Ushbu yondashuv bilan siz Brauzer tarixidan foydalanasiz, lekin shunchaki serverda /*
ni index.html
ga yuboradigan hamma narsani o'rnatasiz, bu sizga hash tarixi bilan bir xil vaziyatni samarali ta'minlaydi. Biroq, sizda toza URL manzillar bor va siz foydalanuvchining barcha sevimlilarini bekor qilmasdan keyinroq ushbu sxemani yaxshilashingiz mumkin.
Kasalliklar:
- O'rnatish yanada murakkab
- Hali ham yaxshi SEO yo'q
.
Gibrid
Gibrid yondashuvda siz ma'lum marshrutlar uchun maxsus skriptlarni qo'shish orqali barchani qamrab oladigan stsenariyni kengaytirasiz. Saytingizning eng muhim sahifalarini kontent bilan qaytarish uchun oddiy PHP skriptlarini yaratishingiz mumkin, shuning uchun Googlebot hech bo'lmaganda sahifangizda nima borligini ko'rishi mumkin.
Kasalliklar:
- O'rnatish yanada murakkabroq
- Siz maxsus muomala qilgan marshrutlar uchun faqat yaxshi SEO
- Server va mijozda kontentni ko'rsatish uchun kodni takrorlash
.
Izomorf
Agar biz JS kodini ikkala uchida ham bir xil ishga tushirishimiz uchun server sifatida Node JS-dan foydalansak-chi? Endi bizda barcha marshrutlarimiz bitta reaktsion-router konfiguratsiyasida aniqlangan va biz renderlash kodimizni takrorlashimiz shart emas. Bu, ta'bir joiz bo'lsa, "muqaddas kosa". Server, agar mijozda sahifaga o'tish sodir bo'lgan bo'lsa, xuddi shunday belgilashni yuboradi. Ushbu yechim SEO nuqtai nazaridan maqbuldir.
Kasalliklar:
- Server JSni ishga tushirish kerak (qodir boʻlishi). Men Java i.c.w bilan tajriba o'tkazdim. Nashorn, lekin bu men uchun ishlamayapti. Amalda, bu asosan Node JS serveridan foydalanish kerakligini anglatadi.
- Ko'pgina murakkab ekologik muammolar (server tomonida
window
dan foydalanish va hokazo)
- Qattiq o'rganish egri chizig'i
.
Qaysi birini ishlatishim kerak?
O'zingizdan qutulishingiz mumkin bo'lgan birini tanlang. Shaxsan men o'ylaymanki, hamma narsani o'rnatish juda oddiy, shuning uchun bu mening minimal bo'ladi. Ushbu sozlash vaqt o'tishi bilan narsalarni yaxshilashga imkon beradi. Agar siz allaqachon server platformasi sifatida Node JS dan foydalanayotgan bo'lsangiz, men albatta izomorf ilova qilishni tekshirib ko'raman. Ha, avvaliga bu qiyin, biroq uni o‘zlashtirganingizdan so‘ng, bu muammoning juda oqlangan yechimidir.
Shunday qilib, men uchun bu hal qiluvchi omil bo'ladi. Agar mening serverim Node JS da ishlayotgan bo'lsa, men izomorf bo'lardim; aks holda, men Catch-all yechimga borardim va vaqt o'tishi bilan va SEO talablari talab qilganda uni kengaytiraman (Gibrid yechim).
Agar siz React bilan izomorf (universal deb ham ataladi) renderlash haqida ko'proq ma'lumotga ega bo'lishni istasangiz, ushbu mavzu bo'yicha bir nechta yaxshi darsliklar mavjud:
Bundan tashqari, boshlash uchun men bir nechta boshlang'ich to'plamlarni ko'rib chiqishni maslahat beraman. Texnologik stek uchun tanlovlaringizga mos keladiganini tanlang (esda tuting, React MVC-dagi faqat V, to'liq ilova yaratish uchun sizga ko'proq narsalar kerak bo'ladi). Facebookning o'zi tomonidan e'lon qilinganini ko'rib chiqishdan boshlang:
Yoki jamiyat tomonidan ko'pchilikdan birini tanlang. Endi ularning barchasini indekslashga harakat qiladigan yaxshi sayt mavjud:
Men bulardan boshladim:
Hozirda men yuqoridagi ikkita boshlang'ich to'plamdan ilhomlangan universal renderlashning uyda ishlab chiqarilgan versiyasidan foydalanmoqdaman, ammo ular endi eskirgan.
Izlanishingizga omad tilaymiz!
person
Stijn de Witt
schedule
14.04.2016
#
belgisini qanday oʻchirib tashladingiz? Rahmat! - person SudoPlz   schedule 06.06.2015index.html
ga o'rnatishingiz mumkin. Buindex.html
nima bo'lishidan qat'iy nazar urilishini ta'minlaydi. - person Trevor Hutto   schedule 30.07.2016