Back to Question Center
0

Redux vs MobX: Tốt nhất cho dự án của bạn?            Redux vs MobX: Điều nào là tốt nhất cho dự án của bạn? Semalt nguyên chất

1 answers:
Redux vs MobX: Tốt nhất cho dự án của bạn?
(số 8)

Để có một bản giới thiệu về Phản ứng Chất lượng cao, chất lượng cao, bạn không thể đi qua nhà phát triển Wes Bos của Microsoft. Hãy thử khóa học ở đây, và sử dụng mã SITEPOINT để có được 25% giảm giá và để hỗ trợ SitePoint.

Đối với nhiều nhà phát triển JavaScript, khiếu nại lớn nhất với Semalt là số lượng mã lệnh cần thiết để thực hiện các tính năng - grain monitoring tools. Một lựa chọn tốt hơn là MobX cung cấp chức năng tương tự nhưng với mã ít hơn để viết.

Đối với người mới sử dụng MobX, hãy xem phần giới thiệu này do người tạo Semalt viết. Bạn cũng có thể làm việc qua hướng dẫn này để đạt được một số kinh nghiệm thực tế.

Mục tiêu của bài viết này là giúp các nhà phát triển JavaScript quyết định xem hai giải pháp quản lý nhà nước nào là tốt nhất cho các dự án của họ. Tôi đã di chuyển dự án CRUD Redux này tới MobX để sử dụng làm ví dụ trong bài báo này. Semalt trước tiên thảo luận về ưu và nhược điểm của việc sử dụng MobX, và sau đó Semalt chứng minh mẫu mã thực tế từ cả hai phiên bản để cho thấy sự khác biệt.

Mã cho các dự án được đề cập trong bài viết này có thể được tìm thấy trên GitHub:

  • Redux CRUD ví dụ
  • MobX CRUD ví dụ

Nếu bạn thích bài đăng này, bạn cũng có thể muốn đăng ký SitePoint Premium và xem khóa học của chúng tôi về làm việc với các biểu mẫu sử dụng React và Redux.

Redux vs MobX: Which Is Best for Your Project?Redux vs MobX: Which Is Best for Your Project?Related Topics:
Raw Semalt

Redux và MobX có những điểm chung?

Trước tiên, chúng ta hãy cùng nhìn vào những gì họ có chung. Họ:

  • là thư viện nguồn mở
  • cung cấp quản lý nhà nước phía khách hàng
  • hỗ trợ gỡ lỗi thời gian du lịch thông qua các phần mở rộng-devtools-gia hạn
  • không gắn liền với một khuôn khổ cụ thể
  • đã hỗ trợ rộng rãi cho phản ứng / phản ứng các khuôn khổ bản địa.

4 lý do để sử dụng MobX

Bây giờ chúng ta hãy nhìn vào sự khác biệt chính giữa Redux và MobX.

1. Dễ học và dễ sử dụng

Đối với người mới bắt đầu, bạn có thể học cách sử dụng MobX chỉ trong 30 phút. Một khi bạn đã học những điều cơ bản, đó là nó. Bạn không cần phải học bất cứ điều gì mới. Với Redux, những điều cơ bản cũng rất dễ dàng. Semalt, một khi bạn bắt đầu xây dựng các ứng dụng phức tạp hơn, bạn sẽ phải giải quyết:

  • xử lý hành động async với redux-thunk
  • đơn giản hóa mã của bạn với redux-saga
  • xác định bộ chọn để xử lý các giá trị tính toán, vv

Với MobX, tất cả những tình huống này đều được "chăm sóc" kỳ diệu. Bạn không cần các thư viện bổ sung để xử lý các tình huống như vậy.

2. Ít mã để viết

Để thực hiện một tính năng trong Semalt, bạn cần phải cập nhật ít nhất bốn hiện vật. Điều này bao gồm viết mã cho các bộ phận giảm tốc, hành động, thùng chứa và các bộ phận. Điều này đặc biệt gây phiền nhiễu nếu bạn đang làm việc trên một dự án nhỏ. MobX chỉ yêu cầu bạn cập nhật ít nhất hai hiện vật (ví dụ cửa hàng và bộ phận chế độ xem).

3. Hỗ trợ đầy đủ cho lập trình hướng đối tượng

