Đi tới nội dung

Frontend & giao diện

Frontend chuyên sâu

Mô hình tư duy đúng cho React Server Components, server state với TanStack Query, TypeScript ở tầng type, widget ARIA chuẩn, Web Worker, quan sát người dùng thật và micro-frontend — những phần khó nằm dưới bề mặt framework.

7 phần144 phút đọcCập nhật 20 thg 9, 2026

Các phần

  1. Phần 1

    Mô hình tư duy đúng cho React Server Components: hai module graph, một ranh giới

    "use client" không đánh dấu loại component mà đánh dấu điểm bắt đầu của client graph. Bài này dựng lại mô hình tư duy cho RSC trong Next.js 16: thứ gì đi qua ranh giới, data fetching đặt ở đâu, waterfall, streaming và những lỗi khiến bundle phình hoặc lộ dữ liệu.

    19 phút

  2. Phần 2

    Server state là cache, không phải state: TanStack Query v5 chuyên sâu

    Dữ liệu từ server không thuộc về bạn — bạn chỉ giữ một bản sao có hạn dùng. Bài này đi sâu TanStack Query v5 theo góc nhìn cache: thiết kế query key, staleTime và gcTime, invalidation, optimistic update có rollback, Suspense, hydration với Next.js App Router, infinite query và khi nào không nên dùng nó.

    19 phút

  3. Phần 3

    TypeScript ở tầng type cho API contract không thể dùng sai

    Conditional type và infer, key remapping, template literal type biến "/users/:id/posts/:postId" thành params có type, một fetch client suy ra từ route map, lỗi có type, branded ID, satisfies và const type parameter, cầu nối Zod để type không nói dối — và khi nào nên dừng.

    18 phút

  4. Phần 4

    Widget tuỳ biến dễ tiếp cận trong React: những pattern ARIA thực sự chạy được

    Khi phần tử native không còn đủ, ARIA là một bản hợp đồng bạn phải giữ. Accessibility tree và cách tính accessible name, roving tabindex hay aria-activedescendant, dựng combobox và tabs từng bước, live region thực sự lên tiếng, focus khi đổi route và cách kiểm thử tất cả.

    23 phút

  5. Phần 5

    Đưa việc nặng ra khỏi main thread: Web Worker, transferable, SharedArrayBuffer và worker pool

    Web Worker không phải phép màu cho mọi trang chậm. Bài này đi qua khi nào đáng chuyển việc sang worker, cái giá của structured clone, transferable, SharedArrayBuffer và COOP/COEP, tự viết RPC kiểu Comlink, cấu hình bundler, worker pool, huỷ việc bằng AbortSignal, ví dụ thật và các lựa chọn thay thế như scheduler.yield.

    19 phút

  6. Phần 6

    Frontend observability thực chiến: RUM với web-vitals, source map riêng tư và trace từ trình duyệt tới backend

    Cài Sentry mới là bước đầu. Bài này đi qua cách mình dựng frontend observability thật sự: lab và field data, thu RUM bằng web-vitals attribution, gửi beacon không mất, sampling, source map riêng tư, nhóm lỗi nhiễu, nối trace với backend qua traceparent, lọc PII, dashboard p75 và deploy marker.

    24 phút

  7. Phần 7

    Micro-frontends nói thật: khi nào đáng làm, Module Federation 2.0 chạy ra sao và cái giá phải trả

    Micro-frontends giải quyết bài toán tổ chức — nhiều team deploy độc lập — chứ không phải bài toán kỹ thuật. Bài này so sánh năm cách ghép frontend, đi sâu vào Module Federation 2.0 (shared singleton, version skew, manifest, type, fallback) và chỉ ra khi nào một monorepo Turborepo là câu trả lời tốt hơn.

    22 phút

Ôn tập cả chuỗi

Đã trả lời 0/14 · đúng 0

14 câu rút từ các phần của chuỗi. Trả lời ở đây cũng được tính cho quiz của từng bài.

  1. Câu 1/14Trung cấpTrong mô hình hai module graph, "use client" thực sự có ý nghĩa gì?
  2. Câu 2/14Trung cấpMột ReviewsDrawer (client, có state mở/đóng) cần hiển thị Reviews là async Server Component đọc DB. Cách đúng là gì?
  3. Câu 3/14Trung cấpstaleTime và gcTime khác nhau thế nào trong TanStack Query v5?
  4. Câu 4/14Nâng caoVì sao trên server (Next.js) không nên dùng một QueryClient ở module scope?
  5. Câu 5/14Trung cấpMục tiêu thiết kế của route map trong bài là gì, và nó mang lại lợi ích gì khi ai đó đổi path của một endpoint?
  6. Câu 6/14Nâng caoBạn khai báo const routes: RouteMap = { ... } và thấy mọi lời gọi client đều không đòi params. Nguyên nhân và cách khắc phục?
  7. Câu 7/14Cơ bảnMột đồng nghiệp viết div với role="button" và onClick, cho rằng như vậy là đủ accessible. Điều gì còn thiếu?
  8. Câu 8/14Trung cấpVì sao combobox cho phép gõ dùng aria-activedescendant thay vì roving tabindex để di chuyển giữa các gợi ý?
  9. Câu 9/14Trung cấpBạn chuyển việc parse CSV sang Web Worker, nhưng trang vẫn khựng gần nửa giây khi worker gửi kết quả (hai trăm nghìn object) về. Nguyên nhân chính là gì?
  10. Câu 10/14Cơ bảnTrang của bạn chậm vì React phải render một danh sách mười nghìn dòng. Có nên đưa việc này vào Web Worker không?
  11. Câu 11/14Cơ bảnLighthouse báo LCP 1,2 giây còn Search Console (CrUX) báo 3,8 giây. Cách hiểu nào đúng theo bài?
  12. Câu 12/14Trung cấpĐể không mất CLS và INP khi người dùng đóng trang, nên làm thế nào?
  13. Câu 13/14Trung cấpNhóm 2 người nói "tách micro-frontends để app nhanh hơn và build đỡ chậm". Đánh giá nào đúng theo bài?
  14. Câu 14/14Nâng caoVì sao React và React DOM phải được khai báo là shared singleton trong Module Federation, và hậu quả khi quên một trong hai?

Chuỗi khác

Chuỗi bài