От mitt / nanoevents
mitt и nanoevents — это крохотные нетипизированные (или слабо типизированные) event emitters. Они плохо масштабируются с момента, когда у одного и того же события появляется больше одного обработчика, или когда обработчикам нужно читать состояние, или когда нужен debounce. Triggery — это то, что ты бы построил, если бы отнёсся к этим проблемам серьёзно.
Соответствие ментальных моделей
Заголовок раздела «Соответствие ментальных моделей»| mitt / nanoevents | Triggery |
|---|---|
emitter.on('foo', fn) | useAction(trigger, 'foo', fn) (или useEvent на стороне эмиттера) |
emitter.emit('foo', payload) | fireFoo(payload) из useEvent(trigger, 'foo') |
emitter.off('foo', fn) | Автоматически — cleanup при размонтировании компонента |
| Нетипизированный payload | Schema['events']['foo'], проверяется во время компиляции |
| Несколько обработчиков на событие | Несколько реакторов, регистрирующих одно действие; или несколько триггеров, слушающих одно событие |
Ручной debounce/throttle вокруг emit | actions.debounce(ms).foo?.(p) |
| Один глобальный emitter | Скоупится через <TriggerScope id="…"> для multi-tenant деревьев |
Паттерн 1 — базовая типизированная шина
Заголовок раздела «Паттерн 1 — базовая типизированная шина»Файл триггера перечисляет весь fan-out в одном месте — не надо охотиться за bus.on('cart:added' по кодовой базе.
Паттерн 2 — fan-out с условной маршрутизацией
Заголовок раздела «Паттерн 2 — fan-out с условной маршрутизацией»Личность пользователя один раз регистрируется как условие фичей, владеющей авторизацией; триггер корзины читает её лениво.
Паттерн 3 — debounce вокруг emit
Заголовок раздела «Паттерн 3 — debounce вокруг emit»Таймером владеет рантайм. Тесты могут гонять время детерминированно через fakeScheduler.
Паттерн 4 — скоупинг шины на тенанта
Заголовок раздела «Паттерн 4 — скоупинг шины на тенанта»У mitt нет понятия скоупа — для multi-tenant или micro-frontend установок обычно создают по одной шине на тенанта и пропихивают её через context. Triggery решает это через <TriggerScope id="…">:
Объявление триггера добавляет scope: 'tenant-a' (или 'tenant-b'), и рантайм держит реестры раздельными. См. Скоупы.