- "The missing Standard Library for TypeScript"
- Được thiết kế để giúp tạo các chương trình đồng bộ/bất đồng bộ phức tạp một cách dễ dàng
- Giúp mã nguồn có tính kết hợp, tái sử dụng và dễ kiểm thử hơn
- Maximum Type-Safety (bao gồm cả xử lý lỗi)
- Cung cấp nhiều thư viện đa dạng
- Cung cấp clustering & workflow (phiên bản alpha)
- Khả năng tương thích rộng
- Node, Deno, Bun, Cloudflare Workers, Chrome
- React, Solid.JS, Vite, Next.JS, Tauri
- Các đặc điểm chính
- Đồng thời (Concurrency): Có thể hiện thực các ứng dụng có khả năng mở rộng cao và độ trễ cực thấp thông qua mô hình đồng thời dựa trên Fiber
- Tính kết hợp (Composability): Có thể xây dựng phần mềm dễ bảo trì, dễ đọc và linh hoạt bằng các thành phần nhỏ, có thể tái sử dụng
- An toàn tài nguyên (Resource Safety): Có thể quản lý an toàn việc cấp phát và giải phóng tài nguyên ngay cả khi chương trình thất bại
- An toàn kiểu (Type Safety): Tập trung vào suy luận kiểu và an toàn kiểu, giúp tận dụng tối đa hệ thống kiểu của TypeScript
- Xử lý lỗi (Error Handling): Có thể xử lý lỗi theo cách có cấu trúc và đáng tin cậy bằng các tính năng xử lý lỗi tích hợp sẵn
- Bất đồng bộ (Asynchronicity): Có thể viết sao cho mã nguồn trông giống nhau dù là đồng bộ hay bất đồng bộ
- Khả năng quan sát (Observability): Có thể dễ dàng gỡ lỗi và giám sát việc thực thi chương trình thông qua khả năng truy vết đầy đủ
Vì sao là Effect?
- Lập trình vốn khó
- Khi tạo thư viện và ứng dụng, chúng ta dùng nhiều công cụ để quản lý độ phức tạp
- Effect đưa ra một cách tư duy mới về lập trình TypeScript
- Thông qua các công cụ trong hệ sinh thái Effect, có thể xây dựng ứng dụng và thư viện tốt hơn
- Nhờ đó, có thể hiểu rõ hơn về ngôn ngữ TypeScript và hệ thống kiểu, đồng thời làm cho chương trình đáng tin cậy hơn và dễ bảo trì hơn.
Mẫu hình Effect
- Trong mã TypeScript thông thường, người ta giả định rằng hàm sẽ либо thành công, либо ném ngoại lệ
- Ví dụ: hàm
divide sẽ ném ngoại lệ nếu chia cho 0
- Chỉ nhìn vào kiểu thì không thể biết hàm này có thể ném ngoại lệ hay không
- Khi codebase có hàng trăm, hàng nghìn hàm, vấn đề này càng lớn
- Rất dễ quên xử lý ngoại lệ và cũng khó quản lý
- Trình biên dịch TypeScript là tuyến phòng thủ đầu tiên trước bug, lỗi miền nghiệp vụ và độ phức tạp nói chung
Áp dụng mẫu hình Effect
- Insight cốt lõi của Effect là có thể dùng hệ thống kiểu để theo dõi không chỉ giá trị thành công mà còn cả lỗi và "context"
- Ví dụ: phiên bản Effect của hàm
divide không ném ngoại lệ mà truyền lỗi cho bên gọi
- Cung cấp các tính năng để quản lý lỗi và giá trị thành công
- Nhờ theo dõi context, có thể cung cấp thêm thông tin cho hàm mà không cần truyền mọi đối số
- Ví dụ: trong quá trình kiểm thử, có thể thay thế implementation thực của dịch vụ bên ngoài bằng mock object
import { Effect } from "effect"
const divide = (a: number, b: number): Effect.Effect<number, Error, never> =>
b === 0
? Effect.fail(new Error("Cannot divide by zero"))
: Effect.succeed(a / b)
Hệ sinh thái Effect
- Insight độc đáo của Effect kết hợp với các công cụ khác đã tạo nên một hệ sinh thái thư viện phong phú, giúp dễ dàng xây dựng các ứng dụng phức tạp
- Những điều từng có vẻ bất khả thi trước đây nay đã trở nên bình thường
- Hệ sinh thái Effect đang phát triển rất nhanh và có thể xem trên GitHub của Effect
Đừng phát minh lại bánh xe
- Trong mã ứng dụng TypeScript, người ta thường giải quyết lặp đi lặp lại cùng một vấn đề
- Việc tương tác với dịch vụ bên ngoài, hệ thống tệp và cơ sở dữ liệu là vấn đề chung của mọi nhà phát triển ứng dụng
- Effect cung cấp một hệ sinh thái thư viện phong phú với các giải pháp được chuẩn hóa cho những vấn đề này
- Không cần cài nhiều dependency, Effect có thể giải quyết nhiều vấn đề cùng lúc
Giải quyết vấn đề thực tiễn
- Effect lấy cảm hứng từ Scala và Haskell.
- Tuy nhiên, mục tiêu của Effect là cung cấp một bộ công cụ thực tiễn để giải quyết các vấn đề hằng ngày gặp phải khi xây dựng ứng dụng và thư viện TypeScript
Học một cách thú vị
- Việc học Effect rất thú vị
- Nhiều nhà phát triển đang dùng Effect trong công việc thực tế để giải quyết các vấn đề thật
- Có thể bắt đầu bằng cách dùng trước một phần của hệ sinh thái Effect, rồi dần dần tận dụng thêm nhiều công cụ hơn
- Ban đầu, các khái niệm của Effect có thể hơi lạ, nhưng nếu dành thời gian đọc tài liệu và hiểu các khái niệm cốt lõi thì sau này sẽ rất hữu ích khi dùng các công cụ nâng cao hơn
- Cộng đồng Effect luôn sẵn sàng hỗ trợ việc học và phát triển. Hãy tham khảo Discord hoặc GitHub
3 bình luận
Có vẻ nó đang đi theo quỹ đạo khá giống với những điểm cốt lõi mà Rust có.
Có lẽ phải dùng thêm mới biết rõ, nhưng so với fp-ts thì dùng thoải mái hơn nhiều.
fp-tssẽ không phát triển bản 3.0 nữa và đã quyết định gia nhậpeffect.Nếu đang dùng
fp-ts, bạn nên cân nhắceffect.https://x.com/MichaelArnaldi/status/1626975031048773635
https://effect.website/docs/other/fp-ts