Table of Contents
Nếu gần đây bạn có theo dõi những thông tin mới từ cộng đồng React developers thì chắc hẳn bạn sẽ không bỏ qua sự kiện JSConf Iceland 2018
Và có một điều đáng chú ý nhất của sự kiện đó là bài nói của Dan Abramov về tương lai của React. Sneak Peek của bài viết có thể tìm thấy ở bài blog này, và đây là video đầy đủ về JS Conf.
Có một điều khá bất ngờ trong hội thảo này đó là phần lớn các bài thuyết trình đều hướng về hệ sinh thái React, hoặc ít nhất là có một code snippets trong đó, có thể thấy được React đã trở thành một thư viện phổ biến nhất nhiều năm qua.
Vậy thì có gì mới ở phiên bản React sắp ra mắt trong năm 2018? Điều gì khiến cộng đồng React developers trên các diễn đàn như Redit, Spetrum hay team Apollo hào hứng đến vậy?
Đó là chính là những ứng dụng cụ thể mà React Fiber mang lại sau khi React được viết lại trong bản 16, Dan đã chỉ ra cách để có thể cập nhật DOM elements một cách bất đồng bộ (asynchronous), điều mà trước đây không thể, thông qua 2 ví dụ về 2 thuật ngữ mới: “Time slicing” và “Suspense”
Mình sẽ lần lượt giải thích các ví dụ trong bài thuyết trình của Dan vì vậy bạn nên dành thời gian để xem qua nó trước.
Hiện tại, React cập nhật DOM một cách đồng bộ và một khi React bắt đầu render thì nó sẽ không dừng lại được.
Vậy nếu như React có thể cập nhật một cách bất đồng bộ, khi bắt đầu render, nó có thể tạm ngưng và tiếp tục render ở thời điểm khác (yeild). Ví dụ cụ thể đó là khi có một sự kiện quan trọng hơn cần update trước như một ô input, trình duyệt sẽ xử lý sự kiện đó trước mà không block các hành động khác.
Trong chế độ bất đồng bô, người dùng vẫn có thể tương tác với app ngay cả khi nó đang render.
Table of Contents
Lấy dữ liệu trong khi Render
import { createFetcher, Placeholder, Loading } from '../future';
Fetcher object sẽ làm việc giống như một nơi lưu trữ (cache) và nó có một method: read.
Đây là cách Future fetcher làm việc:
- Trong hàm render, đọc các giá trị từ cache.
- Nếu như các giá trị đã được lưu lại trước đó (cached), hàm render tiếp tục chạy như bình thường.
- Nếu như dữ liệu chưa được cached, cache throws một Promise (thay vì error).
- Khi Promise được resolved, React render lại những phần thiếu.
- Dữ liệu cache được chia sẻ trong suốt cây DOM của React nhờ vào context API mới.
Chúng ta có thể tìm hiểu kỹ thuật suspension này trong library simple-cache-provider API, hoặc có trong ví dụ trước và sau những tweets của Dan(trước, sau), hay trong tweet này. Ngoài ra có thể tham khảo bài viết của Swyx: A Walkthrough of *that* React Suspense Demo
Người dùng hoàn toàn có thể tương tác với ứng dụng ngay cả khi dữ liệu đang được lấy (fetching), và sẽ không có vấn đề gì kể cả chúng ta click xung quanh ứng dụng, trigger một hành động fetch khác.
Code Splitting For The Win!
Time Slicing và Suspense được lấy cảm hứng từ Git as a metaphor
Đây là lý đo tại sao bạn nên học và tiếp tục sử dụng React! VirtualDOM có thể đễ dàng được tạo ra như nhiều thư viện khác đã làm (Vue, Preact,..), nhưng để tối ưu hóa là cực kỳ khó khăn. Tuy nhiên với những cải tiến này, React xứng đáng tiếp tục trở thành thư viện JavaScript số 1 trong những năm tới. 🙂