Nhìn vào các ý kiến về câu trả lời được chấp nhận và bản chất chung của câu hỏi này ('không hoạt động'), tôi nghĩ rằng đây có thể là một nơi tốt cho một số giải thích chung về các vấn đề liên quan ở đây. Vì vậy, câu trả lời này được dự định là thông tin cơ bản / chi tiết về trường hợp sử dụng cụ thể của OP. Xin vui lòng chịu với tôi.
Phía máy chủ và phía máy khách
Điều quan trọng đầu tiên cần hiểu về điều này là hiện tại có 2 địa điểm mà URL được diễn giải, trong khi trước đây chỉ có 1 trong 'ngày xưa'. Trước đây, khi cuộc sống đơn giản, một số người dùng đã gửi yêu cầu http://example.com/about
đến máy chủ, đã kiểm tra phần đường dẫn của URL, xác định người dùng đang yêu cầu trang about và sau đó gửi lại trang đó.
Với định tuyến phía máy khách, đó là những gì React-Router cung cấp, mọi thứ trở nên đơn giản hơn. Lúc đầu, máy khách chưa có bất kỳ mã JS nào được tải. Vì vậy, yêu cầu đầu tiên sẽ luôn luôn là máy chủ. Điều đó sau đó sẽ trả về một trang có chứa các thẻ script cần thiết để tải React và React Router, v.v. Chỉ khi các script đó được tải thì giai đoạn 2 mới bắt đầu. Trong giai đoạn 2, khi người dùng nhấp vào liên kết điều hướng 'Giới thiệu về chúng tôi', URL chỉ được thay đổi cục bộ thành http://example.com/about
(được thực hiện bởi API Lịch sử ), nhưng không có yêu cầu nào đối với máy chủ được thực hiện. Thay vào đó, React Router thực hiện công việc của mình ở phía máy khách, xác định chế độ xem React nào sẽ hiển thị và kết xuất lại. Giả sử trang về của bạn không cần thực hiện bất kỳ cuộc gọi REST nào, nó đã được thực hiện. Bạn đã chuyển từ Trang chủ sang Giới thiệu mà không yêu cầu máy chủ nào thực hiện.
Vì vậy, về cơ bản khi bạn nhấp vào một liên kết, một số Javascript chạy thao tác URL trong thanh địa chỉ mà không gây ra làm mới trang , điều này sẽ khiến React Router thực hiện chuyển đổi trang ở phía máy khách .
Nhưng bây giờ hãy xem xét điều gì xảy ra nếu bạn sao chép-dán URL vào thanh địa chỉ và gửi email cho bạn bè. Bạn của bạn chưa tải trang web của bạn. Nói cách khác, cô ấy vẫn ở giai đoạn 1 . Chưa có React Router nào đang chạy trên máy của cô ấy. Vì vậy, trình duyệt của mình sẽ làm cho một yêu cầu máy chủ để http://example.com/about
.
Và đây là lúc rắc rối của bạn bắt đầu. Cho đến bây giờ, bạn có thể thoát khỏi việc chỉ cần đặt một HTML tĩnh tại webroot của máy chủ của bạn. Nhưng điều đó sẽ gây ra 404
lỗi cho tất cả các URL khác khi được yêu cầu từ máy chủ . Các URL tương tự đó hoạt động tốt ở phía máy khách , vì có React Router đang thực hiện định tuyến cho bạn, nhưng chúng không thành công ở phía máy chủ trừ khi bạn làm cho máy chủ của bạn hiểu chúng.
Kết hợp định tuyến phía máy chủ và máy khách
Nếu bạn muốn http://example.com/about
URL hoạt động trên cả máy chủ- và phía máy khách, bạn cần thiết lập các tuyến đường cho nó trên cả máy chủ - và phía máy khách. Làm cho ý nghĩa phải không?
Và đây là nơi lựa chọn của bạn bắt đầu. Các giải pháp bao gồm từ bỏ qua vấn đề hoàn toàn, thông qua một lộ trình bắt tất cả trả về HTML bootstrap, đến cách tiếp cận đẳng cấu đầy đủ trong đó cả máy chủ và máy khách đều chạy cùng một mã JS.
.
Bỏ qua vấn đề hoàn toàn: Lịch sử Hash
Với Lịch sử băm thay vì Lịch sử trình duyệt , URL của bạn cho trang giới thiệu sẽ trông giống như thế này:
http://example.com/#/about
Phần sau #
biểu tượng băm ( ) không được gửi đến máy chủ. Vì vậy, máy chủ chỉ nhìn thấy http://example.com/
và gửi trang chỉ mục như mong đợi. React-Router sẽ chọn #/about
phần và hiển thị trang chính xác.
Nhược điểm :
- URL 'xấu xí'
- Kết xuất phía máy chủ là không thể với phương pháp này. Theo như Công cụ Tìm kiếm Tối ưu hóa (SEO) có liên quan, trang web của bạn bao gồm một trang duy nhất với hầu như không có bất kỳ nội dung nào trên đó.
.
Bắt hết
Với phương pháp này, bạn có thể sử dụng Lịch sử trình duyệt, nhưng chỉ cần thiết lập một bản tóm tắt trên máy chủ gửi /*
đến index.html
, mang lại cho bạn nhiều tình huống tương tự như với Lịch sử Hash. Tuy nhiên, bạn có URL sạch và bạn có thể cải thiện chương trình này sau mà không phải làm mất hiệu lực tất cả các mục yêu thích của người dùng.
Nhược điểm :
- Thiết lập phức tạp hơn
- Vẫn không có SEO tốt
.
Hỗn hợp
Trong phương pháp kết hợp, bạn mở rộng theo kịch bản bắt tất cả bằng cách thêm các tập lệnh cụ thể cho các tuyến cụ thể. Bạn có thể tạo một số tập lệnh PHP đơn giản để trả về các trang quan trọng nhất của trang web của bạn có nội dung được bao gồm, do đó, Googlebot ít nhất có thể nhìn thấy những gì trên trang của bạn.
Nhược điểm :
- Thậm chí phức tạp hơn để thiết lập
- Chỉ SEO tốt cho những tuyến đường bạn cung cấp cho điều trị đặc biệt
- Mã trùng lặp để hiển thị nội dung trên máy chủ và máy khách
.
Đồng phân
Điều gì xảy ra nếu chúng ta sử dụng Node JS làm máy chủ của mình để chúng ta có thể chạy cùng một mã JS ở cả hai đầu? Bây giờ, chúng tôi có tất cả các tuyến đường được xác định trong một cấu hình bộ định tuyến phản ứng và chúng tôi không cần sao chép mã kết xuất. Đây là 'chén thánh' để nói. Máy chủ sẽ gửi đánh dấu chính xác giống như chúng ta sẽ kết thúc nếu quá trình chuyển trang xảy ra trên máy khách. Giải pháp này là tối ưu về mặt SEO.
Nhược điểm :
- Máy chủ phải (có thể) chạy JS. Tôi đã thử nghiệm với Java icw Nashorn nhưng nó không hoạt động với tôi. Trong thực tế, điều đó có nghĩa là bạn phải sử dụng máy chủ dựa trên Node JS.
- Nhiều vấn đề môi trường phức tạp (sử dụng
window
ở phía máy chủ, v.v.)
- Dốc học
.
Tôi nên sử dụng cái nào?
Chọn một trong đó bạn có thể đi với. Cá nhân tôi nghĩ rằng bắt tất cả là đủ đơn giản để thiết lập, vì vậy đó sẽ là tối thiểu của tôi. Thiết lập này cho phép bạn cải thiện mọi thứ theo thời gian. Nếu bạn đã sử dụng Node JS làm nền tảng máy chủ của mình, tôi chắc chắn sẽ điều tra làm một ứng dụng đẳng cấu. Vâng, ban đầu nó rất khó khăn, nhưng một khi bạn hiểu rõ thì đó thực sự là một giải pháp rất hay cho vấn đề.
Về cơ bản, đối với tôi, đó sẽ là yếu tố quyết định. Nếu máy chủ của tôi chạy trên Node JS, tôi sẽ chuyển sang dạng đồng phân; nếu không, tôi sẽ sử dụng giải pháp Catch-all và chỉ mở rộng trên nó (giải pháp lai) khi tiến độ thời gian và yêu cầu SEO yêu cầu nó.
Nếu bạn muốn tìm hiểu thêm về kết xuất đẳng cấu (còn gọi là 'phổ quát') với React, có một số hướng dẫn tốt về chủ đề này:
Ngoài ra, để giúp bạn bắt đầu, tôi khuyên bạn nên xem xét một số bộ dụng cụ khởi động. Chọn một lựa chọn phù hợp với lựa chọn của bạn cho ngăn xếp công nghệ (hãy nhớ, React chỉ là V trong MVC, bạn cần nhiều thứ hơn để xây dựng một ứng dụng đầy đủ). Bắt đầu bằng cách nhìn vào một cái được xuất bản bởi chính Facebook:
Hoặc chọn một trong số nhiều bởi cộng đồng. Hiện tại có một trang web đẹp cố gắng lập chỉ mục tất cả chúng:
Tôi bắt đầu với những điều này:
Hiện tại tôi đang sử dụng một phiên bản sản xuất bia phổ biến tại nhà được lấy cảm hứng từ hai bộ dụng cụ khởi động ở trên, nhưng chúng đã lỗi thời.
Chúc may mắn với tìm kiếm của bạn!