Giới thiệu về Valibot
Nếu bạn đã tìm hiểu về Valibot, có thể bạn đã thấy rằng hầu hết các tài liệu chỉ nói rằng nó "nhẹ hơn và nhanh hơn" nhưng rất ít giải thích về cách hoặc khi nào nên sử dụng nó. Bài viết này sẽ giúp bạn hiểu rõ hơn về Valibot, cách thức hoạt động của nó và những lợi ích mà nó mang lại so với các thư viện khác như Zod, Yup, hay Joi.
Một số điều cần lưu ý
Trước khi đi sâu vào nội dung, hãy cùng điểm qua một số thông tin nhanh về Valibot:
- Valibot là thư viện xác thực dựa trên lập trình hàm.
- Thiết kế của nó dẫn đến kích thước gói nhỏ hơn, hiệu suất nhanh hơn, và dễ dàng kiểm thử.
- Nếu bạn đã từng sử dụng Zod, Yup hoặc Joi, sự khác biệt nằm ở chỗ cách xác thực được xây dựng dựa trên các hàm thuần túy và sự kết hợp thay vì các đối tượng và chuỗi phương thức.
Valibot dựa vào nguyên tắc lập trình hàm
Thư viện xác thực dữ liệu Valibot dựa rất nhiều vào các nguyên tắc lập trình hàm. Nó được thiết kế để kết hợp các hàm thuần túy, độc lập, nhỏ gọn để xây dựng và thực thi các chuỗi xác thực và chuyển đổi.
Nguyên tắc lập trình hàm trong Valibot
Dưới đây là cách Valibot áp dụng các khái niệm cốt lõi của lập trình hàm:
1. Các hàm thuần túy nhỏ gọn
API của Valibot được thiết kế xung quanh nhiều hàm nhỏ, với một mục đích duy nhất. Thay vì một đối tượng lớn chứa nhiều phương thức, Valibot cung cấp các hàm độc lập như string(), minLength(), email(), và trim().
javascript
// Cách tiếp cận của Zod - các phương thức trên đối tượng
const schema = z.string().email().min(5);
// Cách tiếp cận của Valibot - hàm kết hợp
const schema = pipe(string(), email(), minLength(5));
Mỗi hàm thực hiện một nhiệm vụ và thực hiện tốt điều đó. string() xác thực rằng một cái gì đó là chuỗi. email() xác thực định dạng email. minLength() kiểm tra độ dài tối thiểu. Chúng không biết hoặc quan tâm đến nhau - chúng là các hàm thuần túy nhận đầu vào và trả về đầu ra đã được xác thực (hoặc ném ra lỗi).
2. Kết hợp hàm và chuỗi dữ liệu
Thay vì chuỗi phương thức, Valibot sử dụng hàm pipe() để kết hợp nhiều hành động xác thực.
javascript
import { pipe, string, minLength, email } from 'valibot';
const LoginEmailSchema = pipe(
string(),
minLength(1, 'Vui lòng nhập email của bạn'),
email('Địa chỉ email không hợp lệ')
);
Trong ví dụ này, các hàm string(), minLength(), và email() được truyền vào hàm pipe(). Dữ liệu được xác thực sẽ chảy qua các hàm này, một cách nhất quán và có thể dự đoán.
3. Tính bất biến
Khi Valibot chuyển đổi dữ liệu (ví dụ, sử dụng hàm trim()), nó không thay đổi đầu vào ban đầu. Thay vào đó, nó trả về một giá trị mới. Nguyên tắc bất biến này đảm bảo rằng:
- Dữ liệu gốc của bạn không bao giờ bị thay đổi một cách vô tình
- Các hàm có thể dự đoán - cùng một đầu vào luôn tạo ra cùng một đầu ra
- Tác động phụ được giảm thiểu
- Mã dễ dàng kiểm thử và gỡ lỗi
Tại sao phương pháp mô-đun này lại có nhiều lợi ích
Bây giờ chúng ta đã hiểu rõ hơn về cách mà Valibot áp dụng lập trình hàm, hãy xem lý do tại sao nó tạo ra những lợi thế rõ ràng.
Tree-shaking: Cuộc cách mạng về kích thước gói
Vì mỗi hàm là một mô-đun riêng biệt, một trình đóng gói có thể loại bỏ mã của bạn, xóa bỏ bất kỳ hàm xác thực nào mà bạn không thực sự sử dụng. Đây là lý do chính cho kích thước gói nhỏ bé nổi tiếng của Valibot.
Khả năng kiểm thử: Mỗi hàm độc lập dễ dàng kiểm thử
Mỗi hàm xác thực có thể được kiểm thử một cách độc lập. Điều này góp phần vào độ phủ kiểm thử cao và độ tin cậy của thư viện. Bạn có thể xác minh từng phần của logic xác thực một cách độc lập, giúp dễ dàng phát hiện và khắc phục lỗi.
Hiệu suất: Lời gọi hàm so với tìm kiếm phương thức
Các động cơ JavaScript được tối ưu hóa cao cho các lời gọi hàm. Khi bạn viết pipe(string(), email()), động cơ có thể tối ưu hóa các lời gọi hàm một cách tích cực hơn.
Tính tái sử dụng thông qua sự kết hợp
Phương pháp lập trình hàm làm cho các mẫu xác thực tái sử dụng trở nên tự nhiên. Bằng cách định nghĩa các hàm xác thực có thể tái sử dụng như các hàm kết hợp, bạn có thể dễ dàng thay đổi và mở rộng chúng trong các ngữ cảnh khác nhau.
Khi nào nên sử dụng Valibot
Valibot hoạt động tốt nhất trong các tình huống sau:
- Khi bạn quen thuộc với các mẫu lập trình hàm
- Khi kích thước gói và hiệu suất là ưu tiên hàng đầu
- Khi bạn cần logic xác thực có thể tái sử dụng cao
- Khi bạn làm việc trong môi trường TypeScript
Kết luận
Valibot không chỉ đơn thuần là "Zod nhưng nhỏ hơn." Nó là một cách tiếp cận hoàn toàn khác đối với xác thực dựa trên các nguyên tắc lập trình hàm. Kích thước gói nhỏ, hiệu suất tốt hơn, tích hợp TypeScript xuất sắc và các mẫu tái sử dụng đều bắt nguồn từ lựa chọn kiến trúc cốt lõi này. Bây giờ bạn đã hiểu tại sao những lợi ích này tồn tại và những đánh đổi mà chúng liên quan.