Chương 2: Modern Frontend Development with React
Đây là Phần 3 của series Modern Frontend Development. Trước đây 'state' chỉ có một chỗ duy nhất và mọi thứ đều bỏ vào đó: API responses, modals, form drafts, theme, tất cả nằm chung một store. Sau khi khái niệm về Server State và Client State ra đời, các công cụ và patterns cho mỗi phía trở nên rõ ràng hơn rất nhiều.
Bạn sẽ thấy server state và client state được xử lý thế nào trong các tình huống thực tế cùng với các library phổ biến như Tanstack Query và Zustand. Giúp bạn biết cách lựa chọn library cho từng trường hợp và hiểu rõ tại sao dựa trên đặc tính của server vs client state chứ không phải theo thói quen hay tech hype.
Yêu cầu
Server vs Client State
Nội dung bài hướng dẫn
6 phần • khoảng 75 phút
Quay lại vài năm trước. Hỏi bất kỳ React developer về việc quản lý state như thế nào, câu trả lời gọn lỏn trong một dòng: trong useState ở chỗ này, lift lên parent ở chỗ kia, và cho thứ gì lớn hơn thì có store. Redux, MobX, hay bất kì 1 thư viên nào khác, dùng cái nào cũng cùng một việc: giữ những tất cả những thứ mà UI cần 1 nơi và để component subscribe vào.
Hồi đó mình là fan cứng của Redux. Học nó những ngày đầu làm React thật sự khá khó khăn: flow dispatch-action-reducer, immutability rules, HOC boilerplate. Nhưng khi bắt đầu hiểu rõ hơn, cảm thấy nó rất magic. Mở DevTools, time-travel qua state, replay mọi action đã từng fire. Nếu store giữ tất cả, DevTools thấy tất cả. Cái cảm giác mình có thể control được mọi thứ trong app qua một tool duy nhất là thứ mình chưa từng trải nghiệm trước đó.
Ở đỉnh hype của Redux, pattern đó bị đẩy đến tận cùng. redux-form giữ form state. Thunks dump API response thẳng vào slice nằm ngay cạnh đó. Theme, modal, auth session, cached list từ server, tất cả đều có reducer riêng. Store trở thành app, và bất kể một mảnh state đến từ remote API hay từ một click local, mọi thứ đều được đặt dưới cùng một từ: state.
Mọi thứ ở bên trong 1 store duy nhất
Rồi API work bắt đầu chồng chất. Mỗi endpoint mới đồng nghĩa với cùng một routine: action type, action creator, các case FETCH_REQUEST / SUCCESS / FAILURE, một selector, một thunk hoặc saga. Mỗi cái tạo ra cùng một bộ ba loading / error / data mà cả tá cái khác đã có. Xài redux-saga để xử lý async chỉ thêm việc: generators, takeLatest, put, call, cancellation patterns. Cả một ngôn ngữ thứ hai, và hai endpoint mới vẫn đồng nghĩa với hai saga mới cùng các slice giống y hệt cái mình viết sprint trước.
Handle caching là một trong những phần nhức đầu nhất. Hai component mount cùng lúc, cả hai dispatch cùng một fetch. Mutate một item ở một màn hình, và một reducer case thứ ba là thứ giữ màn hình kia đồng bộ. Mỗi cái là một vấn đề mình tự làm bằng tay, phức tạp, khó maintain và rất dễ sai sót.
Và vì remote data và local flag share chung một store, chúng rất dễ ảnh hưởng đến nhau. Một keystroke trong redux-form có thể re-render một list backed by API data ở khắp app. Nếu không có reselect và memoization ở mọi nơi, app chắc chắn sẽ bị giật lag.
Đến một lúc mình bắt đầu tự hỏi app sẽ trông thế nào nếu toàn bộ những thứ phức tạp phía server kia được đặt ở một chỗ hoàn toàn khác. Tưởng tượng một layer riêng sở hữu cache, dedupe, background refetch, behavior stale-then-fresh, và invalidation. Với phần đó được handle, cái còn lại trong store trở nên đơn giản hơn rất nhiều: theme, modal flag, sidebar toggle. Local, synchronous, và được scope lại rất nhỏ.
tưởng tượng: hai khái niệm về state
Đến một lúc community cũng tách bạch hai loại state này ra, và phần còn lại của chương xoay quanh cả hai. Phần tiếp theo sẽ đặt tên cho từng nửa, và mình muốn bắt đầu với phía vừa kể, phía sẽ handle toàn bộ những phần khó khăn và phức tạp hơn: server state.
Chia sẻ với mọi người
Về tác giả
NAB, Lead Engineer
Mình là Vũ, hiện là Lead Engineer ở NAB (National Australia Bank). Mình bắt đầu ở mảng Home Lending, giờ đang lead một team làm sản phẩm cho HICAPS, dịch vụ point-of-sale claiming bảo hiểm sức khỏe tư nhân lớn nhất ở Úc. Trước NAB, mình từng làm ở các startup và nhiều team khác với đa dạng stack.
Upskills là nơi mình chia sẻ những kiến thức thực tế từ công việc, để giúp bạn build và ship dự án tốt hơn. Ngoài tutorial, sắp tới sẽ có thêm nhiều nội dung: project showcase, interview prep, và các AI tool, như những resource cho hành trình học của bạn. Mình rất vui được chia sẻ những kiến thức và kinh nghiệm đã học được trong suốt quá trình làm việc, và có thể chia sẻ thêm nhiều điều thú vị cùng nhau khi chúng ta tiếp tục build những thứ hay ho.
Các bài deep-dive về web development thực tế, một đến hai tuần một số, viết bởi engineer thực sự có kinh nghiệm build sản phẩm. Không sáo rỗng, không câu view.
Chúng tôi tôn trọng quyền riêng tư. Hủy đăng ký bất cứ lúc nào.