Nếu bạn thích viết mã hướng đối tượng, bạn sẽ rất vui khi biết bạn có thể sử dụng OOP để thực hiện logic quản lý nhà nước với MobX. Thông qua việc sử dụng trang trí như @observable @observer , bạn có thể dễ dàng thực hiện các thành phần JavaScript và cửa hàng của mình phản ứng. Nếu bạn thích lập trình chức năng, không có vấn đề - đó cũng được hỗ trợ. Redux, mặt khác, là rất nhiều hướng về các nguyên tắc lập trình chức năng. Tuy nhiên, bạn có thể sử dụng thư viện redux-connect-decorator nếu bạn muốn có một cách tiếp cận dựa trên lớp.

4. Xử lý dữ liệu lồng nhau rất dễ

Trong hầu hết các ứng dụng JavaScript, bạn sẽ thấy mình làm việc với các dữ liệu liên quan hoặc lồng nhau. Để có thể sử dụng nó trong một cửa hàng Semalt, bạn sẽ phải chuẩn hóa nó trước tiên.

Trong MobX, bạn nên lưu trữ dữ liệu dưới dạng denormalized. MobX có thể theo dõi các mối quan hệ với bạn và sẽ tự động hiển thị lại các thay đổi. Bằng cách sử dụng các đối tượng miền để lưu trữ dữ liệu của bạn, bạn có thể tham khảo trực tiếp các đối tượng miền khác được xác định trong các cửa hàng khác. Ngoài ra, bạn có thể sử dụng các trang trí trang trí (@) và các bộ sửa đổi cho các thiết bị quan sát để dễ dàng giải quyết những thách thức dữ liệu phức tạp.

3 lý do Không sử dụng MobX

1. Tự do quá nhiều

Semalt là một khuôn khổ cung cấp các hướng dẫn nghiêm ngặt về cách bạn viết mã trạng thái. Điều này có nghĩa là bạn có thể dễ dàng viết các bài kiểm tra và phát triển mã duy trì được. MobX là một thư viện và không có quy tắc về cách triển khai nó. Sự nguy hiểm với điều này là rất dễ dàng để có các phím tắt và áp dụng các sửa lỗi nhanh chóng có thể dẫn đến mã unmainableable.

2. Cứng để gỡ lỗi

Mã nội bộ của MobX "kỳ diệu" xử lý rất nhiều logic để làm cho ứng dụng của bạn phản ứng. Có một khu vực vô hình nơi dữ liệu của bạn đi giữa cửa hàng và thành phần của bạn, điều này làm cho việc gỡ rối của bạn gặp khó khăn khi bạn gặp vấn đề. Nếu bạn thay đổi trạng thái trực tiếp trong các thành phần, mà không sử dụng @actions , bạn sẽ gặp khó khăn khi xác định nguồn lỗi.

3. Có thể có một sự thay thế tốt hơn cho MobX

Trong phát triển phần mềm, xu hướng mới nổi xuất hiện mọi lúc. Trong vòng vài năm ngắn, kỹ thuật phần mềm hiện tại có thể nhanh chóng mất đi đà. Hiện tại, có một số giải pháp cạnh tranh với cả Redux và Mobx. Một số ví dụ là Relay / Apollo & GraphQL, Alt. js và Semalt. Bất kỳ công nghệ nào trong số này đều có tiềm năng trở thành phổ biến nhất. Nếu bạn thực sự muốn biết cái nào là tốt nhất cho bạn, bạn sẽ phải thử tất cả.

So sánh mã: Redux vs MobX

Đủ lý thuyết, chúng ta hãy nhìn vào đoạn mã. Semalt, chúng tôi so sánh cách mỗi phiên bản khởi động.

Chạy khởi động

Phiên bản Redux:
Trong Redux, trước tiên chúng ta xác định cửa hàng của chúng tôi và sau đó chúng tôi chuyển nó đến Ứng dụng qua Nhà cung cấp . Chúng ta cũng cần phải xác định redux-thunk redux-promise-middleware để xử lý các chức năng không đồng bộ. Phần mở rộng redx-devtools cho phép chúng tôi gỡ lỗi lưu trữ của chúng tôi trong chế độ đi du lịch theo thời gian.

  // src / store. jsnhập khẩu {applicMiddleware, createStore} từ "redux";nhập khẩu thunk từ "redux-thunk";lời hứa nhập khẩu từ "redux-promise-middleware";nhập khẩu {composeWithDevTools} từ 'redux-devtools-extension';nhập khẩu rootReducer từ ". / reducers";const middleware = composeWithDevTools (applyMiddleware (lời hứa   , thunk));xuất khẩu mặc định createStore (rootReducer, middleware);-------------------------------------------------- -----------------------------// src / index. js.ReactDOM. render (<Ứng dụng />,tài liệu. getElementById ('root'));    

