- vừa được xem lúc

Từ Zero đến Principal Frontend Engineer (P9): Xây Dựng Design System Ở Quy Mô Lớn – Khi UI Trở Thành Một Sản Phẩm

0 0 1

Người đăng: Albert Huynh

Theo Viblo Asia

"Làm UI thì cần gì Design System? Cứ code thẳng component là xong!"

Đó là suy nghĩ của mình 5 năm trước, cho đến khi phải maintain một dự án với:

  • 10+ developers cùng sửa giao diện, mỗi người một style.
  • 3 phiên bản button khác nhau chỉ vì không ai biết component nào là "chuẩn".
  • 1 tháng chỉ để đồng bộ lại CSS cho toàn bộ app.

Lúc đó, mình mới nhận ra: Design System không phải là thứ xa xỉ, mà là công cụ sinh tồn khi frontend phát triển đến một quy mô nhất định.


1. Design System Là Gì? Và Tại Sao Nó Lại Quan Trọng?

Không chỉ là UI Kit!

Nhiều người lầm tưởng Design System chỉ là một thư viện component. Thực tế, nó bao gồm:

  • Design Tokens: Biến đổi màu sắc, spacing, typography thành dạng data (JSON/JS).
  • Component Library: Button, Modal, Dropdown... được chuẩn hóa API.
  • Documentation: Hướng dẫn sử dụng, best practices.
  • Quy trình cập nhật: Versioning, changelog, deprecation policy.

Lợi ích khi áp dụng Design System

  • Tốc độ phát triển: Thay vì mất 2 ngày để build một form, giờ chỉ cần kéo component có sẵn.
  • Nhất quán UX: User không bị "giật mình" khi chuyển giữa các trang.
  • Dễ bảo trì: Thay đổi brand color chỉ cần sửa 1 chỗ.

2. Kiến Trúc Một Design System "Cứng Cáp"

2.1. Design Tokens – Nền Tảng Của Mọi Thứ

Thay vì hard-code màu:

/* Cách cũ - Khó maintain */
.button { background: #3b82f6; }

Chuyển thành tokens:

// tokens.js
export const colors = { primary: "#3b82f6", danger: "#ef4444",
};

→ Dùng ở mọi nơi:

<Button bg={colors.primary} />

Ưu điểm:

  • Dễ áp dụng dark/light theme.
  • Share được với Android/iOS (dùng cùng file JSON).

2.2. Component API Phải "Dễ Dùng, Khó Phá"

Một component tốt phải:

  • Có PropTypes/TypeScript: Để auto-complete khi sử dụng.
  • Hỗ trợ Composition:
<Card> <Card.Header title="Profile" /> <Card.Body>Content</Card.Body>
</Card>
  • Xử lý lỗi rõ ràng: Nếu thiếu prop bắt buộc, log ra lỗi cụ thể.

2.3. Versioning & Monorepo

Khi Design System phát triển, cần:

  • Quản lý version (SemVer: major.minor.patch).
  • Dùng monorepo (Turborepo, Nx) để share code giữa các packages.
/packages /design-tokens /react-components /docs

3. Công Cụ & Quy Trình Triển Khai

3.1. Storybook – "Cửa Hàng Demo" Cho Components

  • Mỗi component đi kèm docs + examples:
    ## Button
    - Props: `variant`, `size`, `disabled`
    - Usage: `<Button variant="primary">Submit</Button>`
    
  • Visual Testing: Dùng Chromatic để tự động phát hiện UI bị vỡ.

3.2. Tích Hợp Với Figma

  • Figma → Code: Dùng plugin như Figma to React để tự động gen component từ design.
  • Single Source of Truth: Đảm bảo design file và code luôn đồng bộ.

3.3. Làm Sao Để Team "Chịu Dùng"?

  • Pha "Cưỡng Chế":
    • Thêm rule ESLint: Cấm hard-coded colors/spacing.
    • Code review từ chối nếu không dùng Design System.
  • Pha "Dụ Dỗ":
    • Demo: "Xài component này, build form nhanh hơn 50%".
    • Tổ chức internal contest: Team nào dùng Design System nhiều nhất được thưởng.

4. Những Bài Học Xương Máu

4.1. Đừng Over-Engineering

  • Startup 5 dev? Chỉ cần 1 file shared-components.tsx là đủ.
  • Công ty 50+ dev? Cần chia thành multi-package với lịch release rõ ràng.

4.2. Accessibility Phải Được Ưu Tiên Ngay Từ Đầu

  • Mọi component phải work với keyboard + screen reader.
  • Test bằng Axe hoặc Lighthouse.

4.3. Design System Là Một Sản Phẩm Sống

  • Cần dedicated team (dù chỉ 1 người part-time) để trả lời câu hỏi:
    • "Component này dùng sao?"
    • "Làm sao thêm variant mới?"

Kết Luận: Design System Là Chiến Lược, Không Phải Công Cụ

Khi UI trở thành sản phẩm, bạn không còn là "thợ code giao diện", mà là người xây dựng nền tảng để cả team cùng phát triển.

Bạn đã sẵn sàng?

  1. Thử chuyển 1 màu trong app thành design token hôm nay.
  2. Setup Storybook cho 3 components đầu tiên.

"Một Design System tốt không làm bạn code nhanh hơn ngay lập tức, nhưng nó giúp bạn không bao giờ phải code lại từ đầu."

Bình luận

Bài viết tương tự

- vừa được xem lúc

Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 30)

. Hello xin chào mọi người, mình đã trở lại và tiếp tục với phần 30 của series về Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết. Bắt đầu thôi nào.

0 0 54

- vừa được xem lúc

5 câu hỏi phỏng vấn Frontend giúp bạn tự tin hơn khi sử dụng bất đồng bộ trong Javascript

Một trong những điều khó khăn khi học Javascript là promises. Chúng không dễ hiểu và có thể cần một vài hướng dẫn và một thời gian kha khá để vận dụng chúng.

0 0 112

- vừa được xem lúc

Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 31)

Hello xin chào mọi người, mình đã trở lại và tiếp tục với phần 31 của series về Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết. Bắt đầu thôi nào.

0 0 52

- vừa được xem lúc

Những lý do khiến mình thích CSS custom properties hơn SASS variables?

Halo các bạn,. Lại là mình với một bài post liên quan tới chủ đề Front-end đây Mình còn nhớ hồi mình bắt đầu tìm hiểu và bị SASS lôi cuốn, mình đã nghĩ rằng mình sẽ chẳng bao giờ cần dùng đụng tới CSS

0 0 93

- vừa được xem lúc

Usability là gì? Những lưu ý khi thiết kế Usability

Usability là một yếu tố quan trọng trong sự thành bại của sản phẩm. Thật đáng tiếc khi sản phẩm làm ra ưu việt về tính năng, nhưng lại không được người dùng tiếp nhận, đơn giản chỉ vì khó sử dụng.

0 0 43

- vừa được xem lúc

7 Repos cho Front-End mà chính bạn còn không biết là bạn cần nó

. Những repos chẳng mấy khi được nhắc đến nhưng lại giúp bạn build mọi thứ nhanh hơn và tốt hơn nhiều. Chúng ta đang sống trong một thời đại có sẵn các công cụ và tài nguyên hoàn hảo, chúng chỉ cách t

0 0 45