Zephyr Events: Event emitter TypeScript siêu nhẹ (2KB) khắc phục lỗi điều kiện tranh chấp

07 tháng 4, 2026·2 phút đọc

Zephyr Events là một thư viện event emitter TypeScript nhỏ gọn chỉ 2KB, giải quyết vấn đề race condition mà nhiều lập trình viên thường bỏ qua. Thư viện sử dụng cơ chế lặp dựa trên snapshot để đảm bảo an toàn khi đăng ký hoặc hủy đăng ký listener trong quá trình phát sự kiện, đồng thời cung cấp chế độ nhanh hơn 82% nếu không cần tính năng an toàn này.

Zephyr Events: Event emitter TypeScript siêu nhẹ (2KB) khắc phục lỗi điều kiện tranh chấp

Zephyr Events là một thư viện mới được thiết kế để khắc phục một lỗi phổ biến nhưng ít được để ý trong các thư viện xử lý sự kiện (event emitter) hiện nay như EventEmitter3, EventEmitter tích hợp sẵn của Node.js hay mitt.

Vấn đề cốt lõi nằm ở việc: nếu một trình xử lý (handler) tự gọi hàm hủy đăng ký (off) trong quá trình sự kiện đang được phát ra (emit), trình xử lý tiếp theo trong danh sách sẽ bị bỏ qua. Điều này có thể dẫn đến các lỗi logic khó phát hiện trong ứng dụng.

Cơ chế hoạt động an toàn và hiệu quả

Zephyr Events giải quyết vấn đề này bằng cách sử dụng phương pháp lặp dựa trên snapshot (bản chụp). Nhờ đó, các handler có thể đăng ký, hủy đăng ký hoặc xóa toàn bộ listener ngay trong lúc emit mà không gây ra bất kỳ tác dụng phụ nào.

Tuy nhiên, nếu ứng dụng của bạn không yêu cầu tính độ an toàn tuyệt đối này, Zephyr Events cung cấp chế độ zephyrEventsFast. Theo tác giả, chế độ này có thể tăng tốc độ xử lý lên tới 82% so với chế độ mặc định.

Các tính năng chính

  • Kích thước siêu nhỏ: Chỉ 1.9KB, không phụ thuộc vào thư viện bên ngoài (zero dependencies) và hỗ trợ tree-shaking.
  • Hỗ trợ TypeScript mạnh mẽ: Full generics với các chữ ký handler nghiêm ngặt.
  • Tính năng linh hoạt: Hỗ trợ wildcard listeners, bản đồ handler chia sẻ và các hàm hủy đăng ký (unsubscribe functions).
  • Đa nền tảng: Hỗ trợ ESM, CommonJS và UMD builds.

Ví dụ sử dụng

import zephyrEvents from 'zephyr-events';

type Events = {
  'user:login': { id: number; name: string }
  'error': Error
}

const emitter = zephyrEvents<Events>();
const unsub = emitter.on('user:login', (user) => {
  console.log(`Welcome, ${user.name}`);
});

emitter.emit('user:login', { id: 1, name: 'Alice' });
unsub();

Thư viện hiện đã có sẵn trên NPM. Tác giả rất mong nhận được phản hồi từ cộng đồng lập trình viên về thiết kế API cũng như việc chia tách chế độ an toàn (safe) và chế độ nhanh (fast) có thực sự hợp lý hay không.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