Tận dụng TypeScript và Storybook để phát triển component chuẩn cho React Web và React Native

15 lượt xem · 2 trả lời

1. 18:35 11/10/2026
Khi xây dựng các ứng dụng React đa nền tảng, việc duy trì một codebase nhất quán và có thể tái sử dụng là điều vô cùng quan trọng. TypeScript mang lại cho bạn sự an toàn về kiểu dữ liệu, trong khi Storybook cung cấp một môi trường kể chuyện giao diện người dùng độc lập. Khi kết hợp hai công cụ này, bạn có thể định nghĩa các component một cách rõ ràng, thử nghiệm chúng một cách dễ dàng và đảm bảo chúng hoạt động trơn tru trên cả web và thiết bị di động. **Tại sao TypeScript lại quan trọng** - **Kiểu dữ liệu rõ ràng**: Các props, events và trạng thái được định nghĩa rõ ràng giúp giảm thiểu các lỗi do truyền sai tham số, đặc biệt khi một component được chia sẻ giữa các nền tảng. - **Tự động hoàn thành tốt hơn**: IDE có thể cung cấp các gợi ý chính xác, giúp quá trình phát triển trở nên nhanh chóng và hiệu quả. - **Kiểm tra nghiêm ngặt**: Quá trình biên dịch TypeScript sẽ phát hiện các vấn đề trước khi mã được thực thi, giúp bạn tránh được nhiều lỗi khó khăn trong quá trình chạy. **Các bước thiết lập** 1. **Tạo một thư viện components dùng chung** - Sử dụng một dự án riêng biệt (ví dụ: `my-lib`) với cấu trúc thư mục rõ ràng (`src/components/`). - Xuất các component dưới dạng ESM hoặc CommonJS, tùy thuộc vào mục tiêu của bạn. 2. **Viết interface với TypeScript** ```typescript export interface ButtonProps { label: string; onClick?: () => void; variant?: 'primary' | 'secondary'; } ``` Việc định nghĩa interface một cách rõ ràng giúp bạn dễ dàng tái sử dụng component trên cả hai nền tảng. 3. **Tích hợp Storybook** - Cài đặt `@storybook/react` và `@storybook/react-native` trong thư viện. - Tạo tệp `.storybook/main.ts` để trỏ đến các câu chuyện trên cả hai nền tảng. 4. **Tạo các câu chuyện cho từng nền tảng** - Sử dụng thư mục `stories/` và đặt tên cho các tệp theo quy ước `Button.web.stories.tsx` và `Button.native.stories.tsx`. - Trong mỗi câu chuyện, bạn có thể điều chỉnh các tham số (ví dụ: `decorators` cho theme của web so với theme của thiết bị di động). 5. **Thêm các tham số kiểm tra** - Sử dụng `args` để xác định các giá trị props khác nhau. - Thêm các câu chuyện kiểm tra trạng thái (ví dụ: disabled, loading) để đảm bảo component phản ứng một cách chính xác. **Mẹo thực tế** - **Tận dụng các loại trích xuất từ props**: Sử dụng `ExtractProp` để lấy các props chỉ dành cho web (ví dụ: `HTMLAttributes<HTMLButtonElement>`) và các props chỉ dành cho thiết bị di động (ví dụ: `PressableProps`) mà không gây xung đột. - **Sử dụng các loại chung**: Tạo một tệp `types.ts` chung để định nghĩa các loại trạng thái, theme hoặc callback có thể được sử dụng trên cả hai nền tảng. - **Tự động hóa kiểm tra kiểu dữ liệu**: Thêm `tsc --noEmit` vào script `package.json` của thư viện để đảm bảo không có lỗi kiểu dữ liệu nào tồn tại trong quá trình xây dựng. - **Tài liệu trong Storybook**: Sử dụng ghi chú để ghi lại cách sử dụng, các biến thể có thể có và bất kỳ lưu ý đặc biệt nào về nền tảng. **Lợi ích đạt được** - **Tiết kiệm thời gian**: Các component được phát triển một lần và có thể sử dụng trên cả hai nền tảng, giúp giảm thời gian viết mã. - **Tính năng nhất quán**: Các theme, hành vi và trạng thái được đồng bộ hóa, mang lại trải nghiệm người dùng thống nhất. - **Quy trình phát triển nhanh hơn**: Storybook cho phép bạn xem, thử nghiệm và ghi lại các component mà không cần khởi động ứng dụng, giúp quá trình phát triển trở nên nhanh chóng. - **Tương lai bền vững**: TypeScript bảo vệ mã nguồn khỏi các thay đổi trong tương lai, giúp thư viện trở nên đáng tin cậy cho các nhóm lớn. Bằng cách kết hợp TypeScript và Storybook, bạn có thể xây dựng một hệ sinh thái component mạnh mẽ, sẵn sàng cho tương lai, giúp các nhóm phát triển React Web và React Native làm việc hiệu quả hơn và mang lại các sản phẩm chất lượng cao hơn cho người dùng.
0 Facebook
2. 15:22 14/10/2026
Trả lời Quản Trị Viên Khi xây dựng các ứng dụng React đa nền tảng, việc duy trì một codebase nhất quán và có thể tái sử dụng là điều vô cùng q…
Bài viết rất hay, tổng hợp khá đầy đủ quy trình từ setup đến best practice. Mình đặc biệt đồng ý với việc tách `types.ts` chung và dùng `ExtractProp` để handle riêng `HTMLAttributes` vs `PressableProps` – đây là điểm dễ gây rối nhất khi share component cross-platform. Thực tế team mình đang áp dụng cách này cho design system nội bộ. Một vấn đề mình gặp là config Storybook cho React Native (đặc biệt là `@storybook/react-native`) đôi khi conflict với Metro bundler khi chạy song song với web, nhất là ở phần `babel`/`webpack` config custom. Bạn có kinh nghiệm xử lý case này không, hoặc có mẹo nào để debug story native nhanh hơn (ví dụ dùng `storybook-addon-react-native-web` hay chạy riêng process) không? Cảm ơn bạn đã chia sẻ chi tiết!
0
3. 00:55 26/10/2026
Trả lời Clara King Bài viết rất hay, tổng hợp khá đầy đủ quy trình từ setup đến best practice. Mình đặc biệt đồng ý với việc tách `types.ts…
Vụ conflict giữa Storybook RN và Metro thường đến từ việc cả hai cùng đọc `babel.config.js` và dùng cache. Mình thường tách config Storybook native ra file riêng, chỉ extend phần babel chung; không custom webpack cho native; chạy web và native ở hai terminal/process riêng, tránh cùng port. Khi đổi config thì xóa cache Metro rồi start lại. Với `storybook-addon-react-native-web`, nó hữu ích để preview nhanh trên web nhưng không thay thế test native thật, và đôi khi làm rối phần resolve module. Để debug story native nhanh, mình thử một story tối giản trước, bật log Metro, kiểm tra story index và xem lỗi transform babel trước khi nghi component. Nếu team có design system, mình ưu tiên hai Storybook riêng cho web/native, chỉ chia sẻ `types` và stories qua package chung. Bạn đang gặp conflict ở bước transform
0
Vui lòng đăng nhập để tham gia trả lời chủ đề này.
Điều hướng nhanh

Bạn muốn khám phá điều gì?

Tìm chủ đề, bài viết hoặc đi thẳng đến một khu vực của cộng đồng.

Esc để đóng Ctrl K để mở lại