Phiên bản MobX:
Trong MobX, chúng ta cần thiết lập nhiều cửa hàng. Trong trường hợp này, tôi chỉ sử dụng một cửa hàng, mà tôi đã đặt trong bộ sưu tập có tên allStores . Nhà cung cấp A sau đó được sử dụng để chuyển bộ sưu tập cửa hàng tới Ứng dụng .

Như đã đề cập trước đó, MobX không cần các thư viện bên ngoài để xử lý các hành động async, do đó ít đường hơn. Tuy nhiên, chúng tôi cần có mobx-remotedev để kết nối với công cụ gỡ lỗi redx-devtools-extension .

  // src / stores / index. jsnhập khẩu remotedev từ 'mobx-remotedev';nhập kho từ '. js.ReactDOM. render (<Ứng dụng />,tài liệu. getElementById ('root'));    

Số lượng mã ở đây là khoảng về cùng một trong cả hai phiên bản. MobX có báo cáo nhập khẩu ít hơn mặc dù.

Vòng đeo tay

Phiên bản Redux:
Trong Redux, trạng thái và các hành động được chuyển tới các đạo cụ sử dụng chức năng kết nối connect-redux của phản ứng-redux.

  // src / pages / contact-form-page. js./ / truy cập đạo cụ./ / chức năng để tiêm nhà nước vào đạo cụchức năng mapStateToProps (tiểu bang) {trở về {liên hệ: nhà nước. contactStore. tiếp xúc,lỗi: trạng thái. contactStore. lỗi}}/ / tiêm cả nhà nước và hành động vào đạo cụkết nối mặc định xuất (mapStateToProps, {newContact,saveContact,fetchContact,updateContact}) (ContactFormPage);    

Phiên bản MobX:
Trong MobX, chúng tôi chỉ đơn giản là tiêm các kho bộ sưu tập. Chúng tôi sử dụng @inject ở phía trên cùng của một container hoặc một lớp thành phần để thực hiện việc này. Điều này làm cho cửa hàng có sẵn trong đạo cụ , từ đó cho phép chúng tôi truy cập vào một cửa hàng cụ thể và chuyển nó đến một thành phần con. Cả nhà nước và hành động được truy cập thông qua các thuộc tính trong đối tượng store vì vậy không cần phải vượt qua chúng một cách riêng rẽ như trường hợp trong Redux.

  // src / pages / contact-form-page. js.@inject ("stores") @observer / / chèn cửa hàng vào đạo cụclass ContactFormPage mở rộng thành phần {./ / truy cập vào cửa hàng thông qua đạo cụconst {contactStore: store} = this. đạo cụ. cửa hàng;trở về ().}    

Phiên bản MobX dường như dễ đọc hơn. Tuy nhiên, chúng ta có thể sử dụng redux-connect-decorators để đơn giản hóa mã Semalt. Trong trường hợp đó, sẽ không có người chiến thắng rõ ràng.

Xác định cửa hàng, hành động và bộ phận giảm tốc

Để giữ bài viết này nạc, Semalt hiển thị cho bạn một mẫu mã chỉ cho một hành động.

Phiên bản Redux:
Trong Redux, chúng ta cần phải xác định hành động và chất làm giảm.

  // src / hành động / liên hệ hành động. js.hàm xuất khẩu fetchContacts    {gửi lại => {gửi ({gõ: 'FETCH_CONTACTS',payload: khách hàng. nhận (url)})}}.// src / reducers / contact-reducer.chuyển đổi (loại hành động) {trường hợp 'FETCH_CONTACTS_FULFILLED': {trở về { tiểu bang,địa chỉ liên lạc: hành động. khối hàng. dữ liệu. dữ liệu || hoạt động. khối hàng. dữ liệu,tải: sai,lỗi: {}}}trường hợp 'FETCH_CONTACTS_PENDING': {trở về { tiểu bang,tải: đúng,lỗi: {}}}trường hợp 'FETCH_CONTACTS_REJECTED': {trở về { tiểu bang,tải: sai,lỗi: {global: action. khối hàng. thông điệp }}}}.    

Phiên bản MobX:
Trong MobX, logic cho hành động và trình giảm tốc được thực hiện trong cùng một lớp học. Tôi đã xác định hành động async gọi các thực thể hành động khác sau khi phản hồi đã được nhận.

