เขียน Redux ที่นี่!
Redux ไม่ได้ว่าแตกต่างจากฟลักซ์ โดยรวมแล้วมันมีสถาปัตยกรรมเดียวกัน แต่ Redux สามารถตัดมุมซับซ้อนบางส่วนได้โดยใช้การจัดองค์ประกอบการทำงานที่ Flux ใช้การลงทะเบียนการโทรกลับ
ไม่มีความแตกต่างพื้นฐานใน Redux แต่ฉันพบว่ามันทำให้บาง abstractions ง่ายขึ้นหรืออย่างน้อยก็เป็นไปได้ที่จะนำมาใช้ซึ่งจะยากหรือเป็นไปไม่ได้ที่จะนำไปใช้ใน Flux
องค์ประกอบลด
ยกตัวอย่างเช่นเลขหน้า ตัวอย่างFlux + React Routerของฉันจัดการการให้เลขหน้า แต่โค้ดสำหรับรหัสนั้นแย่มาก หนึ่งในเหตุผลที่มันแย่มากคือFlux ทำให้การใช้งานฟังก์ชั่นซ้ำข้ามร้านค้าเป็นเรื่องผิดปกติ หากร้านค้าสองแห่งจำเป็นต้องจัดการกับการแบ่งหน้าเพื่อตอบสนองต่อการกระทำที่แตกต่างกันพวกเขาจำเป็นต้องสืบทอดจากร้านค้าพื้นฐานทั่วไป (ไม่ดี! คุณกำลังล็อคตัวเองในการออกแบบเฉพาะเมื่อคุณใช้การสืบทอด) หรือเรียกใช้ฟังก์ชันที่กำหนดจากภายนอก ตัวจัดการเหตุการณ์ซึ่งจะต้องดำเนินการกับสถานะส่วนตัวของร้านค้า Flux สิ่งทั้งหมดนั้นยุ่งเหยิง (แม้ว่าจะอยู่ในขอบเขตที่เป็นไปได้แน่นอน)
ในอีกทางหนึ่งด้วย Redux เลขหน้าเป็นธรรมชาติขอบคุณองค์ประกอบลด มัน reducers ทั้งหมดทางลงเพื่อให้คุณสามารถเขียนโรงงานลดที่สร้าง reducers เลขหน้าแล้วใช้มันในต้นไม้ลดของคุณ กุญแจสำคัญในการที่ทำไมมันง่ายมากคือเพราะใน Flux ร้านค้าแบน แต่ใน Redux reducers สามารถซ้อนกันผ่านองค์ประกอบการทำงานเช่นเดียวกับส่วนประกอบ React สามารถซ้อนกันได้
รูปแบบนี้ยังช่วยให้คุณสมบัติที่ยอดเยี่ยมไม่เหมือนใครผู้ใช้รหัสยกเลิก / ทำซ้ำ คุณลองนึกภาพการเสียบเลิกทำ / ทำซ้ำในแอป Flux เป็นโค้ดสองบรรทัดหรือไม่ แทบจะไม่ ด้วย Redux มันคือ -กาเกนด้วยรูปแบบการลดองค์ประกอบ ฉันต้องเน้นว่าไม่มีอะไรใหม่เกี่ยวกับเรื่องนี้ - นี่คือรูปแบบที่บุกเบิกและอธิบายอย่างละเอียดในElm Architectureซึ่งได้รับอิทธิพลจาก Flux
เซิร์ฟเวอร์แสดงผล
ผู้คนแสดงผลบนเซิร์ฟเวอร์ได้ดีด้วย Flux แต่เมื่อเห็นว่าเรามีไลบรารี่ 20 ไลบรารี่แต่ละอันพยายามที่จะทำให้เซิร์ฟเวอร์เรนเดอร์“ ง่ายขึ้น” บางทีฟลักซ์อาจมีขอบคร่าวๆอยู่บนเซิร์ฟเวอร์ ความจริงก็คือ Facebook ไม่ได้ทำการเรนเดอร์เซิร์ฟเวอร์มากนักดังนั้นพวกเขาจึงไม่ได้กังวลมากนักและพึ่งพาระบบนิเวศน์เพื่อให้ง่ายขึ้น
ใน Flux ดั้งเดิมร้านค้าเป็นแบบซิงเกิล ซึ่งหมายความว่าเป็นการยากที่จะแยกข้อมูลสำหรับคำขอต่าง ๆ บนเซิร์ฟเวอร์ เป็นไปไม่ได้ แต่ยาก นี่คือสาเหตุที่ไลบรารี Flux ส่วนใหญ่ (รวมถึงFlux Utilsใหม่) ตอนนี้แนะนำให้คุณใช้คลาสแทน singletons เพื่อให้คุณสามารถยกตัวอย่างร้านค้าได้ตามคำขอ
ยังคงมีปัญหาต่อไปนี้ที่คุณต้องแก้ไขใน Flux (ด้วยตัวคุณเองหรือด้วยความช่วยเหลือของ Flux library ที่คุณโปรดปรานเช่นFlummoxหรือAlt ):
- หากร้านค้าเป็นชั้นเรียนฉันจะสร้างและทำลายพวกเขาด้วยโปรแกรมเลือกจ่ายงานต่อคำขอได้อย่างไร ฉันจะลงทะเบียนร้านค้าได้เมื่อใด
- ฉันจะให้ความชุ่มชื้นกับข้อมูลจากร้านค้าและหลังจากนั้นคืนมันให้กับลูกค้า? ฉันจำเป็นต้องใช้วิธีพิเศษสำหรับสิ่งนี้หรือไม่?
กรอบ Flux ที่เป็นที่ยอมรับ (ไม่ใช่ vanilla Flux) มีวิธีแก้ไขปัญหาเหล่านี้ แต่ฉันพบว่ามันซับซ้อนเกินไป ยกตัวอย่างเช่นFlummox ขอให้คุณในการดำเนินการserialize()
และdeserialize()
ในร้านค้าของคุณ Alt แก้ปัญหา nicer นี้โดยการจัดเตรียมtakeSnapshot()
สถานะของคุณให้เป็นลำดับโดยอัตโนมัติในทรี JSON
Redux เดินหน้าต่อไป: เนื่องจากมีเพียงร้านเดียว (จัดการโดย reducers จำนวนมาก), คุณไม่จำเป็นต้องมี API พิเศษใด ๆ ในการจัดการกับ hydration (re) คุณไม่จำเป็นต้อง "ร้านค้า" ล้าง "หรือ" ไฮเดรต "- มีเพียงร้านเดียวและคุณสามารถอ่านสถานะปัจจุบันของมันหรือสร้างร้านค้าใหม่ด้วยสถานะใหม่ คำขอแต่ละรายการจะได้รับอินสแตนซ์ร้านค้าแยกต่างหาก อ่านเพิ่มเติมเกี่ยวกับการแสดงผลเซิร์ฟเวอร์ด้วย Redux
อีกครั้งนี่เป็นกรณีของสิ่งที่เป็นไปได้ทั้งใน Flux และ Redux แต่ห้องสมุด Flux แก้ปัญหานี้ได้ด้วยการแนะนำ API และการประชุมจำนวนมากและ Redux ไม่จำเป็นต้องแก้ปัญหาด้วยซ้ำเพราะมันไม่มีปัญหาใน สถานที่แรกต้องขอบคุณความเรียบง่ายทางแนวคิด
ประสบการณ์นักพัฒนา
ฉันไม่ได้ตั้งใจจริง Redux ที่จะกลายเป็นที่นิยมมูกเลือดห้องสมุดฉันเขียนมันขณะที่ผมกำลังทำงานของฉันพูดคุยเกี่ยวกับการโหลด ReactEurope ร้อนกับการเดินทางข้ามเวลา ฉันมีวัตถุประสงค์หลักหนึ่งประการ: ทำให้สามารถเปลี่ยนรหัสลดได้ทันทีหรือแม้แต่“ เปลี่ยนอดีต” โดยข้ามการกระทำและดูสถานะที่คำนวณใหม่
ฉันไม่ได้เห็นห้องสมุด Flux เดียวที่สามารถทำได้ React Hot Loader ไม่อนุญาตให้คุณทำเช่นนี้ - จริง ๆ แล้วมันจะแตกถ้าคุณแก้ไข Flux stores เพราะมันไม่รู้ว่าต้องทำอะไรกับมัน
เมื่อ Redux ต้องการโหลดรหัสลดใหม่จะมีการเรียกใช้replaceReducer()
และแอปจะทำงานด้วยรหัสใหม่ ใน Flux ข้อมูลและฟังก์ชั่นจะพันกันในร้านค้า Flux ดังนั้นคุณจึงไม่สามารถ“ แค่แทนที่ฟังก์ชั่น” ได้ ยิ่งไปกว่านั้นคุณจะต้องลงทะเบียนเวอร์ชั่นใหม่ด้วย Dispatcher อีกครั้ง - สิ่งที่ Redux ไม่ได้มี
ระบบนิเวศ
Redux มีระบบนิเวศที่อุดมสมบูรณ์และเติบโตอย่างรวดเร็ว นี้เป็นเพราะมีไม่กี่จุดส่วนขยายเช่นมิดเดิลแวร์ มันถูกออกแบบมาพร้อมกับกรณีใช้งานเช่นการบันทึก , การสนับสนุนสำหรับสัญญา , สิ่งที่สังเกตได้ , การกำหนดเส้นทาง , การตรวจสอบ dev ที่ไม่สามารถเปลี่ยนแปลงได้ , การติดตาฯลฯ ไม่ใช่ว่าทุกอย่างจะมีประโยชน์ แต่ก็เป็นเรื่องดีที่มีการเข้าถึงชุดเครื่องมือที่สามารถใช้งานร่วมกันได้อย่างง่ายดาย
ความง่าย
Redux รักษาผลประโยชน์ทั้งหมดของ Flux (การบันทึกและการเล่นซ้ำของการกระทำการไหลของข้อมูลทิศทางเดียวการกลายพันธุ์ที่ขึ้นอยู่กับ) และเพิ่มผลประโยชน์ใหม่ (ยกเลิกการทำซ้ำง่ายการโหลดซ้ำร้อน) โดยไม่ต้องแนะนำ
การทำให้เป็นเรื่องง่ายนั้นเป็นสิ่งสำคัญเพราะมันทำให้คุณมีสติในขณะที่คุณใช้ abstractions ระดับที่สูงขึ้น
ซึ่งแตกต่างจากห้องสมุด Flux ส่วนใหญ่พื้นผิว Redux API มีขนาดเล็ก ถ้าคุณเอาคำเตือนนักพัฒนาความคิดเห็นและตรวจสอบสติก็99 สาย ไม่มีรหัส async ที่ยุ่งยากในการตรวจแก้จุดบกพร่อง
คุณสามารถอ่านและทำความเข้าใจกับ Redux ได้ทั้งหมด
ดูเพิ่มเติมคำตอบของฉันในข้อเสียของการใช้ Redux เมื่อเทียบกับฟลักซ์