Một trong những lợi thế lớn nhất của React.js được cho là khả năng hiển thị phía máy chủ . Vấn đề là chức năng chính React.renderComponentToString()
là đồng bộ nên không thể tải bất kỳ dữ liệu không đồng bộ nào khi cấu trúc phân cấp thành phần được hiển thị trên máy chủ.
Giả sử tôi có một thành phần phổ biến để nhận xét mà tôi có thể thả khá nhiều ở bất kỳ đâu trên trang. Nó chỉ có một thuộc tính, một số loại định danh (ví dụ: id của một bài báo bên dưới đặt các bình luận) và mọi thứ khác được xử lý bởi chính thành phần (tải, thêm, quản lý bình luận).
Tôi thực sự thích kiến trúc Flux vì nó làm cho nhiều thứ dễ dàng hơn nhiều và các cửa hàng của nó rất hoàn hảo để chia sẻ trạng thái giữa máy chủ và máy khách. Khi cửa hàng chứa các bình luận của tôi được khởi tạo, tôi có thể tuần tự hóa nó và gửi nó từ máy chủ đến máy khách để dễ dàng khôi phục.
Câu hỏi đặt ra là cách tốt nhất để tập trung vào cửa hàng của tôi là gì. Trong những ngày qua, tôi đã tìm kiếm trên Google rất nhiều và tôi đã tìm thấy một vài chiến lược, không có chiến lược nào có vẻ thực sự tốt khi tính đến mức độ mà tính năng này của React đang được "quảng bá".
Theo tôi, cách đơn giản nhất là điền tất cả các cửa hàng của tôi trước khi kết xuất thực sự bắt đầu. Điều đó có nghĩa là một nơi nào đó bên ngoài cấu trúc phân cấp thành phần (được nối với bộ định tuyến của tôi chẳng hạn). Vấn đề với cách tiếp cận này là tôi sẽ phải xác định cấu trúc trang hai lần. Hãy xem xét một trang phức tạp hơn, ví dụ một trang blog có nhiều thành phần khác nhau (bài đăng blog thực tế, nhận xét, bài đăng liên quan, bài đăng mới nhất, luồng twitter ...). Tôi sẽ phải thiết kế cấu trúc trang bằng cách sử dụng các thành phần React và sau đó ở một nơi khác, tôi sẽ phải xác định quy trình điền từng cửa hàng cần thiết cho trang hiện tại này. Đó dường như không phải là một giải pháp tốt đối với tôi. Thật không may, hầu hết các hướng dẫn isomorphic được thiết kế theo cách này (ví dụ: hướng dẫn về thông lượng tuyệt vời này ).
React-async . Cách tiếp cận này là hoàn hảo. Nó cho phép tôi xác định đơn giản trong một hàm đặc biệt trong mỗi thành phần cách khởi tạo trạng thái (không quan trọng là đồng bộ hay không đồng bộ) và các hàm này được gọi là hệ thống phân cấp đang được hiển thị cho HTML. Nó hoạt động theo cách mà một thành phần không được hiển thị cho đến khi trạng thái được khởi tạo hoàn toàn. Vấn đề là nó yêu cầu FibersĐó là, theo như tôi hiểu, một phần mở rộng Node.js có thể thay đổi hành vi JavaScript chuẩn. Mặc dù tôi rất thích kết quả đó, nhưng đối với tôi dường như thay vì tìm ra giải pháp, chúng tôi đã thay đổi luật chơi. Và tôi nghĩ rằng chúng ta không nên bắt buộc phải làm điều đó để sử dụng tính năng cốt lõi này của React.js. Tôi cũng không chắc về sự hỗ trợ chung của giải pháp này. Có thể sử dụng Fiber trên lưu trữ web Node.js tiêu chuẩn không?
Tôi đã suy nghĩ một chút của riêng tôi. Tôi chưa thực sự nghĩ đến chi tiết triển khai nhưng ý tưởng chung là tôi sẽ mở rộng các thành phần theo cách tương tự như React-async và sau đó tôi sẽ liên tục gọi React.renderComponentToString () trên thành phần gốc. Trong mỗi lần vượt qua, tôi sẽ thu thập các cuộc gọi lại mở rộng và sau đó gọi chúng tại và của thẻ để điền vào các cửa hàng. Tôi sẽ lặp lại bước này cho đến khi tất cả các cửa hàng theo yêu cầu của hệ thống phân cấp thành phần hiện tại sẽ được điền. Có nhiều thứ phải giải quyết và tôi đặc biệt không chắc chắn về hiệu suất.
Tôi đã bỏ lỡ điều gì đó? Có cách tiếp cận / giải pháp nào khác không? Hiện tại tôi đang nghĩ đến việc sử dụng phản ứng không đồng bộ / sợi nhưng tôi không hoàn toàn chắc chắn về nó như đã giải thích ở điểm thứ hai.
Thảo luận liên quan trên GitHub . Rõ ràng, không có cách tiếp cận chính thức hoặc thậm chí là giải pháp. Có thể câu hỏi thực sự là các thành phần React được dự định sử dụng như thế nào. Giống như lớp xem đơn giản (khá nhiều gợi ý số một của tôi) hoặc thích các thành phần độc lập và độc lập thực sự?