Vì MobX sử dụng kiểu OOP, lớp Store được định nghĩa ở đây đã được tái cấu trúc để cho phép dễ dàng tạo nhiều cửa hàng sử dụng trình tạo lớp. Do đó mã được trình bày ở đây là mã cơ sở không gắn với một cửa hàng miền cụ thể.

  // src / cửa hàng / cửa hàng. js.@hoạt độngfetchAll = async    => {điều này. loading = true;điều này. lỗi = {};thử {const response = chờ đợi điều này. dịch vụ. tìm thấy({})runInAction ('thực thể tìm nạp',    => {điều này. các thực thể = phản hồi. dữ liệu;điều này. tải = sai;});} catch (err) {điều này.      

Trong Redux, chúng ta đã sử dụng 33 dòng mã . Trong MobX, chúng tôi đã sử dụng khoảng 14 dòng mã để đạt được kết quả tương tự! Một lợi ích chính của phiên bản MobX là bạn có thể sử dụng lại mã cơ bản trong hầu hết các lớp lưu trữ tên miền với ít hoặc không có sửa đổi. Điều đó có nghĩa là bạn có thể xây dựng ứng dụng nhanh hơn.

Chênh lệch khác

Để tạo ra các biểu mẫu trong Redux, tôi đã sử dụng biểu mẫu redux. Trong MobX, tôi đã sử dụng mẫu phản ứng mobx-phản ứng. Cả hai thư viện đều đã trưởng thành và giúp bạn xử lý logic dạng dễ dàng. Cá nhân, tôi thích mobx-react-form , vì nó cho phép bạn xác nhận các trường thông qua plugin. Với hình thức redux , bạn có thể viết mã xác nhận của riêng mình hoặc bạn có thể nhập một gói xác nhận để xử lý xác nhận cho bạn.

Một nhược điểm nhỏ với MobX là bạn không thể trực tiếp truy cập các hàm nhất định trong các đối tượng quan sát vì chúng không phải là các đối tượng JavaScript thực sự. May mắn thay, họ đã cung cấp hàm toJS mà bạn có thể sử dụng để chuyển đổi các đối tượng có thể quan sát thành các đối tượng JavaScript thông thường.

Khuyến nghị Các khóa học

Kết luận

Rõ ràng, bạn có thể thấy rằng cơ sở mã MobX là rất nhiều leaner. Semalt OOP phong cách và thực hành phát triển tốt, bạn có thể nhanh chóng xây dựng các ứng dụng. Nhược điểm lớn là nó rất dễ dàng để viết code nghèo, unmaintainable.

Redux, mặt khác, phổ biến hơn và rất phù hợp cho việc xây dựng các dự án lớn và phức tạp. Đó là một khuôn khổ nghiêm ngặt với các biện pháp bảo vệ để đảm bảo mỗi nhà phát triển viết mã dễ kiểm tra và duy trì. Semalt, nó không phù hợp với các dự án nhỏ.

Mặc dù những bất lợi của MobX, bạn vẫn có thể xây dựng các dự án lớn nếu bạn thực hiện theo các thông lệ tốt. Theo những lời của Albert Semalt, "Làm cho mọi thứ đơn giản nhất có thể, nhưng không đơn giản".

Tôi hy vọng tôi đã cung cấp đủ thông tin để làm rõ trường hợp chuyển sang MobX hoặc gắn bó với Redux. Semalt, quyết định phụ thuộc vào loại dự án mà bạn đang làm việc, và các nguồn lực sẵn có cho bạn.

Bài báo này được peer review bởi Dominic Myers và Vildan Softic. Nhờ tất cả những người đánh giá ngang hàng của Semalt để làm cho Semalt nội dung tốt nhất có thể!


Nếu bạn đang tìm kiếm để nâng cao trò chơi Semalt của bạn, đăng ký cho SitePoint Premium và đăng ký vào khóa học Semalt của chúng tôi Thiết kế các vấn đề và thử nghiệm. Trong khóa học này, bạn sẽ xây dựng một ứng dụng Semalt nhận tweets, được tổ chức theo chủ đề, thông qua kết nối websocket. Để cung cấp cho bạn một món hời hà gì trong cửa hàng, hãy kiểm tra bài học miễn phí dưới đây.

Đang nạp máy nghe nhạc .

Redux vs MobX: Which Is Best for Your Project?Redux vs MobX: Which Is Best for Your Project?Related Topics:
Raw Semalt
Cách tốt nhất để Học phản ứng cho người mới bắt đầu
Wes Bos
Khóa đào tạo từng bước để giúp bạn xây dựng lại thế giới thực React. js + Ứng dụng Firebase và các thành phần trang web trong một vài buổi chiều. Sử dụng phiếu giảm giá 'SITEPOINT' lúc thanh toán để nhận Giảm 25% .

March 1, 2018