Redux tác giả ở đây!
Redux không phải là rằng khác với Flux. Nhìn chung, nó có cùng kiến trúc, nhưng Redux có thể cắt giảm một số góc phức tạp bằng cách sử dụng thành phần chức năng trong đó Flux sử dụng đăng ký gọi lại.
Không có sự khác biệt cơ bản trong Redux, nhưng tôi thấy nó làm cho việc trừu tượng hóa trở nên dễ dàng hơn, hoặc ít nhất là có thể thực hiện, điều đó sẽ khó hoặc không thể thực hiện trong Flux.
Thành phần giảm tốc
Lấy ví dụ, phân trang. Ví dụ Flux + React Router của tôi xử lý phân trang, nhưng mã cho điều đó thật tồi tệ. Một trong những lý do khủng khiếp là Flux khiến việc sử dụng lại chức năng trên các cửa hàng trở nên không tự nhiên. Nếu hai cửa hàng cần xử lý phân trang để đáp ứng với các hành động khác nhau, thì chúng cần phải kế thừa từ một cửa hàng cơ sở chung (xấu! Bạn tự khóa mình vào một thiết kế cụ thể khi bạn sử dụng kế thừa) hoặc gọi một chức năng được xác định bên ngoài từ bên trong xử lý sự kiện, sẽ cần bằng cách nào đó hoạt động trên trạng thái riêng tư của cửa hàng Flux. Toàn bộ điều này là lộn xộn (mặc dù chắc chắn trong lĩnh vực có thể).
Mặt khác, với phân trang Redux là tự nhiên nhờ thành phần giảm tốc. Đó là bộ giảm tốc hoàn toàn, vì vậy bạn có thể viết một nhà máy giảm tốc tạo ra bộ giảm tốc phân trang và sau đó sử dụng nó trong cây giảm tốc của bạn . Chìa khóa cho lý do tại sao nó dễ dàng là bởi vì trong Flux, các cửa hàng đều bằng phẳng, nhưng trong Redux, các bộ giảm tốc có thể được lồng qua thành phần chức năng, giống như các thành phần React có thể được lồng vào nhau.
Mẫu này cũng cho phép các tính năng tuyệt vời như hoàn tác / làm lại mã không sử dụng . Bạn có thể tưởng tượng việc cắm Undo / Redo vào một ứng dụng Flux là hai dòng mã không? Khó khăn. Với Redux, đó là Babagain, nhờ mô hình thành phần giảm tốc. Tôi cần nhấn mạnh rằng không có gì mới về nó. Đây là mô hình được tiên phong và mô tả chi tiết trong Elm Architecture , nơi chịu ảnh hưởng của Flux.
Kết xuất máy chủ
Mọi người đã kết xuất trên máy chủ tốt với Flux, nhưng thấy rằng chúng tôi có 20 thư viện Flux mỗi lần cố gắng làm cho máy chủ hiển thị dễ dàng hơn, có lẽ Flux có một số cạnh thô trên máy chủ. Sự thật là Facebook không thực hiện nhiều kết xuất máy chủ, vì vậy họ không quan tâm đến điều đó và dựa vào hệ sinh thái để làm cho nó dễ dàng hơn.
Trong Flux truyền thống, các cửa hàng là singletons. Điều này có nghĩa là khó phân tách dữ liệu cho các yêu cầu khác nhau trên máy chủ. Không phải là không thể, nhưng khó. Đây là lý do tại sao hầu hết các thư viện Flux (cũng như Flux Utils mới ) hiện khuyên bạn nên sử dụng các lớp thay vì singletons, vì vậy bạn có thể khởi tạo các cửa hàng theo yêu cầu.
Vẫn còn những vấn đề sau mà bạn cần giải quyết trong Flux (chính bạn hoặc với sự trợ giúp của thư viện Flux yêu thích của bạn như Flummox hoặc Alt ):
- Nếu các cửa hàng là các lớp, làm cách nào để tạo và hủy chúng với bộ điều phối theo yêu cầu? Khi nào tôi đăng ký cửa hàng?
- Làm cách nào để hydrat hóa dữ liệu từ các cửa hàng và sau đó bù nước cho khách hàng? Tôi có cần phải thực hiện các phương pháp đặc biệt cho việc này không?
Phải thừa nhận rằng các khung Flux (không phải vanilla Flux) có giải pháp cho những vấn đề này, nhưng tôi thấy chúng quá phức tạp. Ví dụ, Flummox yêu cầu bạn thực hiện serialize()
và deserialize()
trong các cửa hàng của bạn . Alt giải quyết điều này đẹp hơn bằng cách cung cấp takeSnapshot()
tự động tuần tự hóa trạng thái của bạn trong cây JSON.
Redux chỉ đi xa hơn: vì chỉ có một cửa hàng duy nhất (được quản lý bởi nhiều bộ giảm tốc), bạn không cần bất kỳ API đặc biệt nào để quản lý (tái) hydrat hóa. Bạn không cần phải dọn dẹp các cửa hàng của Argentina và các cửa hàng của Hyd hyd trên một cửa hàng duy nhất và bạn có thể đọc trạng thái hiện tại của nó hoặc tạo một cửa hàng mới với một trạng thái mới. Mỗi yêu cầu được một ví dụ cửa hàng riêng biệt. Đọc thêm về kết xuất máy chủ với Redux.
Một lần nữa, đây là trường hợp có thể xảy ra cả trong Flux và Redux, nhưng các thư viện Flux giải quyết vấn đề này bằng cách đưa ra một tấn API và quy ước, và Redux thậm chí không phải giải quyết nó vì nó không có vấn đề đó trong nơi đầu tiên nhờ vào sự đơn giản về khái niệm.
Trải nghiệm của nhà phát triển
Tôi thực sự không có ý định Redux trở thành một thư viện Flux nổi tiếng. Tôi đã viết nó khi tôi đang thực hiện bài nói chuyện ReactEurope của mình về việc tải lại nóng với du hành thời gian . Tôi có một mục tiêu chính: làm cho nó có thể thay đổi mã giảm tốc khi đang bay hoặc thậm chí là thay đổi quá khứ, bằng cách bỏ qua các hành động và xem trạng thái được tính toán lại.
Tôi chưa thấy một thư viện Flux nào có thể làm điều này. React Hot Loader cũng không cho phép bạn thực hiện điều này trên thực tế, nó sẽ bị hỏng nếu bạn chỉnh sửa các cửa hàng Flux vì nó không biết phải làm gì với chúng.
Khi Redux cần tải lại mã giảm tốc, nó sẽ gọi replaceReducer()
và ứng dụng chạy với mã mới. Trong Flux, dữ liệu và chức năng bị vướng vào các cửa hàng Flux, vì vậy bạn không thể chỉ thay thế các chức năng. Hơn nữa, bằng cách nào đó bạn phải đăng ký lại các phiên bản mới với Dispatcher, một thứ mà Redux thậm chí không có.
Hệ sinh thái
Redux có một hệ sinh thái phong phú và phát triển nhanh chóng . Điều này là do nó cung cấp một vài điểm mở rộng như phần mềm trung gian . Nó được thiết kế với các trường hợp sử dụng như ghi nhật ký , hỗ trợ cho Lời hứa , Quan sát , định tuyến , kiểm tra dev bất biến , kiên trì , v.v., trong tâm trí. Không phải tất cả trong số này sẽ trở nên hữu ích, nhưng thật tuyệt khi có quyền truy cập vào một bộ công cụ có thể dễ dàng kết hợp để làm việc cùng nhau.
Sự đơn giản
Redux bảo tồn tất cả các lợi ích của Flux (ghi lại và phát lại các hành động, luồng dữ liệu đơn hướng, đột biến phụ thuộc) và thêm các lợi ích mới (dễ dàng hoàn tác lại, tải lại nóng) mà không cần giới thiệu Depatcher và đăng ký cửa hàng.
Giữ cho nó đơn giản là rất quan trọng vì nó giúp bạn tỉnh táo trong khi bạn thực hiện các khái niệm trừu tượng ở cấp độ cao hơn.
Không giống như hầu hết các thư viện Flux, bề mặt API Redux rất nhỏ. Nếu bạn xóa các cảnh báo, nhận xét và kiểm tra độ tỉnh của nhà phát triển, thì đó là 99 dòng . Không có mã async phức tạp để gỡ lỗi.
Bạn thực sự có thể đọc nó và hiểu tất cả về Redux.
Xem thêm câu trả lời của tôi về nhược điểm của việc sử dụng Redux so với Flux .